Skip to content

Commit

Permalink
SYMMETRICDS-606 - Add -D system property org.jumpmind.symmetric.ddl.u…
Browse files Browse the repository at this point in the history
…se.table.seq that forces postgres to NOT use sequences for SymmetricDS tables that have auto increment columns
  • Loading branch information
chenson42 committed Apr 13, 2012
1 parent 9fafa71 commit a915025
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 23 deletions.
Expand Up @@ -98,6 +98,10 @@ public PostgreSqlDatabasePlatform(DataSource dataSource, DatabasePlatformSetting
ddlBuilder = new PostgreSqlDdlBuilder(this);
}

public static boolean isUsePseudoSequence() {
return "true".equalsIgnoreCase(System.getProperty("org.jumpmind.symmetric.ddl.use.table.seq", "false"));
}

protected static DatabasePlatformSettings overrideSettings(DatabasePlatformSettings settings) {
// Query timeout needs to be zero for postrgres because the jdbc driver does
// not support a timeout setting of of other than zero.
Expand Down
Expand Up @@ -36,7 +36,7 @@
* The SQL Builder for PostgresSql.
*/
public class PostgreSqlDdlBuilder extends AbstractDdlBuilder {

public PostgreSqlDdlBuilder(IDatabasePlatform platform) {
super(platform);

Expand All @@ -52,7 +52,7 @@ public PostgreSqlDdlBuilder(IDatabasePlatform platform) {
}

@Override
public void dropTable(Table table, StringBuilder ddl) {
public void dropTable(Table table, StringBuilder ddl) {
ddl.append("DROP TABLE ");
printIdentifier(getTableName(table.getName()), ddl);
ddl.append(" CASCADE");
Expand All @@ -66,14 +66,14 @@ public void dropTable(Table table, StringBuilder ddl) {
}

@Override
public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder ddl) {
public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder ddl) {
ddl.append("DROP INDEX ");
printIdentifier(getIndexName(index), ddl);
printEndOfStatement(ddl);
}

@Override
public void createTable(Table table, StringBuilder ddl) {
public void createTable(Table table, StringBuilder ddl) {
for (int idx = 0; idx < table.getColumnCount(); idx++) {
Column column = table.getColumn(idx);

Expand All @@ -91,10 +91,40 @@ public void createTable(Table table, StringBuilder ddl) {
*
* @param column The column
*/
private void createAutoIncrementSequence(Table table, Column column, StringBuilder ddl) {
ddl.append("CREATE SEQUENCE ");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
printEndOfStatement(ddl);
private void createAutoIncrementSequence(Table table, Column column, StringBuilder ddl) {
if (PostgreSqlDatabasePlatform.isUsePseudoSequence()) {
ddl.append("CREATE TABLE ");
ddl.append(getConstraintName(null, table, column.getName(), "tbl"));
ddl.append("(SEQ_ID int8)");
printEndOfStatement(ddl);

ddl.append("CREATE FUNCTION ");
ddl.append(getConstraintName(null, table, column.getName(), "seq"));
ddl.append("() ");
ddl.append("RETURNS INT8 AS $$ ");
ddl.append("DECLARE curVal int8; ");
ddl.append("BEGIN ");
ddl.append(" select seq_id into curVal from ");
ddl.append(getConstraintName(null, table, column.getName(), "tbl"));
ddl.append(" for update;");
ddl.append(" if curVal is null then ");
ddl.append(" insert into ");
ddl.append(getConstraintName(null, table, column.getName(), "tbl"));
ddl.append(" values(1); ");
ddl.append(" curVal = 0; ");
ddl.append(" else ");
ddl.append(" update ");
ddl.append(getConstraintName(null, table, column.getName(), "tbl"));
ddl.append(" set seq_id=curVal+1; ");
ddl.append(" end if; ");
ddl.append(" return curVal+1; ");
ddl.append("END; ");
println("$$ LANGUAGE plpgsql; ", ddl);
} else {
ddl.append("CREATE SEQUENCE ");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
printEndOfStatement(ddl);
}
}

/*
Expand All @@ -104,17 +134,34 @@ private void createAutoIncrementSequence(Table table, Column column, StringBuild
*
* @param column The column
*/
private void dropAutoIncrementSequence(Table table, Column column, StringBuilder ddl) {
ddl.append("DROP SEQUENCE ");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
printEndOfStatement(ddl);
private void dropAutoIncrementSequence(Table table, Column column, StringBuilder ddl) {
if (PostgreSqlDatabasePlatform.isUsePseudoSequence()) {
ddl.append("DROP TABLE ");
ddl.append(getConstraintName(null, table, column.getName(), "tbl"));
printEndOfStatement(ddl);

ddl.append("DROP FUNCTION ");
ddl.append(getConstraintName(null, table, column.getName(), "seq"));
ddl.append("()");
printEndOfStatement(ddl);
} else {
ddl.append("DROP SEQUENCE ");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
printEndOfStatement(ddl);
}
}

@Override
protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBuilder ddl) {
ddl.append(" DEFAULT nextval('");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
ddl.append("')");
protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBuilder ddl) {
if (PostgreSqlDatabasePlatform.isUsePseudoSequence()) {
ddl.append(" DEFAULT ");
ddl.append(getConstraintName(null, table, column.getName(), "seq"));
ddl.append("()");
} else {
ddl.append(" DEFAULT nextval('");
printIdentifier(getConstraintName(null, table, column.getName(), "seq"), ddl);
ddl.append("')");
}
}

@Override
Expand Down Expand Up @@ -143,7 +190,7 @@ public String getSelectLastIdentityValues(Table table) {

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel,
Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext();) {
TableChange change = changeIt.next();

Expand Down Expand Up @@ -187,7 +234,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi
* @param change The change object
*/
protected void processChange(Database currentModel, Database desiredModel,
AddColumnChange change, StringBuilder ddl) {
AddColumnChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand All @@ -207,7 +254,7 @@ protected void processChange(Database currentModel, Database desiredModel,
* @param change The change object
*/
protected void processChange(Database currentModel, Database desiredModel,
RemoveColumnChange change, StringBuilder ddl) {
RemoveColumnChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand Down
Expand Up @@ -12,17 +12,21 @@ public PostgreSqlJdbcSqlTemplate(DataSource dataSource, DatabasePlatformSettings
LobHandler lobHandler) {
super(dataSource, settings, lobHandler);
this.requiresAutoCommitFalseToSetFetchSize = true;
primaryKeyViolationSqlStates = new String[] {"23505"};
primaryKeyViolationSqlStates = new String[] { "23505" };
}

@Override
public String getSelectLastInsertIdSql(String sequenceName) {
return "select currval('" + sequenceName + "_seq')";
if (PostgreSqlDatabasePlatform.isUsePseudoSequence()) {
return "select seq_id from " + sequenceName + "_tbl";
} else {
return "select currval('" + sequenceName + "_seq')";
}
}

@Override
protected boolean allowsNullForIdentityColumn() {
return false;
}

}

0 comments on commit a915025

Please sign in to comment.