KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > serversystem > triggerInfo > Trigger


1 package com.daffodilwoods.daffodildb.server.serversystem.triggerInfo;
2
3 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.booleanvalueexpression;
4 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference;
5 import com.daffodilwoods.daffodildb.server.serversystem._StatementExecutionContext;
6 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.TriggerDescriptor;
7 import com.daffodilwoods.database.resource.DException;
8 import com.daffodilwoods.daffodildb.server.sql99.common.ColumnDetails;
9 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession;
10 import java.util.ArrayList JavaDoc;
11 import com.daffodilwoods.daffodildb.server.datasystem.utility.RecordVersion;
12 import com.daffodilwoods.daffodildb.server.sql99.utils._VariableValues;
13 import com.daffodilwoods.daffodildb.server.datadictionarysystem._ColumnCharacteristics;
14 import com.daffodilwoods.daffodildb.server.sql99.common.TableDetails;
15 import com.daffodilwoods.database.general.QualifiedIdentifier;
16 import com.daffodilwoods.daffodildb.server.sql99.common.SetColumnProperties;
17 import com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary.subquery;
18 import com.daffodilwoods.database.utility.P;
19 import com.daffodilwoods.daffodildb.server.sql99.SQLexecutablestatement;
20 import com.daffodilwoods.daffodildb.server.sql99.dml.SQLdatachangestatement;
21 import com.daffodilwoods.daffodildb.server.sql99._Executer;
22 import com.daffodilwoods.daffodildb.server.sql99.dcl.sqlcontrolstatement.SQLcontrolstatement;
23 import com.daffodilwoods.daffodildb.server.serversystem.triggerInfo._Triggers;
24 import com.daffodilwoods.daffodildb.server.serversystem.TriggerServerSession;
25
26 public class Trigger implements _Triggers{
27
28   private String JavaDoc oldAlias;
29
30   private String JavaDoc newAlias;
31
32   private booleanvalueexpression bve;
33
34   private _Reference[] ref;
35
36   private _Statement[] statements;
37
38   private String JavaDoc triggerType;
39
40   private _StatementExecutionContext statementExecutionContext;
41
42   private int[] columnsIncluded;
43
44   public Trigger(TriggerDescriptor triggerDescriptor, _StatementExecutionContext statementExecutionContext0,QualifiedIdentifier tableName) throws DException{
45    oldAlias = triggerDescriptor.getOldAliasName() ;
46    newAlias = triggerDescriptor.getNewAliasName() ;
47    bve = triggerDescriptor.getSearchCondition() ;
48     triggerType = triggerDescriptor.getTriggerType() ;
49       statementExecutionContext = statementExecutionContext0;
50     _ColumnCharacteristics cc = statementExecutionContext.getColumnCharacteristics(tableName);
51     if(triggerDescriptor.triggerColumnsList != null)
52             columnsIncluded = cc.getColumnIndexes( (String JavaDoc[]) triggerDescriptor.triggerColumnsList.toArray(new String JavaDoc[0]));
53
54     _ServerSession s_session = statementExecutionContext.getServerSession();
55     _ServerSession serversession = new TriggerServerSession(tableName.schema,tableName.catalog,s_session);
56     if (bve != null) {
57       TableDetails tableDetails = new TableDetails();
58       tableDetails.setTableName(new String JavaDoc[] {tableName.catalog,tableName.schema, tableName.name});
59       ColumnDetails[] columnDetails = bve.getColumnDetails();
60       checkColumnsValidityAsReference(columnDetails, tableDetails,serversession);
61       bve.checkSemantic(serversession);
62       ArrayList JavaDoc aList = new ArrayList JavaDoc(5);
63       getAllReferencesIncludingSubQuery(aList,bve.getReferences(new TableDetails[] {tableDetails}));
64       int size = aList.size();
65        ref = size == 0 ? null :
66           (_Reference[]) aList.toArray(new _Reference[size]);
67       setDataTypeAndSizeForReferences(ref, cc);
68
69     }
70       SQLexecutablestatement[] sqlstatements = triggerDescriptor.getStatement();
71          statements = new Statement[sqlstatements.length ];
72          for (int j = 0; j < sqlstatements.length; j++) {
73            _Reference[] references = null;
74            _Executer executer = null;
75            if (sqlstatements[j] instanceof SQLdatachangestatement) {
76              references = ( (SQLdatachangestatement) sqlstatements[j]).checkSemantic(
77                  serversession);
78              if (references != null)
79                setDataTypeAndSizeForReferences(references, cc);
80              executer = ( (_Executer) ( (SQLdatachangestatement) sqlstatements[j]).
81                          run(statementExecutionContext));
82            }
83            if (sqlstatements[j] instanceof SQLcontrolstatement) {
84               String JavaDoc columns[] =cc.getColumnNames();
85               ColumnDetails[] cd=( (SQLcontrolstatement) sqlstatements[j]).getColumnDetails();
86               if(cd != null){
87               for (int m = 0; m < cd.length; m++) {
88                        for (int k = 0; k < columns.length; k++) {
89                           String JavaDoc aliasName = cd[m].getNameOfTable();
90                           if (aliasName != null && (aliasName.equalsIgnoreCase(oldAlias) ||
91                               aliasName.equalsIgnoreCase(newAlias))) {
92                              if (cd[m].getColumn().equalsIgnoreCase(columns[k])) {
93                                 cd[m].setDatatype(cc.getColumnType(k));
94                                 cd[m].setSize(cc.getPrecision(k));
95                              }
96                           }
97                        }
98                     }
99               }
100
101              references = ( (SQLcontrolstatement) sqlstatements[j]).checkSemantic(serversession);
102              if (references != null)
103                setDataTypeAndSizeForReferences(references, cc);
104              executer = ( (_Executer) ( (SQLcontrolstatement) sqlstatements[j]).run(
105                  statementExecutionContext));
106            }
107            statements[j] = new Statement(references,executer,sqlstatements[j]);
108    }
109   }
110   private _Reference[] checkColumnsValidityAsReference(ColumnDetails[] columns, TableDetails tableDetails, _ServerSession serverSession) throws DException {
111       ArrayList JavaDoc aList = new ArrayList JavaDoc(5);
112       if (columns != null) {
113          SetColumnProperties.setTableNamesAndDatatypesOfAllColumns(serverSession, columns, new TableDetails[] {tableDetails}
114              , aList, new ArrayList JavaDoc());
115          for (int i = 0, length = aList.size(); i < length; i++)
116             ( (ColumnDetails) aList.get(i)).setUnderLyingReference(true);
117          return aList.size() > 0 ? (_Reference[]) aList.toArray(new _Reference[0]) : null;
118       }
119       return null;
120    }
121
122    private void getAllReferencesIncludingSubQuery(ArrayList JavaDoc aList, _Reference[] references) throws DException {
123       if (references == null)
124          return;
125       for (int i = 0; i < references.length; i++) {
126          if (references[i] instanceof subquery) {
127             TableDetails[] td = ( (subquery) references[i])._queryexpression0.getAllTableDetails();
128             aList.add(references[i]);
129             getAllReferencesIncludingSubQuery(aList, ( (subquery) references[i])._queryexpression0.getReferences(td));
130          } else
131             aList.add(references[i]);
132       }
133    }
134
135
136    private void setDataTypeAndSizeForReferences(_Reference[] ref, _ColumnCharacteristics cc) throws DException {
137          if (ref != null) {
138             int len = ref.length;
139             String JavaDoc[] clms = cc.getColumnNames();
140             for (int i = 0; i < len; i++) {
141                String JavaDoc name = null;
142                try {
143                   name = ref[i].getColumn();
144                } catch (Exception JavaDoc E) {
145                   continue;
146                }
147
148                if (P.indexOfIgnoreCase(clms, name) != -1) {
149                   int type = cc.getColumnType(cc.getColumnIndex(name));
150                   ( (ColumnDetails) ref[i]).setDatatype(type);
151                   ( (ColumnDetails) ref[i]).setSize(cc.getSize(cc.getColumnIndex(name)));
152                   ( (ColumnDetails) ref[i]).setTriggerFlag();
153                } else {
154                }
155             }
156          }
157       }
158
159   public _Reference[] getReferences(){
160     return ref;
161   }
162
163   public _Statement[] getStatements(){
164     return statements;
165   }
166
167   public String JavaDoc getOldAliasName(){
168     return oldAlias;
169   }
170
171   public String JavaDoc getNewAliasName(){
172     return newAlias;
173   }
174
175   public booleanvalueexpression getCondition(){
176      return bve;
177    }
178
179    public String JavaDoc getTriggerType(){
180      return triggerType ;
181    }
182
183    public _StatementExecutionContext getStatementExecutionContext(){
184      return statementExecutionContext ;
185    }
186
187    public boolean isColumnIndeded(int col){
188      if(columnsIncluded == null)
189        return true;
190      for (int i = 0; i < columnsIncluded.length; i++) {
191        if(col == columnsIncluded[i] )
192          return true;
193      }
194      return false;
195    }
196
197
198 }
199
Popular Tags