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}