Exemplo n.º 1
0
        /// <summary>
        /// Returns table by use command.
        /// </summary>
        /// <param name="usecommand">Use command.</param>
        public MochaTableResult GetTable(string usecommand, bool from)
        {
            MochaColumn GetColumn(string cmd, IList <MochaColumn> cols)
            {
                string decomposeBrackets(string value)
                {
                    int dex;

                    if ((dex = value.IndexOf('(')) != -1)
                    {
                        return(value.Substring(dex + 1, value.Length - dex - 2));
                    }
                    return(value);
                }

                string name = Mhql_AS.GetAS(ref cmd);

                if (Mhql_GRAMMAR.UseFunctions.MatchKey(cmd))
                {
                    MochaColumn column = new MochaColumn();
                    column.MHQLAsText = name;
                    column.Tag        =
                        Mhql_GRAMMAR.UseFunctions.GetValueByMatchKey(cmd);
                    if (column.Tag != "COUNT")
                    {
                        column.Description =
                            Mhql_GRAMMAR.GetIndexOfColumn(decomposeBrackets(cmd), cols, from).ToString();
                    }
                    return(column);
                }
                else
                {
                    string colname = cmd.StartsWith("$") ? cmd.Substring(1).Trim() : cmd;
                    IEnumerable <MochaColumn> result = cols.Where(x => x.Name == colname);
                    if (!result.Any())
                    {
                        throw new Exception($"Could not find a column with the name '{cmd}'!");
                    }
                    MochaColumn column = result.First();
                    column.Tag        = colname != cmd ? "$" : null;
                    column.MHQLAsText = name;
                    return(column);
                }
            }

            List <MochaColumn> columns     = new List <MochaColumn>();
            MochaTableResult   resulttable = new MochaTableResult();

            if (from)
            {
                int                dex       = Mhql_FROM.GetIndex(ref usecommand);
                string             tablename = usecommand.Substring(dex + 5).Trim();
                List <string>      parts     = Mhql_LEXER.SplitUseParameters(usecommand.Substring(0, dex));
                List <MochaColumn> _columns  = Tdb.GetColumns(tablename);
                if (parts.Count == 1 && parts[0].Trim() == "*")
                {
                    columns.AddRange(_columns);
                }
                else
                {
                    if (parts[0].TrimStart().StartsWith("$") &&
                        parts[0].TrimStart().Substring(1).TrimStart().StartsWith($"{Mhql_LEXER.LBRACE}"))
                    {
                        throw new InvalidOperationException("Cannot be used with subquery FROM keyword!");
                    }
                    for (int index = 0; index < parts.Count; ++index)
                    {
                        columns.Add(GetColumn(parts[index].Trim(), _columns));
                    }
                }
            }
            else
            {
                List <string> parts = Mhql_LEXER.SplitUseParameters(usecommand);
                for (int index = 0; index < parts.Count; ++index)
                {
                    string callcmd = parts[index].Trim();
                    if (callcmd == "*")
                    {
                        List <MochaTable> tables = Tdb.GetTables();
                        for (int tindex = 0; tindex < tables.Count; ++tindex)
                        {
                            columns.AddRange(tables[tindex].Columns);
                        }
                        continue;
                    }
                    int obrace = callcmd.IndexOf(Mhql_LEXER.LBRACE);
                    if (obrace != -1)
                    {
                        IList <MochaColumn> _cols = (new MochaDbCommand(Tdb).ExecuteScalar(Mhql_LEXER.RangeSubqueryBrace(
                                                                                               callcmd.Substring(obrace).Trim()))).Columns;
                        string mode =
                            callcmd.Substring(0, obrace).TrimStart().StartsWith("$") ?
                            "$" : string.Empty;
                        for (int cindex = 0; cindex < _cols.Count; ++cindex)
                        {
                            columns.Add(GetColumn($"{mode}{_cols[cindex].Name}", _cols));
                        }
                        continue;
                    }
                    if (callcmd.StartsWith("$"))
                    {
                        callcmd = callcmd.Substring(1).Trim();
                        List <MochaColumn> _cols = Tdb.GetColumns(callcmd);
                        for (int cindex = 0; cindex < _cols.Count; ++cindex)
                        {
                            columns.Add(GetColumn($"${_cols[cindex].Name}", _cols));
                        }
                        continue;
                    }

                    string[] callparts = Mhql_LEXER.SplitSubCalls(callcmd);
                    if (callparts.Length > 2)
                    {
                        throw new InvalidOperationException($"'{callcmd}' command is cannot processed!");
                    }
                    for (byte partindex = 0; partindex < callparts.Length; ++partindex)
                    {
                        callparts[partindex] = callparts[partindex].Trim();
                    }
                    List <MochaColumn> _columns = Tdb.GetColumns(callparts[0]);
                    if (callparts.Length == 1)
                    {
                        columns.AddRange(_columns);
                    }
                    else
                    {
                        columns.Add(GetColumn(callparts[1], _columns));
                    }
                }
            }
            resulttable.Columns = columns.ToArray();
            resulttable.SetRowsByDatas();
            return(resulttable);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Returns tables by select command.
        /// </summary>
        /// <param name="selectcommand">Select command.</param>
        public MochaArray <MochaTable> GetTables(string selectcommand)
        {
            var regex = new Regex(selectcommand);

            return(new MochaArray <MochaTable>(Tdb.GetTables(x => regex.IsMatch(x.Name))));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Returns table by use command.
        /// </summary>
        /// <param name="usecommand">Use command.</param>
        public MochaTableResult GetTable(string usecommand, bool from)
        {
            var columns     = new List <MochaColumn>();
            var resulttable = new MochaTableResult();

            if (from)
            {
                var dex       = usecommand.IndexOf("FROM", StringComparison.OrdinalIgnoreCase);
                var tablename = usecommand.Substring(dex + 4).TrimStart().TrimEnd();
                var parts     = usecommand.Substring(0, dex).Split(',');

                var table = Tdb.GetTable(tablename);

                if (parts.Length == 1 && parts[0].Trim() == "*")
                {
                    columns.AddRange(table.Columns);
                }
                else
                {
                    for (var index = 0; index < parts.Length; index++)
                    {
                        var callcmd = parts[index].Trim();
                        var name    = Mhql_AS.GetAS(ref callcmd);
                        var column  = table.Columns[callcmd];
                        column.Name = name;
                        columns.Add(column);
                    }
                }
            }
            else
            {
                var parts = usecommand.Split(',');
                for (var index = 0; index < parts.Length; index++)
                {
                    var callcmd = parts[index].Trim();
                    if (callcmd == "*")
                    {
                        var tables = Tdb.GetTables();
                        for (int tindex = 0; tindex < tables.Count; tindex++)
                        {
                            columns.AddRange(tables[tindex].Columns);
                        }
                        continue;
                    }

                    var callparts = callcmd.Split('.');
                    if (callparts.Length > 2)
                    {
                        throw new MochaException($"'{callcmd}' command is cannot processed!");
                    }
                    for (byte partindex = 0; partindex < callparts.Length; partindex++)
                    {
                        callparts[partindex] = callparts[partindex].Trim();
                    }
                    var table = Tdb.GetTable(callparts[0]);
                    if (callparts.Length == 1)
                    {
                        columns.AddRange(table.Columns);
                    }
                    else
                    {
                        var callp1 = callparts[1];
                        var name   = Mhql_AS.GetAS(ref callp1);
                        var column = table.Columns[callp1];
                        column.Name = name;
                        columns.Add(column);
                    }
                }
            }

            resulttable.Columns = columns.ToArray();
            resulttable.SetRowsByDatas();

            return(resulttable);
        }