From a630861165707a04d5e152f13db8c1aa05cbf33f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6hrl?= Date: Fri, 4 May 2018 15:18:08 +0200 Subject: [PATCH 1/2] Improve Sqlite Ddl change support --- .../db/platform/AbstractDdlBuilder.java | 22 +++++---- .../db/platform/sqlite/SqliteDdlBuilder.java | 47 +++++++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java index 67b08c88a3..07149e52a5 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java @@ -821,14 +821,8 @@ protected void processTableStructureChanges(Database currentModel, Database desi Table realTargetTable = getRealTargetTableFor(desiredModel, sourceTable, targetTable); - dropTemporaryTable(tempTable, ddl); - createTemporaryTable(tempTable, ddl); - writeCopyDataStatement(sourceTable, tempTable, ddl); - /* - * Note that we don't drop the indices here because the DROP TABLE will take - * care of that Likewise, foreign keys have already been dropped as necessary - */ - dropTable(sourceTable, ddl, false, true); + renameTable(sourceTable, tempTable, ddl); + createTable(realTargetTable, ddl, false, true); if (canMigrateData) { writeCopyDataStatement(tempTable, targetTable, ddl); @@ -839,6 +833,18 @@ protected void processTableStructureChanges(Database currentModel, Database desi ddl.append(tableDdl); } } + + protected void renameTable(Table sourceTable, Table tempTable, StringBuilder ddl) { + dropTemporaryTable(tempTable, ddl); + createTemporaryTable(tempTable, ddl); + writeCopyDataStatement(sourceTable, tempTable, ddl); + /* + * Note that we don't drop the indices here because the DROP + * TABLE will take care of that Likewise, foreign keys have + * already been dropped as necessary + */ + dropTable(sourceTable, ddl, false, true); + } protected Database copy(Database currentModel) { try { diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java index 01725fe2a5..28d2ef2c64 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java @@ -22,7 +22,11 @@ import java.sql.Connection; import java.sql.Types; +import java.util.Collection; +import java.util.Iterator; +import org.apache.commons.lang.StringUtils; +import org.jumpmind.db.alter.*; import org.jumpmind.db.model.Column; import org.jumpmind.db.model.Database; import org.jumpmind.db.model.ForeignKey; @@ -179,4 +183,47 @@ protected void createTable(Table table, StringBuilder ddl, boolean temporary, bo super.createTable(table, ddl, temporary, recreate); } + @Override + protected void renameTable(Table sourceTable, Table tempTable, StringBuilder ddl) { + dropTemporaryTable(tempTable, ddl); + + for(IIndex index : sourceTable.getIndices()) { + writeExternalIndexDropStmt(tempTable, index, ddl); + } + + ddl.append("ALTER TABLE "); + ddl.append(getFullyQualifiedTableNameShorten(sourceTable)); + ddl.append(" RENAME TO "); + ddl.append(getFullyQualifiedTableNameShorten(tempTable)); + printEndOfStatement(ddl); + } + + @Override + protected void processTableStructureChanges(Database currentModel, Database desiredModel, Collection changes, StringBuilder ddl) { + for (Iterator changeIt = changes.iterator(); changeIt.hasNext();) { + TableChange change = changeIt.next(); + + if (change instanceof AddColumnChange) { + AddColumnChange addColumnChange = (AddColumnChange) change; + processChange(currentModel, desiredModel, addColumnChange, ddl); + changeIt.remove(); + } + } + + super.processTableStructureChanges(currentModel, desiredModel, changes, ddl); + } + + /* + * Processes the addition of a column to a table. + */ + protected void processChange(Database currentModel, Database desiredModel, + AddColumnChange change, StringBuilder ddl) { + ddl.append("ALTER TABLE "); + ddl.append(getFullyQualifiedTableNameShorten(change.getChangedTable())); + printIndent(ddl); + ddl.append("ADD "); + writeColumn(change.getChangedTable(), change.getNewColumn(), ddl); + printEndOfStatement(ddl); + change.apply(currentModel, delimitedIdentifierModeOn); + } } From fb3bb1959f446450f8338c7ac94d769be7a3f150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6hrl?= Date: Fri, 4 May 2018 15:19:37 +0200 Subject: [PATCH 2/2] Quote default values with parenthesis on sqlite --- .../org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java index 28d2ef2c64..3cbb51f332 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDdlBuilder.java @@ -171,6 +171,13 @@ protected String mapDefaultValue(Object defaultValue, int typeCode) { return super.mapDefaultValue(defaultValue, typeCode); } + @Override + protected void writeColumnDefaultValue(Table table, Column column, StringBuilder ddl) { + ddl.append("("); + super.writeColumnDefaultValue(table, column, ddl); + ddl.append(")"); + } + @Override protected void createTable(Table table, StringBuilder ddl, boolean temporary, boolean recreate) { // SQL Lite does not allow auto increment columns on a composite primary key. Solution is to turn off