diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/SymmetricAdmin.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/SymmetricAdmin.java index 0576d22135..b76bb74083 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/SymmetricAdmin.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/SymmetricAdmin.java @@ -123,6 +123,7 @@ public class SymmetricAdmin extends AbstractCommandLauncher { private static final String OPTION_EXCLUDE_DEFAULTS = "exclude-defaults"; private static final String OPTION_EXCLUDE_LOG4J = "exclude-log4j"; private static final String OPTION_EXTERNAL_SECURITY = "external-security"; + private static final String OPTION_ALTERS = "alters"; private static final int WIDTH = 120; private static final int PAD = 3; @@ -252,6 +253,9 @@ private void printHelpCommand(CommandLine line) { addOption(options, null, OPTION_EXCLUDE_LOG4J, false); addOption(options, null, OPTION_EXTERNAL_SECURITY, false); } + if (cmd.equals(CMD_EXPORT_SYM_TABLES)) { + addOption(options, null, OPTION_ALTERS, false); + } if (options.getOptions().size() > 0) { format.printWrapped(writer, WIDTH, "\nOptions:"); format.printOptions(writer, WIDTH, options, PAD, PAD); @@ -287,6 +291,7 @@ protected void buildOptions(Options options) { addOption(options, null, OPTION_EXCLUDE_DEFAULTS, false); addOption(options, null, OPTION_EXCLUDE_LOG4J, false); addOption(options, null, OPTION_EXTERNAL_SECURITY, false); + addOption(options, null, OPTION_ALTERS, false); buildCryptoOptions(options); } @@ -704,10 +709,14 @@ private void generateWar(CommandLine line, List args) throws Exception { private void exportSymTables(CommandLine line, List args) throws IOException { OutputStreamWriter os = getWriter(args); - os.write(getSymmetricEngine().getSymmetricDialect().getCreateSymmetricDDL()); + if (line.hasOption(OPTION_ALTERS)) { + os.write(getSymmetricEngine().getSymmetricDialect().getSymmetricDdlChanges()); + } else { + os.write(getSymmetricEngine().getSymmetricDialect().getCreateSymmetricDDL()); + } os.close(); } - + private void exportDefaultProperties(CommandLine line, List args) throws IOException { OutputStreamWriter os = getWriter(args); BufferedReader is = new BufferedReader(new InputStreamReader( diff --git a/symmetric-client/src/main/resources/symmetric-messages.properties b/symmetric-client/src/main/resources/symmetric-messages.properties index 4d63575b81..4b32fd464c 100644 --- a/symmetric-client/src/main/resources/symmetric-messages.properties +++ b/symmetric-client/src/main/resources/symmetric-messages.properties @@ -100,7 +100,7 @@ SymAdmin.Usage.uninstall= SymAdmin.Usage.backup-config= SymAdmin.Usage.restore-config= SymAdmin.Usage.module=[install | remove | list-files | list | list-all | upgrade | convert] -SymAdmin.Help.export-sym-tables=Output the SQL to create the SymmetricDS tables. If a filename is given, the SQL statements are written to it, otherwise standard output is used. +SymAdmin.Help.export-sym-tables=Output the SQL to create the SymmetricDS tables. If --alters is specified, then alters to the existing tables will be output. If a filename is given, the SQL statements are written to it, otherwise standard output is used. SymAdmin.Help.run-job=Run one of the scheduled jobs immediately. SymAdmin.Help.list-engines=List each engine name and properties file configured on this instance. SymAdmin.Help.run-purge=Run the purge process against the configured database. @@ -139,6 +139,7 @@ SymAdmin.Option.exclude-fk=Don't send foreign key constraints SymAdmin.Option.exclude-indices=Don't send indices SymAdmin.Option.exclude-log4j=Exclude log4j logging framework and configuration SymAdmin.Option.external-security=Use security files outside of the WAR file for encryption keys and certificates +SymAdmin.Option.alters=DDL changes necessary to alter tables will be output DbExport.Option.compatible=Change export to be compatible with given database: db2, db2zos, derby, firebird, greenplum, h2, hsqldb, hsqldb2, informix, interbase, mssql, mysql, oracle, postgres, sybase. DbExport.Option.add-drop-table=Add drop table commands to output. diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java index 3145d7051a..7e89f6b5b1 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java @@ -139,6 +139,18 @@ public AbstractSymmetricDialect(IParameterService parameterService, IDatabasePla return valueMap; }); } + + public String getSymmetricDdlChanges() { + Database modelFromXml = readSymmetricSchemaFromXml(); + Database modelFromDatabase = readSymmetricSchemaFromDatabase(); + List alterDatabaseInterceptors = extensionService + .getExtensionPointList(IAlterDatabaseInterceptor.class); + IAlterDatabaseInterceptor[] interceptors = alterDatabaseInterceptors + .toArray(new IAlterDatabaseInterceptor[alterDatabaseInterceptors.size()]); + IDdlBuilder builder = platform.getDdlBuilder(); + String alterSql = builder.alterDatabase(modelFromDatabase, modelFromXml, interceptors); + return alterSql; + } public boolean requiresAutoCommitFalseToSetFetchSize() { return false; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java index b779ec0ea8..c6ccc19211 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java @@ -255,6 +255,8 @@ public List createPurgeSqlForMultipleTables(Node node, TriggerRouter tri public String getTablePrefix(); public Database readSymmetricSchemaFromXml(); + + public String getSymmetricDdlChanges(); public String getTemplateNumberPrecisionSpec();