Author: tomdz Date: Sun Jul 23 22:41:30 2006 New Revision: 424910 URL: http://svn.apache.org/viewvc?rev=424910&view=rev Log: Added script mode to the SQL generation to allow platforms to create different SQL depending on whether it will be executed directly via JDBC or output to a file Added Oracle support for SQL script generation which uses a forward slash to delimit PL/SQL code
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java?rev=424910&r1=424909&r2=424910&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java Sun Jul 23 22:41:30 2006 @@ -113,6 +113,24 @@ // runtime properties /** + * Determines whether script mode is on. This means that the generated SQL is not + * intended to be sent directly to the database but rather to be saved in a SQL + * script file. Per default, script mode is off. + * + * @return <code>true</code> if script mode is on + */ + public boolean isScriptModeOn(); + + /** + * Specifies whether script mode is on. This means that the generated SQL is not + * intended to be sent directly to the database but rather to be saved in a SQL + * script file. + * + * @param scriptModeOn <code>true</code> if script mode is on + */ + public void setScriptModeOn(boolean scriptModeOn); + + /** * Determines whether delimited identifiers are used or normal SQL92 identifiers * (which may only contain alphanumerical characters and the underscore, must start * with a letter and cannot be a reserved keyword). Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java?rev=424910&r1=424909&r2=424910&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java Sun Jul 23 22:41:30 2006 @@ -78,12 +78,14 @@ private SqlBuilder _builder; /** The model reader for this platform. */ private JdbcModelReader _modelReader; + /** Whether script mode is on. */ + private boolean _scriptModeOn; /** Whether SQL comments are generated or not. */ private boolean _sqlCommentsOn = true; /** Whether delimited identifiers are used or not. */ - private boolean _delimitedIdentifierModeOn = false; + private boolean _delimitedIdentifierModeOn; /** Whether read foreign keys shall be sorted alphabetically. */ - private boolean _foreignKeysSorted = false; + private boolean _foreignKeysSorted; /** * [EMAIL PROTECTED] @@ -131,6 +133,22 @@ public PlatformInfo getPlatformInfo() { return _info; + } + + /** + * [EMAIL PROTECTED] + */ + public boolean isScriptModeOn() + { + return _scriptModeOn; + } + + /** + * [EMAIL PROTECTED] + */ + public void setScriptModeOn(boolean scriptModeOn) + { + _scriptModeOn = scriptModeOn; } /** Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java?rev=424910&r1=424909&r2=424910&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java Sun Jul 23 22:41:30 2006 @@ -149,28 +149,53 @@ String columnName = getColumnName(column); String triggerName = getConstraintName("trg", table, column.getName(), null); - // note that the BEGIN ... SELECT ... END; is all in one line and does - // not contain a semicolon except for the END-one - // this way, the tokenizer will not split the statement before the END - print("CREATE OR REPLACE TRIGGER "); - printIdentifier(triggerName); - print(" BEFORE INSERT ON "); - printIdentifier(getTableName(table)); - print(" FOR EACH ROW WHEN (new."); - printIdentifier(columnName); - println(" IS NULL)"); - print("BEGIN SELECT "); - printIdentifier(getConstraintName("seq", table, column.getName(), null)); - print(".nextval INTO :new."); - printIdentifier(columnName); - print(" FROM dual"); - print(getPlatformInfo().getSqlCommandDelimiter()); - print(" END"); - // It is important that there is a semicolon at the end of the statement (or more - // precisely, at the end of the PL/SQL block), and thus we put two semicolons here - // because the tokenizer will remove the one at the end - print(getPlatformInfo().getSqlCommandDelimiter()); - printEndOfStatement(); + if (getPlatform().isScriptModeOn()) + { + // For the script, we output a more nicely formatted version + print("CREATE OR REPLACE TRIGGER "); + printlnIdentifier(triggerName); + print("BEFORE INSERT ON "); + printlnIdentifier(getTableName(table)); + print("FOR EACH ROW WHEN (new."); + printIdentifier(columnName); + println(" IS NULL)"); + println("BEGIN"); + print(" SELECT "); + printIdentifier(getConstraintName("seq", table, column.getName(), null)); + print(".nextval INTO :new."); + printIdentifier(columnName); + print(" FROM dual"); + println(getPlatformInfo().getSqlCommandDelimiter()); + print("END"); + println(getPlatformInfo().getSqlCommandDelimiter()); + println("/"); + println(); + } + else + { + // note that the BEGIN ... SELECT ... END; is all in one line and does + // not contain a semicolon except for the END-one + // this way, the tokenizer will not split the statement before the END + print("CREATE OR REPLACE TRIGGER "); + printIdentifier(triggerName); + print(" BEFORE INSERT ON "); + printIdentifier(getTableName(table)); + print(" FOR EACH ROW WHEN (new."); + printIdentifier(columnName); + println(" IS NULL)"); + print("BEGIN SELECT "); + printIdentifier(getConstraintName("seq", table, column.getName(), null)); + print(".nextval INTO :new."); + printIdentifier(columnName); + print(" FROM dual"); + print(getPlatformInfo().getSqlCommandDelimiter()); + print(" END"); + // It is important that there is a semicolon at the end of the statement (or more + // precisely, at the end of the PL/SQL block), and thus we put two semicolons here + // because the tokenizer will remove the one at the end + print(getPlatformInfo().getSqlCommandDelimiter()); + printEndOfStatement(); + } } /** Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java?rev=424910&r1=424909&r2=424910&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java Sun Jul 23 22:41:30 2006 @@ -115,6 +115,7 @@ { FileWriter writer = new FileWriter(_outputFile); + platform.setScriptModeOn(true); if (platform.getPlatformInfo().isSqlCommentsSupported()) { // we're generating SQL comments if possible Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java?rev=424910&r1=424909&r2=424910&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java Sun Jul 23 22:41:30 2006 @@ -90,6 +90,7 @@ boolean isCaseSensitive = platform.isDelimitedIdentifierModeOn(); CreationParameters params = getFilteredParameters(model, platform.getName(), isCaseSensitive); + platform.setScriptModeOn(false); // we're disabling the comment generation because we're writing directly to the database platform.setSqlCommentsOn(false); try