diff --git a/src/Dbdeploy.Console/OptionsManager.cs b/src/Dbdeploy.Console/OptionsManager.cs index e643f0b..5cb7ca0 100644 --- a/src/Dbdeploy.Console/OptionsManager.cs +++ b/src/Dbdeploy.Console/OptionsManager.cs @@ -87,7 +87,7 @@ private static OptionSet Initialize(DbDeployConfig config, ConfigFileInfo config options .Add( "d|dbms=", - "DBMS type ('mssql', 'mysql' or 'ora')", + "DBMS type ('mssql', 'mysql', 'ora' or 'db2')", s => config.Dbms = s) .Add( diff --git a/src/Net.Sf.Dbdeploy/Database/DatabaseSchemaVersionManager.cs b/src/Net.Sf.Dbdeploy/Database/DatabaseSchemaVersionManager.cs index 4b00608..aecb5b0 100755 --- a/src/Net.Sf.Dbdeploy/Database/DatabaseSchemaVersionManager.cs +++ b/src/Net.Sf.Dbdeploy/Database/DatabaseSchemaVersionManager.cs @@ -129,17 +129,25 @@ public virtual void RecordScriptStatus(ChangeScript script, ScriptStatus status, var completeDateValue = status != ScriptStatus.Started ? this.syntax.CurrentTimestamp : "NULL"; if (script.ChangeId == 0) { + var insertSql = string.Format( + CultureInfo.InvariantCulture, +"INSERT INTO {0} (Folder, ScriptNumber, ScriptName, StartDate, CompleteDate, AppliedBy, ScriptStatus, ScriptOutput) VALUES (@1, @2, @3, {1}, {2}, {3}, @4, @5)", + this.changeLogTableName, + this.syntax.CurrentTimestamp, + completeDateValue, + this.syntax.CurrentUser); + + // Execute insert. + this.queryExecuter.ExecuteQuery(insertSql, script.Folder, script.ScriptNumber, script.ScriptName, (int)status, output ?? string.Empty); + + var sql = string.Format( CultureInfo.InvariantCulture, -@"INSERT INTO {0} (Folder, ScriptNumber, ScriptName, StartDate, CompleteDate, AppliedBy, ScriptStatus, ScriptOutput) VALUES (@1, @2, @3, {1}, {2}, {3}, @4, @5) -SELECT ChangeId FROM {0} WHERE Folder = @1 and ScriptNumber = @2", - this.changeLogTableName, - this.syntax.CurrentTimestamp, - completeDateValue, - this.syntax.CurrentUser); +"SELECT ChangeId FROM {0} WHERE Folder = @1 and ScriptNumber = @2", + this.changeLogTableName); - // Execute insert and set change id so it can be updated. - using (var reader = this.queryExecuter.ExecuteQuery(sql, script.Folder, script.ScriptNumber, script.ScriptName, (int)status, output ?? string.Empty)) + // Execute set change id so it can be updated. + using (var reader = this.queryExecuter.ExecuteQuery(sql, script.Folder, script.ScriptNumber)) { reader.Read(); script.ChangeId = reader.GetInt32(0); diff --git a/src/Net.Sf.Dbdeploy/Database/Db2DbmsSyntax.cs b/src/Net.Sf.Dbdeploy/Database/Db2DbmsSyntax.cs new file mode 100644 index 0000000..14a487a --- /dev/null +++ b/src/Net.Sf.Dbdeploy/Database/Db2DbmsSyntax.cs @@ -0,0 +1,75 @@ +using System; +using System.Globalization; + +namespace Net.Sf.Dbdeploy.Database +{ + /// + /// IBM DB2 syntax. + /// + public class Db2DbmsSyntax : DbmsSyntax + { + /// + /// Initializes a new instance of the class. + /// + public Db2DbmsSyntax() + : base("db2") + { + } + + /// + /// Gets the get timestamp. + /// + /// + /// The get timestamp. + /// + public override string CurrentTimestamp + { + get + { + return "CURRENT TIMESTAMP"; + } + } + + /// + /// Gets the syntax to get the current user. + /// + /// + /// The current user syntax. + /// + public override string CurrentUser + { + get + { + return "CURRENT USER"; + } + } + + /// + /// Gets the syntax for checking if a table exists. + /// + /// Name of the table. + /// SQL for checking if a table exists. + public override string TableExists(string tableName) + { + // Use correct syntax for with and without schema. + string syntax; + var tableInfo = this.GetTableInfo(tableName); + if (!string.IsNullOrWhiteSpace(tableInfo.Schema)) + { + syntax = string.Format(CultureInfo.InvariantCulture, +@"SELECT TRIM(TABSCHEMA) || '.' || TRIM(TABNAME) +FROM SYSCAT.TABLES +WHERE TABSCHEMA='{0}' AND TABNAME='{1}'", tableInfo.Schema.ToUpper(), tableInfo.TableName.ToUpper()); + } + else + { + syntax = string.Format(CultureInfo.InvariantCulture, +@"SELECT TRIM(TABSCHEMA) || '.' || TRIM(TABNAME) +FROM SYSCAT.TABLES +WHERE TABNAME='{0}'", tableName.ToUpper()); + } + + return syntax; + } + } +} \ No newline at end of file diff --git a/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs b/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs index 8d4e8fd..b003f8f 100755 --- a/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs +++ b/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs @@ -24,6 +24,8 @@ public virtual IDbmsSyntax CreateDbmsSyntax() { switch (this.dbms) { + case "db2": + return new Db2DbmsSyntax(); case "ora": return new OracleDbmsSyntax(); case "mssql": @@ -31,7 +33,7 @@ public virtual IDbmsSyntax CreateDbmsSyntax() case "mysql": return new MySqlDbmsSyntax(); default: - throw new ArgumentException("Supported dbms: ora, mssql, mysql"); + throw new ArgumentException("Supported dbms: db2, ora, mssql, mysql"); } } diff --git a/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj b/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj index cbdca51..4f359a2 100755 --- a/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj +++ b/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj @@ -124,6 +124,7 @@ + @@ -189,6 +190,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + @@ -211,6 +218,11 @@ PreserveNewest + + + PreserveNewest + +