| 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 34 public Object run(Object 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 ) _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 [] temp = (Object []) _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 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 ) referencedColumns.get(i)); 105 } 106 if (!privilegeTable.hasColumnPrivileges(_PrivilegeTable.REFERENCES, 107 columnIndexes)) { 108 throw new DException("DSE5026", 109 new Object [] {serverSession.getCurrentUser(), 110 tableName.getIdentifier()}); 111 } 112 113 } 114 115 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 127 private void checkCommitActions(TableDescriptor referencedTable) throws DException { 128 TableDescriptor referencingTable = referentialConsDes. 129 tableConstraintDescriptor.tableDescriptor; 130 131 } 132 133 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 [] {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 ; throw new DException("DSE7007", new Object [] {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 [] {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 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 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 221 return dtdDes; 222 } 223 224 public Object clone() throws CloneNotSupportedException { 225 return this; 226 } 227 228 public String toString() { 229 StringBuffer sb = new StringBuffer (); 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 |