Exemplo n.º 1
0
        /// <summary>
        /// Returns the list of tables for a given database
        /// </summary>
        /// <param name="dataBase"></param>
        /// <returns></returns>
        public static List <CompletionItem> GetTablesList(ParsedDataBase dataBase)
        {
            var output = new List <CompletionItem>();

            if (dataBase == null || dataBase.Tables == null || dataBase.Tables.Count == 0)
            {
                return(output);
            }
            output.AddRange(dataBase.Tables.Select(table => new CompletionItem {
                DisplayText = table.Name,
                SubString   = dataBase.LogicalName,
                Type        = CompletionType.Table,
                FromParser  = false,
                Ranking     = AutoComplete.FindRankingOfDatabaseItem(table.Name),
                Flag        = 0
            }).ToList());
            return(output);
        }
Exemplo n.º 2
0
 public static ParsedTable FindTableByName(string name, ParsedDataBase db)
 {
     return(db.Tables.Find(table => table.Name.EqualsCi(name)));
 }
Exemplo n.º 3
0
        /// <summary>
        /// This method parses the output of the .p procedure that exports the database info
        /// and fills _dataBases
        /// It then updates the parser with the new info
        /// </summary>
        private static void Read(string filePath)
        {
            if (!File.Exists(filePath))
            {
                return;
            }
            _dataBases.Clear();
            _sequences.Clear();

            var            defaultToken = new TokenEos(null, 0, 0, 0, 0);
            ParsedDataBase currentDb    = null;
            ParsedTable    currentTable = null;

            Utils.ForEachLine(filePath, null, (i, items) => {
                var splitted = items.Split('\t');
                switch (items[0])
                {
                case 'H':
                    // base
                    //#H|<Dump date ISO 8601>|<Dump time>|<Logical DB name>|<Physical DB name>|<Progress version>
                    if (splitted.Count() != 6)
                    {
                        return;
                    }
                    currentDb = new ParsedDataBase(
                        splitted[3],
                        splitted[4],
                        splitted[5],
                        new List <ParsedTable>());
                    _dataBases.Add(currentDb);
                    break;

                case 'S':
                    if (splitted.Count() != 3 || currentDb == null)
                    {
                        return;
                    }
                    _sequences.Add(new CompletionItem {
                        DisplayText = splitted[1],
                        Type        = CompletionType.Sequence,
                        SubString   = currentDb.LogicalName
                    });
                    break;

                case 'T':
                    // table
                    //#T|<Table name>|<Table ID>|<Table CRC>|<Dump name>|<Description>
                    if (splitted.Count() != 6 || currentDb == null)
                    {
                        return;
                    }
                    currentTable = new ParsedTable(
                        splitted[1],
                        defaultToken,
                        splitted[2],
                        splitted[3],
                        splitted[4],
                        splitted[5],
                        "", false,
                        new List <ParsedField>(),
                        new List <ParsedIndex>(),
                        new List <ParsedTrigger>()
                        , "", "");
                    currentDb.Tables.Add(currentTable);
                    break;

                case 'X':
                    // trigger
                    //#X|<Parent table>|<Event>|<Proc name>|<Trigger CRC>
                    if (splitted.Count() != 5 || currentTable == null)
                    {
                        return;
                    }
                    currentTable.Triggers.Add(new ParsedTrigger(
                                                  splitted[2],
                                                  splitted[3]));
                    break;

                case 'I':
                    // index
                    //#I|<Parent table>|<Index name>|<Primary? 0/1>|<Unique? 0/1>|<Index CRC>|<Fileds separated with %>
                    if (splitted.Count() != 7 || currentTable == null)
                    {
                        return;
                    }
                    var flag = splitted[3].Equals("1") ? ParsedIndexFlag.Primary : ParsedIndexFlag.None;
                    if (splitted[4].Equals("1"))
                    {
                        flag = flag | ParsedIndexFlag.Unique;
                    }
                    currentTable.Indexes.Add(new ParsedIndex(
                                                 splitted[2],
                                                 flag,
                                                 splitted[6].Split('%').ToList()));
                    break;

                case 'F':
                    // field
                    //#F|<Parent table>|<Field name>|<Type>|<Format>|<Order #>|<Mandatory? 0/1>|<Extent? 0/1>|<Part of index? 0/1>|<Part of PK? 0/1>|<Initial value>|<Desription>
                    if (splitted.Count() != 12 || currentTable == null)
                    {
                        return;
                    }
                    var flag2 = splitted[6].Equals("1") ? ParsedFieldFlag.Mandatory : ParsedFieldFlag.None;
                    if (splitted[7].Equals("1"))
                    {
                        flag2 = flag2 | ParsedFieldFlag.Extent;
                    }
                    if (splitted[8].Equals("1"))
                    {
                        flag2 = flag2 | ParsedFieldFlag.Index;
                    }
                    if (splitted[9].Equals("1"))
                    {
                        flag2 = flag2 | ParsedFieldFlag.Primary;
                    }
                    var curField = new ParsedField(
                        splitted[2],
                        splitted[3],
                        splitted[4],
                        int.Parse(splitted[5]),
                        flag2,
                        splitted[10],
                        splitted[11],
                        ParsedAsLike.None);
                    curField.Type = ParserHandler.ConvertStringToParsedPrimitiveType(curField.TempType, false);
                    currentTable.Fields.Add(curField);
                    break;
                }
            });
        }
Exemplo n.º 4
0
        /// <summary>
        /// This method parses the output of the .p procedure that exports the database info
        /// and fills _dataBases
        /// It then updates the parser with the new info
        /// </summary>
        private void Read(string filePath)
        {
            if (!File.Exists(filePath))
            {
                return;
            }
            _dataBases.Clear();
            _sequences.Clear();

            var            defaultToken = new TokenEos(null, 0, 0, 0, 0);
            ParsedDataBase currentDb    = null;
            ParsedTable    currentTable = null;

            Utils.ForEachLine(filePath, null, (i, items) => {
                var splitted = items.Split('\t');
                switch (items[0])
                {
                case 'H':
                    // base
                    //#H|<Dump date ISO 8601>|<Dump time>|<Logical DB name>|<Physical DB name>|<Progress version>
                    if (splitted.Length != 6)
                    {
                        return;
                    }
                    currentDb = new ParsedDataBase(
                        splitted[3],
                        splitted[4],
                        splitted[5],
                        new List <ParsedTable>(),
                        null);
                    _dataBases.Add(currentDb);
                    break;

                case 'S':
                    if (splitted.Length != 3 || currentDb == null)
                    {
                        return;
                    }
                    _sequences.Add(new ParsedSequence {
                        SeqName = splitted[1],
                        DbName  = currentDb.Name
                    });
                    break;

                case 'T':
                    // table
                    //#T|<Table name>|<Table ID>|<Table CRC>|<Dump name>|<Description>|<Hidden? 0/1>|<Frozen? 0/1>|<Table type>
                    if (splitted.Length != 9 || currentDb == null)
                    {
                        return;
                    }
                    ParsedTableType tblType;
                    if (!Enum.TryParse(splitted[8].Trim(), true, out tblType))
                    {
                        tblType = ParsedTableType.T;
                    }
                    currentTable = new ParsedTable(
                        splitted[1],
                        defaultToken,
                        tblType,
                        splitted[2],
                        splitted[3],
                        splitted[4],
                        splitted[5],
                        null,
                        new List <ParsedField>(),
                        new List <ParsedIndex>(),
                        new List <ParsedTrigger>(),
                        null,
                        splitted[6].Equals("1"),
                        splitted[7].Equals("1")
                        );
                    currentDb.Tables.Add(currentTable);
                    break;

                case 'X':
                    // trigger
                    //#X|<Parent table>|<Event>|<Proc name>|<Trigger CRC>
                    if (splitted.Length != 5 || currentTable == null)
                    {
                        return;
                    }
                    currentTable.Triggers.Add(new ParsedTrigger(
                                                  splitted[2],
                                                  splitted[3]));
                    break;

                case 'I':
                    // index
                    //#I|<Parent table>|<Index name>|<Primary? 0/1>|<Unique? 0/1>|<Index CRC>|<Fileds separated with %>
                    if (splitted.Length != 7 || currentTable == null)
                    {
                        return;
                    }
                    var flag = splitted[3].Equals("1") ? ParsedIndexFlag.Primary : ParsedIndexFlag.None;
                    if (splitted[4].Equals("1"))
                    {
                        flag = flag | ParsedIndexFlag.Unique;
                    }
                    currentTable.Indexes.Add(new ParsedIndex(
                                                 splitted[2],
                                                 flag,
                                                 splitted[6].Split('%').ToList()));
                    break;

                case 'F':
                    // field
                    //#F|<Parent table>|<Field name>|<Type>|<Format>|<Order #>|<Mandatory? 0/1>|<Extent? 0/x>|<Part of index? 0/1>|<Part of PK? 0/1>|<Initial value>|<Desription>
                    if (splitted.Length != 12 || currentTable == null)
                    {
                        return;
                    }
                    var flags = splitted[6].Equals("1") ? ParseFlag.Mandatory : 0;
                    if (splitted[8].Equals("1"))
                    {
                        flags = flags | ParseFlag.Index;
                    }
                    if (splitted[9].Equals("1"))
                    {
                        flags = flags | ParseFlag.Primary;
                    }
                    var curField = new ParsedField(
                        splitted[2],
                        splitted[3],
                        splitted[4],
                        int.Parse(splitted[5]),
                        flags,
                        splitted[10],
                        splitted[11],
                        ParsedAsLike.None);
                    curField.Extent        = int.Parse(splitted[7]);
                    curField.PrimitiveType = ParserVisitor.ConvertStringToParsedPrimitiveType(curField.TempPrimitiveType);
                    currentTable.Fields.Add(curField);
                    break;
                }
            });

            // copy the databases for each aliases
            foreach (var aliasCreation in GetAliasesList.Trim().Trim(';').Split(';'))
            {
                var splitted = aliasCreation.Split(',');
                if (splitted.Length == 2)
                {
                    if (!string.IsNullOrWhiteSpace(splitted[0]) && !string.IsNullOrWhiteSpace(splitted[1]))
                    {
                        var foundDb = FindDatabaseByName(splitted[1].Trim());
                        if (foundDb != null)
                        {
                            _dataBases.Add(new ParsedDataBase(
                                               splitted[0].Trim(),
                                               foundDb.PhysicalName,
                                               foundDb.ProgressVersion,
                                               foundDb.Tables,
                                               foundDb.Name));
                        }
                    }
                }
            }

            // sort all fields by primary then by name
            foreach (var dataBase in _dataBases)
            {
                foreach (var table in dataBase.Tables)
                {
                    table.Fields.Sort((x, y) => {
                        var compare = y.Flags.HasFlag(ParseFlag.Primary).CompareTo(x.Flags.HasFlag(ParseFlag.Primary));
                        if (compare != 0)
                        {
                            return(compare);
                        }
                        return(string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
                    });
                }
            }
        }