Author: tomdz Date: Sun Jun 18 02:08:28 2006 New Revision: 415113 URL: http://svn.apache.org/viewvc?rev=415113&view=rev Log: Changed auto-increment support in McKoi to use sequences rather than UNIQUEKEY
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiModelReader.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiPlatform.java db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMcKoiPlatform.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiBuilder.java?rev=415113&r1=415112&r2=415113&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiBuilder.java Sun Jun 18 02:08:28 2006 @@ -17,10 +17,15 @@ */ import java.io.IOException; +import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.ddlutils.Platform; +import org.apache.ddlutils.alteration.AddColumnChange; +import org.apache.ddlutils.alteration.ColumnAutoIncrementChange; +import org.apache.ddlutils.alteration.RemoveColumnChange; +import org.apache.ddlutils.alteration.TableChange; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; import org.apache.ddlutils.model.Table; @@ -52,11 +57,69 @@ /** * [EMAIL PROTECTED] */ + public void createTable(Database database, Table table, Map parameters) throws IOException + { + // we use sequences instead of the UNIQUEKEY function because this way + // we can read their values back + Column[] columns = table.getAutoIncrementColumns(); + + for (int idx = 0; idx < columns.length; idx++) + { + createAutoIncrementSequence(table, columns[idx]); + } + + super.createTable(database, table, parameters); + } + + /** + * [EMAIL PROTECTED] + */ public void dropTable(Table table) throws IOException { print("DROP TABLE IF EXISTS "); printIdentifier(getTableName(table)); printEndOfStatement(); + + Column[] columns = table.getAutoIncrementColumns(); + + for (int idx = 0; idx < columns.length; idx++) + { + dropAutoIncrementSequence(table, columns[idx]); + } + } + + /** + * Creates the sequence necessary for the auto-increment of the given column. + * + * @param table The table + * @param column The column + */ + protected void createAutoIncrementSequence(Table table, + Column column) throws IOException + { + print("CREATE SEQUENCE "); + printIdentifier(getConstraintName("seq", + table, + column.getName(), + null)); + printEndOfStatement(); + } + + /** + * Drops the sequence used for the auto-increment of the given column. + * + * @param table The table + * @param column The column + */ + protected void dropAutoIncrementSequence(Table table, + Column column) throws IOException + { + print("DROP SEQUENCE "); + printIdentifier(getConstraintName("seq", + table, + column.getName(), + null)); + printEndOfStatement(); } /** @@ -67,8 +130,8 @@ if (column.isAutoIncrement()) { // we start at value 1 to avoid issues with jdbc - print("UNIQUEKEY('"); - print(getTableName(table)); + print("NEXTVAL('"); + print(getConstraintName("seq", table, column.getName(), null)); print("')"); } else @@ -80,6 +143,36 @@ /** * [EMAIL PROTECTED] */ + public String getSelectLastIdentityValues(Table table) + { + Column[] columns = table.getAutoIncrementColumns(); + + if (columns.length > 0) + { + StringBuffer result = new StringBuffer(); + + result.append("SELECT "); + for (int idx = 0; idx < columns.length; idx++) + { + if (idx > 0) + { + result.append(","); + } + result.append("CURRVAL('"); + result.append(getConstraintName("seq", table, columns[idx].getName(), null)); + result.append("')"); + } + return result.toString(); + } + else + { + return null; + } + } + + /** + * [EMAIL PROTECTED] + */ protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, @@ -88,8 +181,67 @@ List changes) throws IOException { // McKoi has this nice ALTER CREATE TABLE statement which saves us a lot of work + // We only have to handle auto-increment changes manually + for (Iterator it = changes.iterator(); it.hasNext();) + { + TableChange change = (TableChange)it.next(); + + if (change instanceof ColumnAutoIncrementChange) + { + Column column = ((ColumnAutoIncrementChange)change).getColumn(); + + // we have to defer removal of the sequences until they are no longer used + if (!column.isAutoIncrement()) + { + ColumnAutoIncrementChange autoIncrChange = (ColumnAutoIncrementChange)change; + + createAutoIncrementSequence(autoIncrChange.getChangedTable(), + autoIncrChange.getColumn()); + } + } + else if (change instanceof AddColumnChange) + { + AddColumnChange addColumnChange = (AddColumnChange)change; + + if (addColumnChange.getNewColumn().isAutoIncrement()) + { + createAutoIncrementSequence(addColumnChange.getChangedTable(), + addColumnChange.getNewColumn()); + } + } + } + print("ALTER "); - createTable(desiredModel, targetTable, parameters); - } + super.createTable(desiredModel, targetTable, parameters); + for (Iterator it = changes.iterator(); it.hasNext();) + { + TableChange change = (TableChange)it.next(); + + if (change instanceof ColumnAutoIncrementChange) + { + Column column = ((ColumnAutoIncrementChange)change).getColumn(); + + if (column.isAutoIncrement()) + { + ColumnAutoIncrementChange autoIncrChange = (ColumnAutoIncrementChange)change; + + dropAutoIncrementSequence(autoIncrChange.getChangedTable(), + autoIncrChange.getColumn()); + } + } + else if (change instanceof RemoveColumnChange) + { + RemoveColumnChange removeColumnChange = (RemoveColumnChange)change; + + if (removeColumnChange.getColumn().isAutoIncrement()) + { + dropAutoIncrementSequence(removeColumnChange.getChangedTable(), + removeColumnChange.getColumn()); + } + } + } + changes.clear(); + } } + Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiModelReader.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiModelReader.java?rev=415113&r1=415112&r2=415113&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiModelReader.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiModelReader.java Sun Jun 18 02:08:28 2006 @@ -26,6 +26,7 @@ import org.apache.ddlutils.Platform; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Table; +import org.apache.ddlutils.model.TypeMap; import org.apache.ddlutils.platform.DatabaseMetaDataWrapper; import org.apache.ddlutils.platform.JdbcModelReader; @@ -112,10 +113,18 @@ String defaultValue = column.getDefaultValue(); - if ((defaultValue != null) && defaultValue.startsWith("UNIQUEKEY(")) + if (defaultValue != null) { - column.setDefaultValue(null); - column.setAutoIncrement(true); + if (defaultValue.toLowerCase().startsWith("nextval('") || + defaultValue.toLowerCase().startsWith("uniquekey('")) + { + column.setDefaultValue(null); + column.setAutoIncrement(true); + } + else if (TypeMap.isTextType(column.getTypeCode())) + { + column.setDefaultValue(unescape(column.getDefaultValue(), "'", "\\'")); + } } return column; } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiPlatform.java?rev=415113&r1=415112&r2=415113&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiPlatform.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mckoi/MckoiPlatform.java Sun Jun 18 02:08:28 2006 @@ -55,6 +55,7 @@ info.setIndicesSupported(false); info.setIndicesEmbedded(true); info.setDefaultValueUsedForIdentitySpec(true); + info.setAutoCommitModeForLastIdentityValueReading(false); info.addNativeTypeMapping(Types.ARRAY, "BLOB", Types.BLOB); info.addNativeTypeMapping(Types.DISTINCT, "BLOB", Types.BLOB); Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMcKoiPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMcKoiPlatform.java?rev=415113&r1=415112&r2=415113&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMcKoiPlatform.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMcKoiPlatform.java Sun Jun 18 02:08:28 2006 @@ -133,15 +133,19 @@ // note that this is not valid SQL as obviously only one auto increment field // can be defined for each table assertEqualsIgnoringWhitespaces( - "DROP TABLE IF EXISTS \"constraints\";\n" + + "DROP TABLE IF EXISTS \"constraints\";\n"+ + "DROP SEQUENCE \"seq_constraints_COL_PK_AUTO_INCR\";\n"+ + "DROP SEQUENCE \"seq_constraints_COL_AUTO_INCR\";\n"+ + "CREATE SEQUENCE \"seq_constraints_COL_PK_AUTO_INCR\";\n"+ + "CREATE SEQUENCE \"seq_constraints_COL_AUTO_INCR\";\n"+ "CREATE TABLE \"constraints\"\n"+ "(\n"+ " \"COL_PK\" VARCHAR(32),\n"+ - " \"COL_PK_AUTO_INCR\" INTEGER DEFAULT UNIQUEKEY('constraints'),\n"+ + " \"COL_PK_AUTO_INCR\" INTEGER DEFAULT NEXTVAL('seq_constraints_COL_PK_AUTO_INCR'),\n"+ " \"COL_NOT_NULL\" BINARY(100) NOT NULL,\n"+ " \"COL_NOT_NULL_DEFAULT\" DOUBLE DEFAULT -2.0 NOT NULL,\n"+ " \"COL_DEFAULT\" CHAR(4) DEFAULT 'test',\n"+ - " \"COL_AUTO_INCR\" BIGINT DEFAULT UNIQUEKEY('constraints'),\n"+ + " \"COL_AUTO_INCR\" BIGINT DEFAULT NEXTVAL('seq_constraints_COL_AUTO_INCR'),\n"+ " PRIMARY KEY (\"COL_PK\", \"COL_PK_AUTO_INCR\")\n"+ ");\n", createTestDatabase(COLUMN_CONSTRAINT_TEST_SCHEMA));