001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.TCreateTriggerStmt;
005import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTrigger;
006
007/**
008* Trigger clause including:
009 *  action time: before, after, instead of
010 *  event type: insert, delete, update, ddl event, database event, {@link gudusoft.gsqlparser.nodes.TDmlEventClause}
011 *  referencing clause: old, new ,parent
012 *
013 *  There are 3 types of triggering clause: simple dml, compound dml, non-dml.
014 *
015 *  subclass of this class is:
016 *  TSimpleDmlTriggerClause, TCompoundDmlTriggerClause, TNonDmlTriggerClause
017*/
018public class TTriggeringClause extends TParseTreeNode {
019
020    private TTriggerReferencingClause referencingClause;
021
022    public void setReferencingClause(TTriggerReferencingClause referencingClause) {
023        this.referencingClause = referencingClause;
024    }
025
026    public TTriggerReferencingClause getReferencingClause() {
027
028        return referencingClause;
029    }
030
031    private TTriggerEventClause eventClause;
032
033    public void setEventClause(TTriggerEventClause eventClause) {
034        this.eventClause = eventClause;
035    }
036
037    public TTriggerEventClause getEventClause() {
038        return eventClause;
039    }
040
041    private ETriggerActionTime actionTime;
042
043    public void setActionTime(ETriggerActionTime actionTime) {
044        this.actionTime = actionTime;
045    }
046
047    public void setActionTimeByDummy(TDummy dummy)
048    {
049        if (dummy.int1 == TBaseType.tfmFor){
050            this.actionTime = (ETriggerActionTime.tatFor);
051        }
052        else if (dummy.int1 == TBaseType.tfmAfter){
053            this.actionTime = (ETriggerActionTime.tatAfter);
054        }
055        else if (dummy.int1 == TBaseType.tfmInsteadOf){
056            this.actionTime = (ETriggerActionTime.tatInsteadOf);
057        }
058    }
059
060
061    /**
062     * Indicates when triggered SQL statements perform in relation to the triggering event.
063     *
064     * @return after, before or instead of
065     */
066    public ETriggerActionTime getActionTime() {
067        return actionTime;
068    }
069
070    public void init(Object arg1){
071        eventClause = (TTriggerEventClause)arg1;
072    }
073
074    public void init(Object arg1,Object arg2)
075    {
076        init(arg1);
077        TSourceToken st = (TSourceToken)arg2;
078
079        if(st.toString().equalsIgnoreCase("after")){
080            actionTime = ETriggerActionTime.tatAfter;
081        }else if(st.toString().equalsIgnoreCase("before")){
082            actionTime = ETriggerActionTime.tatBefore;
083        }
084//        before_after_insteadOf = (TDummy)arg2;
085//        if (before_after_insteadOf.toString().startsWith("after")){
086//            this.fireMode = TBaseType.fireMode_after;
087//        }else if (before_after_insteadOf.toString().startsWith("before")){
088//            this.fireMode = TBaseType.fireMode_before;
089//        }else if (before_after_insteadOf.toString().startsWith("instead")){
090//            this.fireMode = TBaseType.fireMode_insteadOf;
091//        }
092    }
093
094    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
095
096        if ((psql instanceof TPlsqlCreateTrigger)||(psql instanceof TCreateTriggerStmt)){
097
098            if (eventClause instanceof TDmlEventClause){
099                TDmlEventClause dmlEventClause = (TDmlEventClause)eventClause;
100                TTable lcTable = new TTable();
101                lcTable.setTableType(ETableSource.objectname);
102                //lcTable.aliasClause = null;
103                lcTable.setTableName(dmlEventClause.getTableName());
104                TDmlEventItem dmlEventItem = (TDmlEventItem)dmlEventClause.getEventItems().get(0);
105                switch (dmlEventItem.getDmlType()){
106                    case sstinsert:
107                        lcTable.setEffectType(ETableEffectType.tetTriggerInsert);
108                        break;
109                    case sstupdate:
110                        lcTable.setEffectType(ETableEffectType.tetTriggerUpdate);
111                        break;
112                    case sstdelete:
113                        lcTable.setEffectType(ETableEffectType.tetTriggerDelete);
114                        break;
115                    default:
116                        lcTable.setEffectType(ETableEffectType.tetTriggerOn);
117                        break;
118                }
119                //lcTable.setEffectType(ETableEffectType.tetTriggerOn);
120                psql.tables.addTable(lcTable);
121
122            }
123        }
124
125    }
126    public void accept(TParseTreeVisitor v){
127        v.preVisit(this);
128        v.postVisit(this);
129    }
130
131    public void acceptChildren(TParseTreeVisitor v){
132        v.preVisit(this);
133        v.postVisit(this);
134    }
135
136    /**
137     * @deprecated As of v2.0.1.0, replaced by {@link #getEventClause()}
138     *
139     * The DML_event_clause lets you specify one of three DML statements that can cause the trigger to fire.
140     * @return
141     */
142    public TDmlEventClause getDmlEventClause() {
143        return dmlEventClause;
144    }
145
146    private TDmlEventClause dmlEventClause = null;
147    private TDummy before_after_insteadOf = null;
148
149    private int fireMode = TBaseType.fireMode_after;
150
151    /**
152     * @deprecated As of v2.0.1.0, replaced by {@link #getActionTime()}
153     *
154     * When or how this trigger was fired.
155     * @return
156     * <p>{@link TBaseType#fireMode_before}
157     * <p>{@link TBaseType#fireMode_after}
158     * <p>{@link TBaseType#fireMode_insteadOf}
159     * <p>{@link TBaseType#fireMode_for}
160     */
161    public int getFireMode() {
162        return fireMode;
163    }
164
165    /**
166     *  @deprecated As of v2.0.1.0, replaced by {@link #setEventClause(TTriggerEventClause)}
167     *
168     * @param dmlEventClause
169     */
170    public void setDmlEventClause(TDmlEventClause dmlEventClause) {
171        this.dmlEventClause = dmlEventClause;
172    }
173
174    /**
175     * @deprecated As of v2.0.1.0, replaced by {@link #getEventClause()}
176     * @param fireMode
177     */
178    public void setFireMode(int fireMode) {
179        this.fireMode = fireMode;
180    }
181
182}