--- /dev/null
+/*\r
+\r
+ Derby - Class org.apache.derby.impl.sql.catalog.SYSFOREIGNKEYSRowFactory\r
+\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to you under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
+*/\r
+\r
+package org.apache.derby.impl.sql.catalog;\r
+\r
+import java.sql.Types;\r
+\r
+import org.apache.derby.catalog.UUID;\r
+import org.apache.derby.iapi.error.StandardException;\r
+import org.apache.derby.iapi.services.sanity.SanityManager;\r
+import org.apache.derby.iapi.services.uuid.UUIDFactory;\r
+import org.apache.derby.iapi.sql.StatementType;\r
+import org.apache.derby.iapi.sql.dictionary.CatalogRowFactory;\r
+import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;\r
+import org.apache.derby.iapi.sql.dictionary.DataDictionary;\r
+import org.apache.derby.iapi.sql.dictionary.ForeignKeyConstraintDescriptor;\r
+import org.apache.derby.iapi.sql.dictionary.ReferencedKeyConstraintDescriptor;\r
+import org.apache.derby.iapi.sql.dictionary.SubKeyConstraintDescriptor;\r
+import org.apache.derby.iapi.sql.dictionary.SystemColumn;\r
+import org.apache.derby.iapi.sql.dictionary.TupleDescriptor;\r
+import org.apache.derby.iapi.sql.execute.ExecIndexRow;\r
+import org.apache.derby.iapi.sql.execute.ExecRow;\r
+import org.apache.derby.iapi.sql.execute.ExecutionFactory;\r
+import org.apache.derby.iapi.types.DataValueDescriptor;\r
+import org.apache.derby.iapi.types.DataValueFactory;\r
+import org.apache.derby.iapi.types.SQLChar;\r
+\r
+/**\r
+ * Factory for creating a SYSFOREIGNKEYS row.\r
+ *\r
+ */\r
+\r
+public class SYSFOREIGNKEYSRowFactory extends CatalogRowFactory\r
+{\r
+ private static final String TABLENAME_STRING = "SYSFOREIGNKEYS";\r
+\r
+ protected static final int SYSFOREIGNKEYS_COLUMN_COUNT = 5;\r
+ protected static final int SYSFOREIGNKEYS_CONSTRAINTID = 1;\r
+ protected static final int SYSFOREIGNKEYS_CONGLOMERATEID = 2;\r
+ protected static final int SYSFOREIGNKEYS_KEYCONSTRAINTID = 3;\r
+ protected static final int SYSFOREIGNKEYS_DELETERULE = 4;\r
+ protected static final int SYSFOREIGNKEYS_UPDATERULE = 5;\r
+\r
+ // Column widths\r
+ protected static final int SYSFOREIGNKEYS_CONSTRAINTID_WIDTH = 36;\r
+\r
+ protected static final int SYSFOREIGNKEYS_INDEX1_ID = 0;\r
+ protected static final int SYSFOREIGNKEYS_INDEX2_ID = 1;\r
+\r
+ private static final int[][] indexColumnPositions = \r
+ {\r
+ {SYSFOREIGNKEYS_CONSTRAINTID},\r
+ {SYSFOREIGNKEYS_KEYCONSTRAINTID}\r
+ };\r
+\r
+ private static final boolean[] uniqueness = {\r
+ true,\r
+ false\r
+ };\r
+\r
+ private static final String[] uuids =\r
+ {\r
+ "8000005b-00d0-fd77-3ed8-000a0a0b1900" // catalog UUID\r
+ ,"80000060-00d0-fd77-3ed8-000a0a0b1900" // heap UUID\r
+ ,"8000005d-00d0-fd77-3ed8-000a0a0b1900" // SYSFOREIGNKEYS_INDEX1\r
+ ,"8000005f-00d0-fd77-3ed8-000a0a0b1900" // SYSFOREIGNKEYS_INDEX2\r
+ };\r
+\r
+ /////////////////////////////////////////////////////////////////////////////\r
+ //\r
+ // CONSTRUCTORS\r
+ //\r
+ /////////////////////////////////////////////////////////////////////////////\r
+\r
+ SYSFOREIGNKEYSRowFactory(UUIDFactory uuidf, ExecutionFactory ef, DataValueFactory dvf)\r
+ {\r
+ super(uuidf,ef,dvf);\r
+ initInfo(SYSFOREIGNKEYS_COLUMN_COUNT, TABLENAME_STRING, \r
+ indexColumnPositions, uniqueness, uuids );\r
+ }\r
+\r
+ /////////////////////////////////////////////////////////////////////////////\r
+ //\r
+ // METHODS\r
+ //\r
+ /////////////////////////////////////////////////////////////////////////////\r
+\r
+ /**\r
+ * Make a SYSFOREIGNKEYS row\r
+ *\r
+ * @return Row suitable for inserting into SYSFOREIGNKEYS.\r
+ *\r
+ * @exception StandardException thrown on failure\r
+ */\r
+ public ExecRow makeRow(TupleDescriptor td, TupleDescriptor parent)\r
+ throws StandardException \r
+ {\r
+ DataValueDescriptor col;\r
+ ExecIndexRow row;\r
+ String constraintId = null;\r
+ String keyConstraintId = null;\r
+ String conglomId = null;\r
+ String raDeleteRule="N";\r
+ String raUpdateRule="N";\r
+\r
+ if (td != null)\r
+ {\r
+ ForeignKeyConstraintDescriptor cd = (ForeignKeyConstraintDescriptor)td;\r
+ constraintId = cd.getUUID().toString();\r
+ \r
+ ReferencedKeyConstraintDescriptor refCd = cd.getReferencedConstraint();\r
+ if (SanityManager.DEBUG)\r
+ {\r
+ SanityManager.ASSERT(refCd != null, "this fk returned a null referenced key");\r
+ }\r
+ keyConstraintId = refCd.getUUID().toString();\r
+ conglomId = cd.getIndexUUIDString();\r
+\r
+ raDeleteRule = getRefActionAsString(cd.getRaDeleteRule());\r
+ raUpdateRule = getRefActionAsString(cd.getRaUpdateRule());\r
+ }\r
+ \r
+ \r
+ /* Build the row */\r
+ row = getExecutionFactory().getIndexableRow(SYSFOREIGNKEYS_COLUMN_COUNT);\r
+\r
+ /* 1st column is CONSTRAINTID (UUID - char(36)) */\r
+ row.setColumn(SYSFOREIGNKEYS_CONSTRAINTID, new SQLChar(constraintId));\r
+\r
+ /* 2nd column is CONGLOMERATEID (UUID - char(36)) */\r
+ row.setColumn(SYSFOREIGNKEYS_CONGLOMERATEID, new SQLChar(conglomId));\r
+\r
+ /* 3rd column is KEYCONSTRAINTID (UUID - char(36)) */\r
+ row.setColumn(SYSFOREIGNKEYS_KEYCONSTRAINTID, new SQLChar(keyConstraintId));\r
+\r
+ // currently, DELETERULE and UPDATERULE are always "R" for restrict\r
+ /* 4th column is DELETERULE char(1) */\r
+ row.setColumn(SYSFOREIGNKEYS_DELETERULE, new SQLChar(raDeleteRule));\r
+\r
+ /* 5th column is UPDATERULE char(1) */\r
+ row.setColumn(SYSFOREIGNKEYS_UPDATERULE, new SQLChar(raUpdateRule));\r
+\r
+ return row;\r
+ }\r
+\r
+ ///////////////////////////////////////////////////////////////////////////\r
+ //\r
+ // ABSTRACT METHODS TO BE IMPLEMENTED BY CHILDREN OF CatalogRowFactory\r
+ //\r
+ ///////////////////////////////////////////////////////////////////////////\r
+\r
+ /**\r
+ * Make a ViewDescriptor out of a SYSFOREIGNKEYS row\r
+ *\r
+ * @param row a SYSFOREIGNKEYS row\r
+ * @param parentTupleDescriptor Null for this kind of descriptor.\r
+ * @param dd dataDictionary\r
+ *\r
+ * @exception StandardException thrown on failure\r
+ */\r
+ public TupleDescriptor buildDescriptor(\r
+ ExecRow row,\r
+ TupleDescriptor parentTupleDescriptor,\r
+ DataDictionary dd )\r
+ throws StandardException\r
+ {\r
+\r
+ if (SanityManager.DEBUG)\r
+ {\r
+ SanityManager.ASSERT(\r
+ row.nColumns() == SYSFOREIGNKEYS_COLUMN_COUNT, \r
+ "Wrong number of columns for a SYSKEYS row");\r
+ }\r
+\r
+ DataValueDescriptor col;\r
+ DataDescriptorGenerator ddg;\r
+ UUID constraintUUID;\r
+ UUID conglomerateUUID;\r
+ UUID keyConstraintUUID;\r
+ String constraintUUIDString;\r
+ String conglomerateUUIDString;\r
+ String raRuleString;\r
+ int raDeleteRule;\r
+ int raUpdateRule;\r
+\r
+ ddg = dd.getDataDescriptorGenerator();\r
+\r
+ /* 1st column is CONSTRAINTID (UUID - char(36)) */\r
+ col = row.getColumn(SYSFOREIGNKEYS_CONSTRAINTID);\r
+ constraintUUIDString = col.getString();\r
+ constraintUUID = getUUIDFactory().recreateUUID(constraintUUIDString);\r
+\r
+ /* 2nd column is CONGLOMERATEID (UUID - char(36)) */\r
+ col = row.getColumn(SYSFOREIGNKEYS_CONGLOMERATEID);\r
+ conglomerateUUIDString = col.getString();\r
+ conglomerateUUID = getUUIDFactory().recreateUUID(conglomerateUUIDString);\r
+\r
+ /* 3rd column is KEYCONSTRAINTID (UUID - char(36)) */\r
+ col = row.getColumn(SYSFOREIGNKEYS_KEYCONSTRAINTID);\r
+ constraintUUIDString = col.getString();\r
+ keyConstraintUUID = getUUIDFactory().recreateUUID(constraintUUIDString);\r
+\r
+\r
+ /* 4th column is DELETERULE char(1) */\r
+ col= row.getColumn(SYSFOREIGNKEYS_DELETERULE);\r
+ raRuleString = col.getString();\r
+ raDeleteRule = getRefActionAsInt(raRuleString);\r
+ \r
+ /* 5th column is UPDATERULE char(1) */\r
+ col = row.getColumn(SYSFOREIGNKEYS_UPDATERULE);\r
+ raRuleString = col.getString();\r
+ raUpdateRule = getRefActionAsInt(raRuleString);\r
+\r
+\r
+ /* now build and return the descriptor */\r
+ return new SubKeyConstraintDescriptor(\r
+ constraintUUID,\r
+ conglomerateUUID,\r
+ keyConstraintUUID,\r
+ raDeleteRule,\r
+ raUpdateRule);\r
+ }\r
+\r
+ /**\r
+ * Builds a list of columns suitable for creating this Catalog.\r
+ *\r
+ *\r
+ * @return array of SystemColumn suitable for making this catalog.\r
+ */\r
+ public SystemColumn[] buildColumnList()\r
+ {\r
+ return new SystemColumn[] {\r
+ SystemColumnImpl.getUUIDColumn("CONSTRAINTID", false),\r
+ SystemColumnImpl.getUUIDColumn("CONGLOMERATEID", false),\r
+ SystemColumnImpl.getUUIDColumn("KEYCONSTRAINTID", false),\r
+ SystemColumnImpl.getIndicatorColumn("DELETERULE"),\r
+ SystemColumnImpl.getIndicatorColumn("UPDATERULE"),\r
+ \r
+ };\r
+ }\r
+\r
+\r
+ int getRefActionAsInt(String raRuleString)\r
+ {\r
+ int raRule ;\r
+ switch (raRuleString.charAt(0)){\r
+ case 'C': \r
+ raRule = StatementType.RA_CASCADE;\r
+ break;\r
+ case 'S':\r
+ raRule = StatementType.RA_RESTRICT;\r
+ break;\r
+ case 'R':\r
+ raRule = StatementType.RA_NOACTION;\r
+ break;\r
+ case 'U':\r
+ raRule = StatementType.RA_SETNULL;\r
+ break;\r
+ case 'D':\r
+ raRule = StatementType.RA_SETDEFAULT;\r
+ break;\r
+ default: \r
+ raRule =StatementType.RA_NOACTION; ;\r
+ if (SanityManager.DEBUG)\r
+ {\r
+ SanityManager.THROWASSERT("Invalid value '"\r
+ +raRuleString+ "' for a referetial Action");\r
+ }\r
+ }\r
+ return raRule ;\r
+ }\r
+\r
+\r
+ String getRefActionAsString(int raRule)\r
+ {\r
+ String raRuleString ;\r
+ switch (raRule){\r
+ case StatementType.RA_CASCADE:\r
+ raRuleString = "C";\r
+ break;\r
+ case StatementType.RA_RESTRICT:\r
+ raRuleString = "S";\r
+ break;\r
+ case StatementType.RA_NOACTION:\r
+ raRuleString = "R";\r
+ break;\r
+ case StatementType.RA_SETNULL:\r
+ raRuleString = "U";\r
+ break;\r
+ case StatementType.RA_SETDEFAULT:\r
+ raRuleString = "D";\r
+ raRule = StatementType.RA_SETDEFAULT;\r
+ break;\r
+ default: \r
+ raRuleString ="N" ; // NO ACTION (default value)\r
+ if (SanityManager.DEBUG)\r
+ {\r
+ SanityManager.THROWASSERT("Invalid value '"\r
+ +raRule+ "' for a referetial Action");\r
+ }\r
+\r
+ }\r
+ return raRuleString ;\r
+ }\r
+\r
+\r
+}\r