001package gudusoft.gsqlparser.stmt.oracle;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.*;
005import gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement;
006
007
008/**
009 *  The CREATE TRIGGER statement creates or replaces a database trigger, which is either of the following:
010 * <ul>
011 * <li> A stored PL/SQL block associated with a table, a schema, or the database.</li>
012 * <li> An anonymous PL/SQL block or a call to a procedure implemented in PL/SQL or Java.</li>
013 * </ul>
014 *  For detailed information about Oracle simple_dml_trigger, compound_dml_trigger, non_dml_trigger
015 *  Please check {@link TTriggeringClause}
016 *
017 * <p>the database automatically executes a trigger when specified conditions occur.
018 */
019public class TPlsqlCreateTrigger extends TCommonStoredProcedureSqlStatement {
020     public TPlsqlCreateTrigger(EDbVendor dbvendor){
021        super(dbvendor);
022        sqlstatementtype = ESqlStatementType.sstplsql_createtrigger ;
023        }
024
025    void buildsql() {
026    }
027
028    void clear() {
029    }
030
031    String getasprettytext() {
032        return "";
033    }
034
035    void iterate(TVisitorAbs pvisitor) {
036    }
037
038    private TTriggeringClause triggeringClause;
039
040    public TTriggeringClause getTriggeringClause() {
041        return triggeringClause;
042    }
043
044    public TObjectName getStoredProcedureName(){
045        return triggerName;
046    }
047
048    private TFunctionCall functionCall;//postgresql
049
050    public void setFunctionCall(TFunctionCall functionCall) {
051        this.functionCall = functionCall;
052    }
053
054    /**
055     * PostgreSQL executed function
056     *
057     * @return function call
058     */
059    public TFunctionCall getFunctionCall() {
060
061        return functionCall;
062    }
063
064    public int doParseStatement(TCustomSqlStatement psql) {
065        if (rootNode == null) return -1;
066        if (super.doParseStatement(psql) != 0) return -1;
067
068        TCreateTriggerSqlNode createTriggerNode = (TCreateTriggerSqlNode)rootNode;
069        //super.doParseStatement(psql);
070        this.triggerName = createTriggerNode.getTriggerName();
071        //createTriggerNode.getTrigger_event_clause().doParse(this,ESqlClause.unknown);
072        //this.eventClause = createTriggerNode.getTrigger_event_clause();
073        triggeringClause = createTriggerNode.getTriggeringClause();
074        triggeringClause.doParse(this,ESqlClause.unknown);
075
076
077        if (createTriggerNode.getWhenCondition() != null){
078            createTriggerNode.getWhenCondition().doParse(this,ESqlClause.unknown);
079            this.whenCondition = createTriggerNode.getWhenCondition(); 
080        }
081
082        functionCall = createTriggerNode.getFunctionCall();
083
084        followsTriggerList = createTriggerNode.getFollowsTriggerList();
085        
086        createTriggerNode.getStmt().doParse(this,ESqlClause.unknown);
087        this.triggerBody = createTriggerNode.getStmt().getStmt(); 
088
089        return 0;
090    }
091
092    private TObjectName triggerName;
093
094    /**
095     * The name of the trigger to be created.
096     * @return
097     */
098    public TObjectName getTriggerName() {
099        return triggerName;
100    }
101
102    private TParseTreeNode eventClause;
103
104    /**
105     * @deprecated As of v2.0.1.0, replaced by {@link #getTriggeringClause()}
106     *
107     * Indicates what's kind of trigger, can be one of these:
108     * <ul>
109     * <li>{@link gudusoft.gsqlparser.nodes.TTriggeringClause},define a single trigger on a DML event.</li>
110     * <li>{@link TCompoundDmlTriggerClause},define a compound trigger on a DML event.</li>
111     * <li>{@link TNonDmlTriggerClause},define a single trigger on a DDL or database event.</li>
112     * </ul>
113     * @return trigger clause
114     */
115    public TParseTreeNode getEventClause() {
116        return eventClause;
117    }
118
119    /**
120     * A SQL condition that must be satisfied for the database to fire the trigger.
121     */
122    public TExpression getWhenCondition() {
123        return whenCondition;
124    }
125
126    private TExpression whenCondition;
127
128    private TCustomSqlStatement triggerBody;
129
130    /**
131     * the PL/SQL block, PL/SQL compound trigger block, {@link gudusoft.gsqlparser.stmt.TCommonBlock}
132     * <p>or call procedure that the database executes to fire the trigger.
133     * @return body statement of trigger
134     */
135    public TCustomSqlStatement getTriggerBody() {
136        return triggerBody;
137    }
138
139    private TObjectNameList followsTriggerList;
140
141    public TObjectNameList getFollowsTriggerList() {
142        return followsTriggerList;
143    }
144
145    public void accept(TParseTreeVisitor v){
146        v.preVisit(this);
147        v.postVisit(this);
148    }
149
150    public void acceptChildren(TParseTreeVisitor v){
151        v.preVisit(this);
152        if (eventClause != null) {
153            eventClause.acceptChildren(v);
154        }else if (getTriggeringClause() != null){
155            getTriggeringClause().acceptChildren(v);
156        }
157        if (followsTriggerList != null)  followsTriggerList.acceptChildren(v);
158        if (whenCondition != null) whenCondition.acceptChildren(v);
159        triggerBody.acceptChildren(v);
160        v.postVisit(this);
161    }
162
163    public void setTriggerName(TObjectName triggerName) {
164        this.triggerName = triggerName;
165    }
166
167    public void setEventClause(TParseTreeNode eventClause) {
168        this.eventClause = eventClause;
169    }
170
171    public void setWhenCondition(TExpression whenCondition) {
172        this.whenCondition = whenCondition;
173    }
174
175    public void setTriggerBody(TCustomSqlStatement triggerBody) {
176        this.triggerBody = triggerBody;
177    }
178
179    public void setFollowsTriggerList(TObjectNameList followsTriggerList) {
180        this.followsTriggerList = followsTriggerList;
181    }
182}