예제 #1
0
        public DdlStatementContext GetDdlStatementContext(string content, out SqlSyntaxError error)
        {
            error = null;

            RootContext rootContext = this.GetRootContext(content, out error);

            return(rootContext?.sqlStatements()?.sqlStatement()?.Select(item => item?.ddlStatement()).FirstOrDefault());
        }
예제 #2
0
        private SqlSyntaxError ParseSqlSyntaxError(SqlSyntaxError error, string definition)
        {
            foreach (SqlSyntaxErrorItem item in error.Items)
            {
                item.Text = definition.Substring(item.StartIndex, item.StopIndex - item.StartIndex + 1);
            }

            return(error);
        }
예제 #3
0
        public RootContext GetRootContext(string content, out SqlSyntaxError error)
        {
            error = null;

            MySqlParser parser = this.GetParser(content) as MySqlParser;

            SqlSyntaxErrorListener errorListener = this.AddParserErrorListener(parser);

            RootContext context = parser.root();

            error = errorListener.Error;

            return(context);
        }
예제 #4
0
        public override AnalyseResult AnalyseView(string content)
        {
            SqlSyntaxError error = null;

            DdlStatementContext ddlStatement = this.GetDdlStatementContext(content, out error);

            AnalyseResult result = new AnalyseResult()
            {
                Error = error
            };

            if (!result.HasError && ddlStatement != null)
            {
                ViewScript script = new ViewScript();

                CreateViewContext view = ddlStatement.createView();

                if (view != null)
                {
                    #region Name
                    this.SetScriptName(script, view.fullId());
                    #endregion

                    #region Statement

                    foreach (var child in view.children)
                    {
                        if (child is SimpleSelectContext select)
                        {
                            script.Statements.Add(this.ParseSelectStatement(select));
                        }
                    }

                    #endregion
                }

                this.ExtractFunctions(script, ddlStatement);

                result.Script = script;
            }

            return(result);
        }
        public override void SyntaxError(TextWriter output, IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
        {
            if (this.Error == null)
            {
                this.Error = new SqlSyntaxError();
            }

            if (offendingSymbol is CommonToken token)
            {
                SqlSyntaxErrorItem errorItem = new SqlSyntaxErrorItem();

                errorItem.StartIndex = token.StartIndex;
                errorItem.StopIndex  = token.StopIndex;
                errorItem.Line       = token.Line;
                errorItem.Column     = token.Column + 1;
                errorItem.Text       = token.Text;

                this.Error.Items.Add(errorItem);
            }

            base.SyntaxError(output, recognizer, offendingSymbol, line, charPositionInLine, msg, e);
        }
예제 #6
0
        public override AnalyseResult AnalyseProcedure(string content)
        {
            SqlSyntaxError error = null;

            DdlStatementContext ddlStatement = this.GetDdlStatementContext(content, out error);

            AnalyseResult result = new AnalyseResult()
            {
                Error = error
            };

            if (!result.HasError && ddlStatement != null)
            {
                RoutineScript script = new RoutineScript()
                {
                    Type = RoutineType.PROCEDURE
                };

                CreateProcedureContext proc = ddlStatement.createProcedure();

                if (proc != null)
                {
                    #region Name
                    this.SetScriptName(script, proc.fullId());
                    #endregion

                    #region Parameters
                    ProcedureParameterContext[] parameters = proc.procedureParameter();

                    if (parameters != null)
                    {
                        foreach (ProcedureParameterContext parameter in parameters)
                        {
                            Parameter parameterInfo = new Parameter();

                            UidContext uid = parameter.uid();

                            parameterInfo.Name = new TokenInfo(uid)
                            {
                                Type = TokenType.ParameterName
                            };

                            parameterInfo.DataType = new TokenInfo(parameter.dataType().GetText())
                            {
                                Type = TokenType.DataType
                            };

                            this.SetParameterType(parameterInfo, parameter.children);

                            script.Parameters.Add(parameterInfo);
                        }
                    }
                    #endregion

                    #region Body

                    this.SetScriptBody(script, proc.routineBody());

                    #endregion
                }

                this.ExtractFunctions(script, ddlStatement);

                result.Script = script;
            }

            return(result);
        }
예제 #7
0
        public override AnalyseResult AnalyseTrigger(string content)
        {
            SqlSyntaxError error = null;

            DdlStatementContext ddlStatement = this.GetDdlStatementContext(content, out error);

            AnalyseResult result = new AnalyseResult()
            {
                Error = error
            };

            if (!result.HasError && ddlStatement != null)
            {
                TriggerScript script = new TriggerScript();

                CreateTriggerContext trigger = ddlStatement.createTrigger();

                if (trigger != null)
                {
                    #region Name

                    FullIdContext[] ids = trigger.fullId();

                    this.SetScriptName(script, ids.First());

                    if (ids.Length > 1)
                    {
                        script.OtherTriggerName = new TokenInfo(ids[1]);
                    }

                    #endregion

                    script.TableName = new TokenInfo(trigger.tableName())
                    {
                        Type = TokenType.TableName
                    };

                    foreach (var child in trigger.children)
                    {
                        if (child is TerminalNodeImpl terminalNode)
                        {
                            switch (terminalNode.Symbol.Type)
                            {
                            case MySqlParser.BEFORE:
                                script.Time = TriggerTime.BEFORE;
                                break;

                            case MySqlParser.AFTER:
                                script.Time = TriggerTime.AFTER;
                                break;

                            case MySqlParser.INSERT:
                                script.Events.Add(TriggerEvent.INSERT);
                                break;

                            case MySqlParser.UPDATE:
                                script.Events.Add(TriggerEvent.UPDATE);
                                break;

                            case MySqlParser.DELETE:
                                script.Events.Add(TriggerEvent.DELETE);
                                break;

                            case MySqlParser.PRECEDES:
                                script.Behavior = nameof(MySqlParser.PRECEDES);
                                break;

                            case MySqlParser.FOLLOWS:
                                script.Behavior = nameof(MySqlParser.FOLLOWS);
                                break;
                            }
                        }
                    }

                    #region Body

                    this.SetScriptBody(script, trigger.routineBody());

                    #endregion
                }

                this.ExtractFunctions(script, ddlStatement);

                result.Script = script;
            }

            return(result);
        }