KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > ddl > schemadefinition > referencesspecification


1 package com.daffodilwoods.daffodildb.server.sql99.ddl.schemadefinition;
2
3 import java.util.*;
4
5 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*;
6 import com.daffodilwoods.daffodildb.server.serversystem.*;
7 import com.daffodilwoods.daffodildb.server.sql99.common.*;
8 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*;
9 import com.daffodilwoods.daffodildb.server.sql99.ddl.utility.*;
10 import com.daffodilwoods.daffodildb.server.sql99.token.*;
11 import com.daffodilwoods.database.general.*;
12 import com.daffodilwoods.database.resource.*;
13 import com.daffodilwoods.daffodildb.server.serversystem.ServerSession;
14
15 public class referencesspecification implements columnconstraint {
16    public referentialtriggeredaction _Optreferentialtriggeredaction0;
17    public SRESERVEDWORD1206543922matchtype _OptSRESERVEDWORD1206543922matchtype1;
18    public referencedtableandcolumns _referencedtableandcolumns2;
19    public SRESERVEDWORD1206543922 _SRESERVEDWORD12065439223;
20
21    private ReferentialConstraintDescriptor referentialConsDes;
22
23    public void setConstraintDescriptor(_Descriptor referentialConsDes0) throws
24        DException {
25       referentialConsDes = (ReferentialConstraintDescriptor)
26           referentialConsDes0;
27    }
28
29    /** @todo alogo
30     * initialise currentUserSession
31     * setReferentialConstraintType --- e.g full, partial
32     * setReferentialTriggerAction
33     * setReferencedTableAndColumns*/

34    public Object JavaDoc run(Object JavaDoc object) throws DException {
35       _ServerSession currentSession = (_ServerSession) object;
36       setMatchType();
37       setReferentialTriggeredAction(currentSession);
38       setReferencedTableAndColumns(currentSession);
39       setForeignTableKeyColumn(currentSession);
40       return null;
41    }
42
43    private void setMatchType() throws DException {
44       referentialConsDes.match_option = _OptSRESERVEDWORD1206543922matchtype1 == null ?
45           SqlKeywords.SIMPLE :
46           (String JavaDoc) _OptSRESERVEDWORD1206543922matchtype1.run(null);
47    }
48
49    private void setReferentialTriggeredAction(_ServerSession serverSession) throws DException {
50       if (_Optreferentialtriggeredaction0 != null) {
51          _Optreferentialtriggeredaction0.setUpdateDeletRule(referentialConsDes);
52       } else if (serverSession.getDbVersion() >= 3.1 &&
53                  (!SystemTables.isSystemTable(referentialConsDes.getReferencingTable().toString()))) {
54          referentialConsDes.update_rule = SqlSchemaConstants.restrict;
55          referentialConsDes.delete_rule = SqlSchemaConstants.restrict;
56       } else {
57          referentialConsDes.update_rule = SqlSchemaConstants.NoAction;
58          referentialConsDes.delete_rule = SqlSchemaConstants.NoAction;
59       }
60    }
61
62    private void setReferencedTableAndColumns(_ServerSession serverSession) throws
63        DException {
64       _referencedtableandcolumns2.setReferentialConstraintDescriptor(
65           referentialConsDes);
66       Object JavaDoc[] temp = (Object JavaDoc[]) _referencedtableandcolumns2.run(serverSession);
67       TableConstraintDescriptor referencedConstraint =
68           (TableConstraintDescriptor) temp[0];
69
70       checkAccessRights(serverSession, referencedConstraint);
71       if (referencedConstraint.is_deferrable.equalsIgnoreCase(SqlSchemaConstants.YES)) {
72          throw new DException("DSE289", null);
73       }
74       checkTableTypes(referencedConstraint.tableDescriptor);
75       checkCommitActions(referencedConstraint.tableDescriptor);
76
77       checkColumnsTypes(referencedConstraint, (int[]) temp[1]);
78       /**
79        * setting referenced constraint descriptor and their name
80        * in referencing constraintDescriptor
81        */

82
83       referentialConsDes.referencedTableConstraintDescriptor = referencedConstraint;
84       referentialConsDes.unique_constraint_catalog = referencedConstraint.
85           constraint_catalog;
86       referentialConsDes.unique_constraint_schema = referencedConstraint.
87           constraint_schema;
88       referentialConsDes.unique_constraint_name = referencedConstraint.
89           constraint_name;
90    }
91
92    private void checkAccessRights(_ServerSession serverSession,
93                                   TableConstraintDescriptor referncedConstraints) throws
94        DException {
95       ArrayList referencedColumns = referncedConstraints.getConstraintColumns();
96       QualifiedIdentifier tableName = referncedConstraints.getQualifiedTable();
97       _PrivilegeCharacteristics pc = serverSession.getDataDictionary().
98           getPrivilegeCharacteristics(serverSession.getCurrentUser(), _PrivilegeCharacteristics.AUTHORIZATION_USER);
99       _ColumnCharacteristics cc = serverSession.getColumnCharacteristics(
100           tableName);
101       _PrivilegeTable privilegeTable = pc.getPrivilegeTable(tableName);
102       int[] columnIndexes = new int[referencedColumns.size()];
103       for (int i = 0; i < referencedColumns.size(); i++) {
104          columnIndexes[i] = cc.getColumnIndex( (String JavaDoc) referencedColumns.get(i));
105       }
106       if (!privilegeTable.hasColumnPrivileges(_PrivilegeTable.REFERENCES,
107                                               columnIndexes)) {
108          throw new DException("DSE5026",
109                               new Object JavaDoc[] {serverSession.getCurrentUser(),
110                               tableName.getIdentifier()});
111       }
112
113    }
114
115    /* Checking Rule 5
116       Rule 5(d) not considered
117     */

118    private void checkTableTypes(TableDescriptor referencedTable) throws DException {
119       TableDescriptor referencingTable = referentialConsDes.
120           tableConstraintDescriptor.tableDescriptor;
121       if (!referencedTable.table_type.equalsIgnoreCase(referencingTable.table_type)) {
122          throw new DException("DSE1025", null);
123       }
124    }
125
126    /** @todo what this method trying to do*/
127    private void checkCommitActions(TableDescriptor referencedTable) throws DException {
128       TableDescriptor referencingTable = referentialConsDes.
129           tableConstraintDescriptor.tableDescriptor;
130
131    }
132
133    /**
134     * for same number of coCheckinglumn in both constaints
135     * Checking whether the columns types of both constraint are comparable;
136     * currently checking for the same type only;
137     * seting ordinal position of referencing constaints keyColumnusage descriptor
138     */

139    private void checkColumnsTypes(TableConstraintDescriptor referencedConstraint,
140                                   int[] ordinal_postions) throws DException {
141       ArrayList referencingColumns = referentialConsDes.
142           tableConstraintDescriptor.getConstriantColumnDescriptors();
143       ArrayList referencedColumns = referencedConstraint.
144           getConstriantColumnDescriptors();
145
146       TableDescriptor referencingTable = referentialConsDes.
147           tableConstraintDescriptor.tableDescriptor;
148       TableDescriptor referencedTable = referencedConstraint.tableDescriptor;
149
150       int columnCount = referencedColumns.size();
151       if (columnCount != referencingColumns.size()) {
152          throw new DException("DSE7074", new Object JavaDoc[] {referencingTable.getQualifiedTableName().getIdentifier()});
153       }
154       for (int i = 0; i < columnCount; i++) {
155          KeyColumnUsageDescriptor referencingColumn = (KeyColumnUsageDescriptor)
156              referencingColumns.get(i);
157          ColumnDescriptor referencingColumnDescriptor = null;
158          try {
159             referencingColumnDescriptor = referencingTable.getColumnDescriptor(referencingColumn.column_name);
160          } catch (DException ex) {
161             if (ex.getDseCode().equalsIgnoreCase("DSE255")) {
162          ;//// Removed By Program ** System.out.println(" DD ::: " + com.daffodilwoods.database.utility.P.print(ex.getParameters()));
163
throw new DException("DSE7007", new Object JavaDoc[] {referentialConsDes.getQualifiedIdentifier().getIdentifier(), ex.getParameters()[0], ex.getParameters()[1]});
164             }
165             throw ex;
166          }
167          KeyColumnUsageDescriptor referencedColumn = (KeyColumnUsageDescriptor)
168              referencedColumns.get(ordinal_postions[i] - 1);
169          ColumnDescriptor referencedColumnDescriptor = referencedTable.
170              getColumnDescriptor(referencedColumn.column_name);
171          if (!GeneralUtility.areComparable(referencingColumnDescriptor.getType(),
172                                            referencedColumnDescriptor.getType())) {
173             throw new DException("DSE1026", new Object JavaDoc[] {referencedColumn.column_name, referencingColumn.column_name});
174          }
175
176          referencingColumn.ordinal_position = referencedColumn.ordinal_position;
177       }
178    }
179
180    private void setForeignTableKeyColumn(_ServerSession currentSession) throws
181        DException {
182       TableConstraintDescriptor tabCons = referentialConsDes.
183           tableConstraintDescriptor;
184       TableDescriptor tableDes = tabCons.tableDescriptor;
185       String JavaDoc columnName = "__" +
186           tabCons.constraint_name;
187       ColumnDescriptor columnDes =
188           getColumnDescriptorForReferentialTableAddressColumn(tableDes,
189           columnName);
190       tabCons.setReferencialColumnIndex(tableDes.getColumnCount() +
191                                         SystemTablesFields.
192                                         systemFieldsCount);
193       tableDes.addConstraintColumnDescriptor(columnDes);
194    }
195
196    private ColumnDescriptor getColumnDescriptorForReferentialTableAddressColumn(
197        TableDescriptor tableDescriptor, String JavaDoc columnName) throws
198        DException {
199       ColumnDescriptor colDes = new ColumnDescriptor();
200       colDes.table_catalog = tableDescriptor.table_catalog;
201       colDes.table_schema = tableDescriptor.table_schema;
202       colDes.table_name = tableDescriptor.table_name;
203       colDes.column_name = columnName;
204       colDes.dataTypeDescriptor =
205           getDataTypeDescriptorForReferentialTableAddressColumn(colDes);
206       colDes.tableDescriptor = tableDescriptor;
207       return colDes;
208    }
209
210    private DataTypeDescriptor
211        getDataTypeDescriptorForReferentialTableAddressColumn(ColumnDescriptor
212        columnDes) throws DException {
213       DataTypeDescriptor dtdDes = new DataTypeDescriptor();
214       dtdDes.object_catalog = columnDes.table_catalog;
215       dtdDes.object_schema = columnDes.table_schema;
216       dtdDes.object_name = columnDes.table_name;
217       dtdDes.object_type = SqlKeywords.TABLE;
218       dtdDes.dtd_identifier = columnDes.table_name + "." + columnDes.column_name;
219       dtdDes.data_Type = "TableKey";
220       /** @todo */
221       return dtdDes;
222    }
223
224    public Object JavaDoc clone() throws CloneNotSupportedException JavaDoc {
225       return this;
226    }
227
228    public String JavaDoc toString() {
229       StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
230       sb.append(" ");
231       sb.append(_SRESERVEDWORD12065439223);
232       sb.append(" ");
233       sb.append(_referencedtableandcolumns2);
234       sb.append(" ");
235       if (_OptSRESERVEDWORD1206543922matchtype1 != null) {
236          sb.append(_OptSRESERVEDWORD1206543922matchtype1);
237       }
238       sb.append(" ");
239       if (_Optreferentialtriggeredaction0 != null) {
240          sb.append(_Optreferentialtriggeredaction0);
241       }
242       return sb.toString();
243    }
244
245 }
246
Popular Tags