KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > ddl > descriptors > RoutineDescriptor


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 JavaDoc SPECIFIC_CATALOG; /*p*/
19    public String JavaDoc SPECIFIC_SCHEMA; /*p*/
20    public String JavaDoc SPECIFIC_NAME; /*p*/
21    public String JavaDoc ROUTINE_CATALOG;
22    public String JavaDoc ROUTINE_SCHEMA;
23    public String JavaDoc ROUTINE_NAME;
24    public String JavaDoc MODULE_CATALOG;
25    public String JavaDoc MODULE_SCHEMA;
26    public String JavaDoc MODULE_NAME;
27    public String JavaDoc USER_DEFINED_TYPE_CATALOG;
28    public String JavaDoc USER_DEFINED_TYPE_SCHEMA;
29    public String JavaDoc USER_DEFINED_TYPE_NAME;
30    public String JavaDoc ROUTINE_TYPE;
31    public String JavaDoc DTD_IDENTIFIER;
32    public String JavaDoc ROUTINE_BODY;
33    public String JavaDoc ROUTINE_DEFINITION;
34    public String JavaDoc EXTERNAL_NAME;
35    public String JavaDoc EXTERNAL_LANGUAGE;
36    public String JavaDoc PARAMETER_STYLE;
37    public String JavaDoc IS_DETERMINISTIC;
38    public String JavaDoc SQL_DATA_ACCESS;
39    public String JavaDoc IS_NULL_CALL;
40    public String JavaDoc SQL_PATH;
41    public String JavaDoc SCHEMA_LEVEL_ROUTINE;
42    public int MAX_DYNAMIC_RESULT_SETS;
43    public String JavaDoc IS_USER_DEFINED_CAST;
44    public String JavaDoc IS_IMPLICITLY_INVOCABLE;
45    public String JavaDoc SECURITY_TYPE;
46    public String JavaDoc TO_SQL_SPECIFIC_CATALOG;
47    public String JavaDoc TO_SQL_SPECIFIC_SCHEMA;
48    public String JavaDoc TO_SQL_SPECIFIC_NAME;
49    public String JavaDoc AS_LOCATOR;
50    public java.sql.Timestamp JavaDoc CREATED;
51    public java.sql.Timestamp JavaDoc LAST_ALTERED;
52
53    /**
54     * Table names are stored in form of a String[] catalog,schema,name in tableUsed variable. */

55    public ArrayList tablesUsed;
56
57    /**
58     * Table names are stored in form of a String[] catalog,schema,Tablename,columnName in columnUsed variable. */

59    public ArrayList columnsUsed;
60
61    /**
62     * Query to load all information (Such as table_catalog,table_schema,table_name) from routine_table_usage system table according to schema qualified view name. */

63    private static String JavaDoc 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    /**
69     * Query to load all information (Such as table_catalog,table_schema,table_name,column_name) from routine_colum_usage system table according to schema qualified view name. */

70    private static String JavaDoc 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 JavaDoc 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 JavaDoc[] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME});
82       if (iter.first()) {
83          loadDataFromRecord(iter);
84       } else {
85          /**
86           * Change DSE code by harvinder related to bug 12086. */

87          throw new DException("DSE8182", new Object JavaDoc[] {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 JavaDoc[] obj = (Object JavaDoc[]) iter.getObject();
97       SPECIFIC_CATALOG = (String JavaDoc) obj[SystemTablesFields.routines_specific_catalog];
98       SPECIFIC_SCHEMA = (String JavaDoc) obj[SystemTablesFields.routines_specific_schema];
99       SPECIFIC_NAME = (String JavaDoc) obj[SystemTablesFields.routines_specific_name];
100       ROUTINE_CATALOG = (String JavaDoc) obj[SystemTablesFields.routines_routine_catalog];
101       ROUTINE_SCHEMA = (String JavaDoc) obj[SystemTablesFields.routines_specific_schema];
102       ROUTINE_NAME = (String JavaDoc) obj[SystemTablesFields.routines_routine_name];
103       MODULE_CATALOG = (String JavaDoc) obj[SystemTablesFields.routines_module_catalog];
104       MODULE_SCHEMA = (String JavaDoc) obj[SystemTablesFields.routines_module_schema];
105       MODULE_NAME = (String JavaDoc) obj[SystemTablesFields.routines_module_name];
106       USER_DEFINED_TYPE_CATALOG = (String JavaDoc) obj[SystemTablesFields.routines_user_defined_type_catalog];
107       USER_DEFINED_TYPE_SCHEMA = (String JavaDoc) obj[SystemTablesFields.routines_specific_schema];
108       USER_DEFINED_TYPE_NAME = (String JavaDoc) obj[SystemTablesFields.routines_specific_name];
109       DTD_IDENTIFIER = (String JavaDoc) obj[SystemTablesFields.routines_dtd_identifier];
110       ROUTINE_BODY = (String JavaDoc) obj[SystemTablesFields.routines_routine_body];
111       ROUTINE_DEFINITION = (String JavaDoc) obj[SystemTablesFields.routines_routine_definition];
112       ROUTINE_TYPE = (String JavaDoc) obj[SystemTablesFields.routines_routine_type];
113       EXTERNAL_NAME = (String JavaDoc) obj[SystemTablesFields.routines_external_name];
114       EXTERNAL_LANGUAGE = (String JavaDoc) obj[SystemTablesFields.routines_external_language];
115       PARAMETER_STYLE = (String JavaDoc) obj[SystemTablesFields.routines_parameter_style];
116       IS_DETERMINISTIC = (String JavaDoc) obj[SystemTablesFields.routines_is_deterministic];
117       SQL_DATA_ACCESS = (String JavaDoc) obj[SystemTablesFields.routines_sql_data_access];
118       IS_NULL_CALL = (String JavaDoc) obj[SystemTablesFields.routines_is_null_call];
119       SQL_PATH = (String JavaDoc) obj[SystemTablesFields.routines_sql_path];
120       SCHEMA_LEVEL_ROUTINE = (String JavaDoc) 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 JavaDoc) obj[SystemTablesFields.routines_is_user_defined_cast];
123       IS_IMPLICITLY_INVOCABLE = (String JavaDoc) obj[SystemTablesFields.routines_is_implicitly_invocable];
124       SECURITY_TYPE = (String JavaDoc) obj[SystemTablesFields.routines_security_type];
125       TO_SQL_SPECIFIC_CATALOG = (String JavaDoc) obj[SystemTablesFields.routines_to_sql_specific_catalog];
126       TO_SQL_SPECIFIC_SCHEMA = (String JavaDoc) obj[SystemTablesFields.routines_specific_schema];
127       TO_SQL_SPECIFIC_NAME = (String JavaDoc) obj[SystemTablesFields.routines_specific_name];
128       AS_LOCATOR = (String JavaDoc) obj[SystemTablesFields.routines_as_locator];
129       CREATED = (java.sql.Timestamp JavaDoc) obj[SystemTablesFields.routines_created];
130       LAST_ALTERED = (java.sql.Timestamp JavaDoc) obj[SystemTablesFields.routines_last_altered];
131    }
132
133    public void save(_ServerSession user_session) throws DException {
134       Object JavaDoc[] values = new Object JavaDoc[] {
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 JavaDoc(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 JavaDoc[] {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 JavaDoc[] {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 JavaDoc[] columnValues = new Object JavaDoc[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 JavaDoc[] tableName = (String JavaDoc[]) 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 JavaDoc[] columnValues = new Object JavaDoc[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 JavaDoc[] columnName = (String JavaDoc[]) 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 JavaDoc 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 JavaDoc[] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME});
251
252    }
253
254    private void dropParametersEntry(_ServerSession serverSession) throws DException {
255       String JavaDoc deleteParameters = "select * from " + SystemTables.parameters_TableName
256           + " where specific_catalog= ? and specific_schema= ? and specific_name= ? ";
257       String JavaDoc 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 JavaDoc[] {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 JavaDoc[] {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    /**
286     * Load all information(Such as table_catalog, table_schema, table_name) from routine_table_usage
287     * system table according to schema qualified routine name. */

288    private void loadTableUsage(_ServerSession serverSession) throws DException {
289       loadTableUsed(SqlSchemaConstants.getIterator(serverSession,
290           selectRoutineTableUsageQuery,
291           new Object JavaDoc[] {SPECIFIC_CATALOG,
292           SPECIFIC_SCHEMA, SPECIFIC_NAME}));
293    }
294
295    /**
296     * Load all information(Such as table_catalog, table_schema, table_name) from routine_table_usage
297     * system table according to schema qualified routine name. */

298    private void loadTableUsed(_SelectQueryIterator routineTableUsageIterator) throws
299        DException {
300       tablesUsed = new ArrayList();
301       if (routineTableUsageIterator.first()) {
302          do {
303             Object JavaDoc[] values = (Object JavaDoc[]) routineTableUsageIterator.getObject();
304             tablesUsed.add(new String JavaDoc[] { (String JavaDoc) values[0], (String JavaDoc) values[1],
305                            (String JavaDoc) values[2]});
306          } while (routineTableUsageIterator.next());
307       }
308    }
309
310    /**
311     * Load all information(Such as table_catalog, table_schema, table_name,column_name) from routine_colum_usage
312     * system table according to schema qualified routine name. */

313    private void loadColumnUsage(_ServerSession serverSession) throws DException {
314       loadColumnUsed(SqlSchemaConstants.getIterator(serverSession,
315           selcetRoutineColumnUsageQuery,
316           new Object JavaDoc[] {SPECIFIC_CATALOG,
317           SPECIFIC_SCHEMA, SPECIFIC_NAME}));
318    }
319
320    /**
321     * Load all information(Such as table_catalog, table_schema, table_name,column_name) from routine_colum_usage
322     * system table according to schema qualified routine name. */

323    private void loadColumnUsed(_SelectQueryIterator routineColumnUsageIterator) throws
324        DException {
325       columnsUsed = new ArrayList();
326       if (routineColumnUsageIterator.first()) {
327          do {
328             Object JavaDoc[] values = (Object JavaDoc[]) routineColumnUsageIterator.getObject();
329             columnsUsed.add(new String JavaDoc[] { (String JavaDoc) values[0], (String JavaDoc) values[1],
330                             (String JavaDoc) values[2], (String JavaDoc) values[3]});
331          } while (routineColumnUsageIterator.next());
332       }
333    }
334
335    /**
336     * Remove all information of tables(which are used for a particular routine) from routine_table_usage system table */

337    private void deleteRoutineTableUsage(_ServerSession serverSession) throws DException {
338       TableDetails tableDetail = new TableDetails();
339       tableDetail.setTableName(SqlSchemaConstants.routine_table_usage_TableName.getTableName());
340       String JavaDoc 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 JavaDoc[] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}), 1);
347       SqlSchemaConstants.deleteAll(serverSession.getSystemServerSession(), SqlSchemaConstants.routine_table_usage_TableName, iter);
348    }
349
350    /**
351     * Remove all information of columns(which are used for a particular routine) from routine_colum_usage system table */

352    private void deleteRoutineColumnUsage(_ServerSession serverSession) throws DException {
353       TableDetails tableDetail = new TableDetails();
354       tableDetail.setTableName(SqlSchemaConstants.routine_column_usage_TableName.getTableName());
355       String JavaDoc 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 JavaDoc[] {SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME}), 1);
362       SqlSchemaConstants.deleteAll(serverSession.getSystemServerSession(), SqlSchemaConstants.routine_column_usage_TableName, iter);
363    }
364 }
365
Popular Tags