001/*
002MIT License
003
004Copyright (c) 2020 FBSQL Team
005
006Permission is hereby granted, free of charge, to any person obtaining a copy
007of this software and associated documentation files (the "Software"), to deal
008in the Software without restriction, including without limitation the rights
009to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
010copies of the Software, and to permit persons to whom the Software is
011furnished to do so, subject to the following conditions:
012
013The above copyright notice and this permission notice shall be included in all
014copies or substantial portions of the Software.
015
016THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
017IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
018FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
019AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
020LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
021OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
022SOFTWARE.
023
024Home:   https://fbsql.github.io
025E-Mail: fbsql.team@gmail.com
026*/
027
028package org.fbsql.antlr4.parser;
029
030import org.antlr.v4.runtime.CharStreams;
031import org.antlr.v4.runtime.CommonTokenStream;
032import org.antlr.v4.runtime.Lexer;
033import org.antlr.v4.runtime.tree.ParseTree;
034import org.antlr.v4.runtime.tree.ParseTreeWalker;
035import org.fbsql.antlr4.generated.FbsqlBaseListener;
036import org.fbsql.antlr4.generated.FbsqlLexer;
037import org.fbsql.antlr4.generated.FbsqlParser;
038import org.fbsql.antlr4.generated.FbsqlParser.Cron_expressionContext;
039import org.fbsql.antlr4.generated.FbsqlParser.Procedure_nameContext;
040import org.fbsql.servlet.DbServlet;
041import org.fbsql.servlet.StringUtils;
042
043public class ParseStmtScheduleAt {
044        /**
045         * DECLARE PROCEDURE statement transfer object
046         * Declare stored procedure or function (can be used only in «init.sql» script)
047         */
048        public class StmtScheduleAt {
049                public String procedure;
050                public String cronExpression;
051
052                @Override
053                public String toString() {
054                        return "StmtScheduleAt [procedure=" + procedure + ", cronExpression=" + cronExpression + "]";
055                }
056        }
057
058        /**
059         * StmtScheduleAt transfer object
060         */
061        private StmtScheduleAt st;
062
063        public ParseStmtScheduleAt() {
064                st = new StmtScheduleAt();
065        }
066
067        /**
068         * SCHEDULE Statement parser
069         *
070         * E.g.: SCHEDULE MY_PERIODIC_RUN AT "0/5 * * * * ?"
071         *
072         * @param sql
073         * @return
074         */
075        public StmtScheduleAt parse(String sql) {
076                Lexer       lexer  = new FbsqlLexer(CharStreams.fromString(sql));
077                FbsqlParser parser = new FbsqlParser(new CommonTokenStream(lexer));
078                ParseTree   tree   = parser.schedule_stmt();
079
080                ParseTreeWalker.DEFAULT.walk(new FbsqlBaseListener() {
081
082                        @Override
083                        public void enterProcedure_name(Procedure_nameContext ctx) {
084                                st.procedure = StringUtils.unquote(ctx.getText());
085                        }
086
087                        @Override
088                        public void enterCron_expression(Cron_expressionContext ctx) {
089                                st.cronExpression = StringUtils.unquote(ctx.getText());
090                        }
091                }, tree);
092
093                if (DbServlet.DEBUG)
094                        System.out.println(st);
095
096                return st;
097        }
098}
099
100/*
101Please contact FBSQL Team by E-Mail fbsql.team@gmail.com
102or visit https://fbsql.github.io if you need additional
103information or have any questions.
104*/
105
106/* EOF */