| 1 package com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors; 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.serversystem.dmlvalidation.constraintsystem.*; 8 import com.daffodilwoods.daffodildb.server.sql99.common.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.*; 10 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 11 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 12 import com.daffodilwoods.daffodildb.server.sql99.utils.parser.*; 13 import com.daffodilwoods.daffodildb.utils.*; 14 import com.daffodilwoods.database.general.*; 15 import com.daffodilwoods.database.resource.*; 16 17 public class RoutineDescriptor extends Descriptor { 18 public String SPECIFIC_CATALOG; 19 public String SPECIFIC_SCHEMA; 20 public String SPECIFIC_NAME; 21 public String ROUTINE_CATALOG; 22 public String ROUTINE_SCHEMA; 23 public String ROUTINE_NAME; 24 public String MODULE_CATALOG; 25 public String MODULE_SCHEMA; 26 public String MODULE_NAME; 27 public String USER_DEFINED_TYPE_CATALOG; 28 public String USER_DEFINED_TYPE_SCHEMA; 29 public String USER_DEFINED_TYPE_NAME; 30 public String ROUTINE_TYPE; 31 public String DTD_IDENTIFIER; 32 public String ROUTINE_BODY; 33 public String ROUTINE_DEFINITION; 34 public String EXTERNAL_NAME; 35 public String EXTERNAL_LANGUAGE; 36 public String PARAMETER_STYLE; 37 public String IS_DETERMINISTIC; 38 public String SQL_DATA_ACCESS; 39 public String IS_NULL_CALL; 40 public String SQL_PATH; 41 public String SCHEMA_LEVEL_ROUTINE; 42 public int MAX_DYNAMIC_RESULT_SETS; 43 public String IS_USER_DEFINED_CAST; 44 public String IS_IMPLICITLY_INVOCABLE; 45 public String SECURITY_TYPE; 46 public String TO_SQL_SPECIFIC_CATALOG; 47 public String TO_SQL_SPECIFIC_SCHEMA; 48 public String TO_SQL_SPECIFIC_NAME; 49 public String AS_LOCATOR; 50 public java.sql.Timestamp CREATED; 51 public java.sql.Timestamp LAST_ALTERED; 52 53 55 public ArrayList tablesUsed; 56 57 59 public ArrayList columnsUsed; 60 61 63 private static String selectRoutineTableUsageQuery = 64 "Select table_catalog,table_schema,table_name from " + 65 SystemTables.routine_table_usage_TableName + 66 " where SPECIFIC_CATALOG = ? and SPECIFIC_SCHEMA = ? and SPECIFIC_NAME = ? "; 67 68 70 private static String selcetRoutineColumnUsageQuery = 71 "select table_catalog,table_schema,table_name ,column_name from " + 72 SqlSchemaConstants.routine_column_usage_TableName + 73 " where SPECIFIC_CATALOG = ? and SPECIFIC_SCHEMA = ? and SPECIFIC_NAME = ? "; 74 75 public RoutineDescriptor() throws DException { 76 } 77 78 public void load(_ServerSession serverSession) throws DException { 79 String clause = "select * from " + SystemTables.routines_TableName 80 + " where specific_catalog =? and specific_schema=? and specific_name=?"; 81 _SelectQueryIterator iter = SqlSchemaConstants.getIterator(serverSession, clause, new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}); 82 if (iter.first()) { 83 loadDataFromRecord(iter); 84 } else { 85 87 throw new DException("DSE8182", new Object [] {new QualifiedIdentifier(SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME)}); 88 } 89 if (serverSession.getDbVersion() >= 4.0) { 90 loadTableUsage(serverSession); 91 loadColumnUsage(serverSession); 92 } 93 } 94 95 public void loadDataFromRecord(_SelectQueryIterator iter) throws DException { 96 Object [] obj = (Object []) iter.getObject(); 97 SPECIFIC_CATALOG = (String ) obj[SystemTablesFields.routines_specific_catalog]; 98 SPECIFIC_SCHEMA = (String ) obj[SystemTablesFields.routines_specific_schema]; 99 SPECIFIC_NAME = (String ) obj[SystemTablesFields.routines_specific_name]; 100 ROUTINE_CATALOG = (String ) obj[SystemTablesFields.routines_routine_catalog]; 101 ROUTINE_SCHEMA = (String ) obj[SystemTablesFields.routines_specific_schema]; 102 ROUTINE_NAME = (String ) obj[SystemTablesFields.routines_routine_name]; 103 MODULE_CATALOG = (String ) obj[SystemTablesFields.routines_module_catalog]; 104 MODULE_SCHEMA = (String ) obj[SystemTablesFields.routines_module_schema]; 105 MODULE_NAME = (String ) obj[SystemTablesFields.routines_module_name]; 106 USER_DEFINED_TYPE_CATALOG = (String ) obj[SystemTablesFields.routines_user_defined_type_catalog]; 107 USER_DEFINED_TYPE_SCHEMA = (String ) obj[SystemTablesFields.routines_specific_schema]; 108 USER_DEFINED_TYPE_NAME = (String ) obj[SystemTablesFields.routines_specific_name]; 109 DTD_IDENTIFIER = (String ) obj[SystemTablesFields.routines_dtd_identifier]; 110 ROUTINE_BODY = (String ) obj[SystemTablesFields.routines_routine_body]; 111 ROUTINE_DEFINITION = (String ) obj[SystemTablesFields.routines_routine_definition]; 112 ROUTINE_TYPE = (String ) obj[SystemTablesFields.routines_routine_type]; 113 EXTERNAL_NAME = (String ) obj[SystemTablesFields.routines_external_name]; 114 EXTERNAL_LANGUAGE = (String ) obj[SystemTablesFields.routines_external_language]; 115 PARAMETER_STYLE = (String ) obj[SystemTablesFields.routines_parameter_style]; 116 IS_DETERMINISTIC = (String ) obj[SystemTablesFields.routines_is_deterministic]; 117 SQL_DATA_ACCESS = (String ) obj[SystemTablesFields.routines_sql_data_access]; 118 IS_NULL_CALL = (String ) obj[SystemTablesFields.routines_is_null_call]; 119 SQL_PATH = (String ) obj[SystemTablesFields.routines_sql_path]; 120 SCHEMA_LEVEL_ROUTINE = (String ) obj[SystemTablesFields.routines_schema_level_routine]; 121 MAX_DYNAMIC_RESULT_SETS = obj[SystemTablesFields.routines_max_dynamic_result_sets].hashCode(); 122 IS_USER_DEFINED_CAST = (String ) obj[SystemTablesFields.routines_is_user_defined_cast]; 123 IS_IMPLICITLY_INVOCABLE = (String ) obj[SystemTablesFields.routines_is_implicitly_invocable]; 124 SECURITY_TYPE = (String ) obj[SystemTablesFields.routines_security_type]; 125 TO_SQL_SPECIFIC_CATALOG = (String ) obj[SystemTablesFields.routines_to_sql_specific_catalog]; 126 TO_SQL_SPECIFIC_SCHEMA = (String ) obj[SystemTablesFields.routines_specific_schema]; 127 TO_SQL_SPECIFIC_NAME = (String ) obj[SystemTablesFields.routines_specific_name]; 128 AS_LOCATOR = (String ) obj[SystemTablesFields.routines_as_locator]; 129 CREATED = (java.sql.Timestamp ) obj[SystemTablesFields.routines_created]; 130 LAST_ALTERED = (java.sql.Timestamp ) obj[SystemTablesFields.routines_last_altered]; 131 } 132 133 public void save(_ServerSession user_session) throws DException { 134 Object [] values = new Object [] { 135 SPECIFIC_CATALOG, 136 SPECIFIC_SCHEMA, 137 SPECIFIC_NAME, 138 ROUTINE_CATALOG, 139 ROUTINE_SCHEMA, 140 ROUTINE_NAME, 141 MODULE_CATALOG, 142 MODULE_SCHEMA, 143 MODULE_NAME, 144 USER_DEFINED_TYPE_CATALOG, 145 USER_DEFINED_TYPE_SCHEMA, 146 USER_DEFINED_TYPE_NAME, 147 ROUTINE_TYPE, 148 DTD_IDENTIFIER, 149 ROUTINE_BODY, 150 ROUTINE_DEFINITION, 151 EXTERNAL_NAME, 152 EXTERNAL_LANGUAGE, 153 PARAMETER_STYLE, 154 IS_DETERMINISTIC, 155 SQL_DATA_ACCESS, 156 IS_NULL_CALL, 157 SQL_PATH, 158 SCHEMA_LEVEL_ROUTINE, 159 new Integer (MAX_DYNAMIC_RESULT_SETS), 160 IS_USER_DEFINED_CAST, 161 IS_IMPLICITLY_INVOCABLE, 162 SECURITY_TYPE, 163 TO_SQL_SPECIFIC_CATALOG, 164 TO_SQL_SPECIFIC_SCHEMA, 165 TO_SQL_SPECIFIC_NAME, 166 AS_LOCATOR, 167 CREATED, 168 LAST_ALTERED 169 }; 170 try { 171 SqlSchemaConstants.insert(user_session, SystemTables.routines_TableName, null, values); 172 } catch (PrimaryConstraintException de) { 173 DException tde = new DException("DSE1135", new Object [] {SPECIFIC_CATALOG + "." + SPECIFIC_SCHEMA + "." + SPECIFIC_NAME}); 174 throw tde; 175 } catch (SizeMisMatchException de) { 176 if (de.getDseCode().equals("DSE773")) { 177 DException tde = new DException("DSE8103", null); 178 throw tde; 179 } 180 } catch (DException de) { 181 if (de.getDseCode().equals("DSE1255")) { 182 DException tde = new DException("DSE1135", new Object [] {SPECIFIC_CATALOG + "." + SPECIFIC_SCHEMA + "." + SPECIFIC_NAME}); 183 throw tde; 184 } 185 if (de.getDseCode().equals("DSE773")) { 186 DException tde = new DException("DSE8103", null); 187 throw tde; 188 } 189 throw de; 190 } 191 if (user_session.getDbVersion() >= 4.0) { 192 saveTablesUsed(user_session); 193 saveColumnsUsed(user_session); 194 } 195 } 196 197 private void saveTablesUsed(_ServerSession serverSession) throws DException { 198 if (tablesUsed == null) { 199 return; 200 } 201 int tableCount = tablesUsed.size(); 202 Object [] columnValues = new Object [6]; 203 columnValues[0] = SPECIFIC_CATALOG; 204 columnValues[1] = SPECIFIC_SCHEMA; 205 columnValues[2] = SPECIFIC_NAME; 206 for (int i = 0; i < tableCount; i++) { 207 String [] tableName = (String []) tablesUsed.get(i); 208 columnValues[3] = tableName[0]; 209 columnValues[4] = tableName[1]; 210 columnValues[5] = tableName[2]; 211 SqlSchemaConstants.insert(serverSession, 212 SqlSchemaConstants. 213 routine_table_usage_TableName, null, 214 columnValues); 215 } 216 } 217 218 private void saveColumnsUsed(_ServerSession serverSession) throws DException { 219 if (columnsUsed == null) { 220 return; 221 } 222 int columnCount = columnsUsed.size(); 223 Object [] columnValues = new Object [7]; 224 columnValues[0] = SPECIFIC_CATALOG; 225 columnValues[1] = SPECIFIC_SCHEMA; 226 columnValues[2] = SPECIFIC_NAME; 227 for (int i = 0; i < columnCount; i++) { 228 String [] columnName = (String []) columnsUsed.get(i); 229 columnValues[3] = columnName[0]; 230 columnValues[4] = columnName[1]; 231 columnValues[5] = columnName[2]; 232 columnValues[6] = columnName[3]; 233 SqlSchemaConstants.insert(serverSession, 234 SqlSchemaConstants. 235 routine_column_usage_TableName, null, 236 columnValues); 237 } 238 } 239 240 public void delete(_ServerSession serverSession) throws DException { 241 if (serverSession.getDbVersion() >= 4.0) { 242 deleteRoutineTableUsage(serverSession); 243 deleteRoutineColumnUsage(serverSession); 244 } 245 dropParametersEntry(serverSession); 246 247 String bve = "SPECIFIC_CATALOG=? and SPECIFIC_SCHEMA=? and SPECIFIC_NAME=?"; 248 _ServerSession globalSession = serverSession.getGlobalSession(); 249 booleanvalueexpression condition = ConditionParser.parseCondition(bve, globalSession, SqlSchemaConstants.routines_TableName); 250 super.delete(serverSession, SqlSchemaConstants.routines_TableName, condition, new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}); 251 252 } 253 254 private void dropParametersEntry(_ServerSession serverSession) throws DException { 255 String deleteParameters = "select * from " + SystemTables.parameters_TableName 256 + " where specific_catalog= ? and specific_schema= ? and specific_name= ? "; 257 String deleteDtd = "select * from " + SystemTables.dataTypeDescriptor_TableName 258 + " where object_catalog= ? and object_schema= ? and object_name= ? and object_type='ROUTINE'"; 259 _SelectQueryIterator iter1 = SqlSchemaConstants.getIterator(serverSession, deleteParameters, new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}); 260 if (iter1.first()) { 261 do { 262 ParametersDescriptor p = new ParametersDescriptor(); 263 p.loadDataFromRecord(iter1); 264 p.delete(serverSession); 265 } while (iter1.next()); 266 } 267 _SelectQueryIterator iter2 = SqlSchemaConstants.getIterator(serverSession, deleteDtd, new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}); 268 if (iter2.first()) { 269 do { 270 DataTypeDescriptor p = new DataTypeDescriptor(); 271 p.loadDataFromRecord(iter2); 272 p.delete(serverSession); 273 } while (iter2.next()); 274 } 275 } 276 277 public int getDescriptorType() { 278 return ROUTINE_DESCRIPTOR; 279 } 280 281 public QualifiedIdentifier getQualifiedSpecificName() { 282 return new QualifiedIdentifier(SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME); 283 } 284 285 288 private void loadTableUsage(_ServerSession serverSession) throws DException { 289 loadTableUsed(SqlSchemaConstants.getIterator(serverSession, 290 selectRoutineTableUsageQuery, 291 new Object [] {SPECIFIC_CATALOG, 292 SPECIFIC_SCHEMA, SPECIFIC_NAME})); 293 } 294 295 298 private void loadTableUsed(_SelectQueryIterator routineTableUsageIterator) throws 299 DException { 300 tablesUsed = new ArrayList(); 301 if (routineTableUsageIterator.first()) { 302 do { 303 Object [] values = (Object []) routineTableUsageIterator.getObject(); 304 tablesUsed.add(new String [] { (String ) values[0], (String ) values[1], 305 (String ) values[2]}); 306 } while (routineTableUsageIterator.next()); 307 } 308 } 309 310 313 private void loadColumnUsage(_ServerSession serverSession) throws DException { 314 loadColumnUsed(SqlSchemaConstants.getIterator(serverSession, 315 selcetRoutineColumnUsageQuery, 316 new Object [] {SPECIFIC_CATALOG, 317 SPECIFIC_SCHEMA, SPECIFIC_NAME})); 318 } 319 320 323 private void loadColumnUsed(_SelectQueryIterator routineColumnUsageIterator) throws 324 DException { 325 columnsUsed = new ArrayList(); 326 if (routineColumnUsageIterator.first()) { 327 do { 328 Object [] values = (Object []) routineColumnUsageIterator.getObject(); 329 columnsUsed.add(new String [] { (String ) values[0], (String ) values[1], 330 (String ) values[2], (String ) values[3]}); 331 } while (routineColumnUsageIterator.next()); 332 } 333 } 334 335 337 private void deleteRoutineTableUsage(_ServerSession serverSession) throws DException { 338 TableDetails tableDetail = new TableDetails(); 339 tableDetail.setTableName(SqlSchemaConstants.routine_table_usage_TableName.getTableName()); 340 String bve = "SPECIFIC_CATALOG=? and SPECIFIC_SCHEMA=? and SPECIFIC_NAME=?"; 341 _ServerSession globalSession = serverSession.getGlobalSession(); 342 booleanvalueexpression condition = ConditionParser.parseCondition(bve, globalSession, SqlSchemaConstants.routine_table_usage_TableName); 343 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, tableDetail, globalSession, condition, null); 344 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.routine_table_usage_TableName, conSingTE); 345 iter.setConditionVariableValue(condition.getReferences(new TableDetails[] { 346 tableDetail}), FieldUtility.getFields(new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}), 1); 347 SqlSchemaConstants.deleteAll(serverSession.getSystemServerSession(), SqlSchemaConstants.routine_table_usage_TableName, iter); 348 } 349 350 352 private void deleteRoutineColumnUsage(_ServerSession serverSession) throws DException { 353 TableDetails tableDetail = new TableDetails(); 354 tableDetail.setTableName(SqlSchemaConstants.routine_column_usage_TableName.getTableName()); 355 String bve = "SPECIFIC_CATALOG=? and SPECIFIC_SCHEMA=? and SPECIFIC_NAME=?"; 356 _ServerSession globalSession = serverSession.getGlobalSession(); 357 booleanvalueexpression condition = ConditionParser.parseCondition(bve, globalSession, SqlSchemaConstants.routine_column_usage_TableName); 358 ConditionSingleTableExecuter conSingTE = new ConditionSingleTableExecuter(null, tableDetail, globalSession, condition, null); 359 _Iterator iter = globalSession.getInternalIterator(SqlSchemaConstants.routine_column_usage_TableName, conSingTE); 360 iter.setConditionVariableValue(condition.getReferences(new TableDetails[] { 361 tableDetail}), FieldUtility.getFields(new Object [] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}), 1); 362 SqlSchemaConstants.deleteAll(serverSession.getSystemServerSession(), SqlSchemaConstants.routine_column_usage_TableName, iter); 363 } 364 } 365 | Popular Tags |