Exemplo n.º 1
0
        public SqlObject FindSqlObject(Token previousToken, Token currentToken)
        {
            SqlObject sqlObject = null;

            if (previousToken != null)
            {
                if (previousToken.Type == TokenType.KeyWord)
                {
                    var value = previousToken.Value.ToLower();
                    var name  = currentToken != null
                        ? currentToken.Value
                        : null;

                    switch (value)
                    {
                    case "use":
                    case "database":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Database, value);
                        break;

                    case "delete":
                    case "insert":
                    case "update":
                    case "into":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View, name);
                        break;

                    case "from":
                    case "join":
                        sqlObject = new SqlObject(null, null,
                                                  SqlObjectTypes.Table | SqlObjectTypes.View | SqlObjectTypes.Function, name);
                        break;

                    case "table":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Table, name);
                        break;

                    case "exec":
                    case "proc":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Procedure, name);
                        break;

                    case "function":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Function, null);
                        break;

                    case "trigger":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Trigger, null);
                        break;

                    case "view":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.View, null);
                        break;

                    case "index":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Index, null);
                        break;

                    case "where":
                        //
                        if (currentToken != null)
                        {
                            sqlObject = GetSqlObject(currentToken.Value);
                        }

                        if (sqlObject == null)
                        {
                            var index = _allTables.LastIndexOf(t => t.Index < previousToken.Index - 1);
                            if (index >= 0)
                            {
                                var table = _allTables[index];
                                sqlObject = new SqlObject(table.Name, null, SqlObjectTypes.Column, name);
                            }
                        }

                        break;

                    default:
                        break;
                    }

                    if (sqlObject == null && currentToken != null)
                    {
                        sqlObject = GetSqlObject(currentToken.Value);
                    }
                }
                else if (previousToken.Type == TokenType.OperatorOrPunctuator)
                {
                    if (previousToken.Value == "=" && previousToken.Index > 0)
                    {
                        if (currentToken != null)
                        {
                            switch (currentToken.Type)
                            {
                            case TokenType.KeyWord:
                                sqlObject = GetSqlObject(currentToken.Value);
                                break;

                            default:
                                sqlObject = GetValue(previousToken);
                                break;
                            }
                        }
                        else
                        {
                            sqlObject = GetValue(previousToken);
                        }
                    }
                    else if (currentToken != null && currentToken.Type == TokenType.KeyWord &&
                             currentToken.Value.Contains('.'))
                    {
                        sqlObject = GetSqlObject(currentToken.Value);
                    }
                }
            }

            return(sqlObject);
        }
Exemplo n.º 2
0
        public SqlObject FindSqlObject(int index)
        {
            SqlObject sqlObject = null;

            if (index >= 1)
            {
                var prev = Tokens[index - 1];

                if (prev.Type == TokenType.KeyWord)
                {
                    var    value = prev.Value.ToLower();
                    string name  = null;

                    if (index < Tokens.Count)
                    {
                        var token = Tokens[index];
                        name = token.Value;
                    }

                    switch (value)
                    {
                    case "use":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Database, null);
                        break;

                    case "delete":
                    case "insert":
                    case "into":
                    case "update":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Table | SqlObjectTypes.View, name);
                        break;

                    case "from":
                    case "join":
                        sqlObject = new SqlObject(null, null,
                                                  SqlObjectTypes.Table | SqlObjectTypes.View | SqlObjectTypes.Function, name);
                        break;

                    case "table":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Table, name);
                        break;

                    case "exec":
                    case "proc":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Procedure, name);
                        break;

                    case "function":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Function, null);
                        break;

                    case "trigger":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Trigger, null);
                        break;

                    case "view":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.View, null);
                        break;

                    case "index":
                        sqlObject = new SqlObject(null, null, SqlObjectTypes.Index, null);
                        break;

                    case "where":
                        index = _allTables.LastIndexOf(t => t.Index < index - 1);
                        if (index >= 0)
                        {
                            var table = _allTables[index];
                            sqlObject = new SqlObject(table.Name, null, SqlObjectTypes.Column, name);
                        }

                        break;

                    default:
                        break;
                    }

                    if (sqlObject == null && index >= 0 && index < Tokens.Count)
                    {
                        var token = Tokens[index];
                        sqlObject = GetSqlObject(token.Value);
                    }
                }
                else if (prev.Type == TokenType.OperatorOrPunctuator)
                {
                    var tokenAfterOperator = index < Tokens.Count
                        ? Tokens[index]
                        : null;
                    if (tokenAfterOperator != null && tokenAfterOperator.Value.Contains('.'))
                    {
                        sqlObject = GetSqlObject(tokenAfterOperator.Value);
                    }
                    else if (prev.Value == "=" && index >= 2)
                    {
                        var tokenBeforeOperator = Tokens[index - 2];
                        sqlObject = new SqlObject(tokenBeforeOperator.Value, null, SqlObjectTypes.Value, null);
                    }
                }
            }

            return(sqlObject);
        }