Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dbdeploy.Console/OptionsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
24 changes: 16 additions & 8 deletions src/Net.Sf.Dbdeploy/Database/DatabaseSchemaVersionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
75 changes: 75 additions & 0 deletions src/Net.Sf.Dbdeploy/Database/Db2DbmsSyntax.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using System;
using System.Globalization;

namespace Net.Sf.Dbdeploy.Database
{
/// <summary>
/// IBM DB2 syntax.
/// </summary>
public class Db2DbmsSyntax : DbmsSyntax
{
/// <summary>
/// Initializes a new instance of the <see cref="Db2DbmsSyntax" /> class.
/// </summary>
public Db2DbmsSyntax()
: base("db2")
{
}

/// <summary>
/// Gets the get timestamp.
/// </summary>
/// <value>
/// The get timestamp.
/// </value>
public override string CurrentTimestamp
{
get
{
return "CURRENT TIMESTAMP";
}
}

/// <summary>
/// Gets the syntax to get the current user.
/// </summary>
/// <value>
/// The current user syntax.
/// </value>
public override string CurrentUser
{
get
{
return "CURRENT USER";
}
}

/// <summary>
/// Gets the syntax for checking if a table exists.
/// </summary>
/// <param name="tableName">Name of the table.</param>
/// <returns>SQL for checking if a table exists.</returns>
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;
}
}
}
4 changes: 3 additions & 1 deletion src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@ public virtual IDbmsSyntax CreateDbmsSyntax()
{
switch (this.dbms)
{
case "db2":
return new Db2DbmsSyntax();
case "ora":
return new OracleDbmsSyntax();
case "mssql":
return new MsSqlDbmsSyntax();
case "mysql":
return new MySqlDbmsSyntax();
default:
throw new ArgumentException("Supported dbms: ora, mssql, mysql");
throw new ArgumentException("Supported dbms: db2, ora, mssql, mysql");
}
}

Expand Down
12 changes: 12 additions & 0 deletions src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@
</Compile>
<Compile Include="Appliers\DirectToDbApplier.cs" />
<Compile Include="Database\TableInfo.cs" />
<Compile Include="Database\Db2DbmsSyntax.cs" />
<Compile Include="UniqueChange.cs" />
<Compile Include="DbDeployer.cs" />
<Compile Include="Database\DelimiterTypeFactory.cs">
Expand Down Expand Up @@ -189,6 +190,12 @@
<EmbeddedResource Include="Resources\SQLCMD.rll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\db2_undo.vm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\db2_apply.vm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="..\dbproviders.xml">
Expand All @@ -211,6 +218,11 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\CreateSchemaVersionTable.db2.sql">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Expand Down
22 changes: 22 additions & 0 deletions src/Net.Sf.Dbdeploy/Resources/CreateSchemaVersionTable.db2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
IF (NOT EXISTS (SELECT 1 FROM SYSCAT.SCHEMATA WHERE SCHEMANAME='$(SchemaName)')) THEN
CREATE SCHEMA $(SchemaName) AUTHORIZATION DB2ADMIN
END IF;

CREATE TABLE $(QualifiedTableName) (
ChangeId INT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20) NOT NULL,
Folder VARGRAPHIC(256) NOT NULL,
ScriptNumber SMALLINT NOT NULL,
ScriptName VARGRAPHIC(512) NOT NULL,
StartDate TIMESTAMP NOT NULL,
CompleteDate TIMESTAMP NULL,
AppliedBy VARGRAPHIC(128) NOT NULL,
ScriptStatus SMALLINT NOT NULL,
ScriptOutput DBCLOB(10485760) LOGGED NOT COMPACT NOT NULL,
CONSTRAINT PK_$(TableName) PRIMARY KEY (ChangeId)
);

CREATE UNIQUE INDEX IX_$(TableName) ON $(QualifiedTableName)
(
Folder ASC,
ScriptNumber ASC
);
18 changes: 18 additions & 0 deletions src/Net.Sf.Dbdeploy/Resources/db2_apply.vm
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#foreach($script in $scripts)

-- START CHANGE SCRIPT ${script}

INSERT INTO ${changeLogTableName} (Folder, ScriptNumber, ScriptName, StartDate, AppliedBy, ScriptStatus, ScriptOutput)
VALUES ('${script.Folder}', ${script.ScriptNumber}, '${script.ScriptName}', CURRENT TIMESTAMP, CURRENT USER, 3, '')$!{separator}${delimiter}

BEGIN TRANSACTION$!{separator}

${script.getContent()}

UPDATE ${changeLogTableName}
SET CompleteDate = getdate(), ScriptStatus = 1, ScriptOutput = ''
WHERE Folder = '$script.Folder' AND ScriptNumber = $script.ScriptNumber$!{separator}${delimiter}

-- END CHANGE SCRIPT ${script}
COMMIT TRANSACTION$!{separator}
#end
13 changes: 13 additions & 0 deletions src/Net.Sf.Dbdeploy/Resources/db2_undo.vm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#foreach($script in $scripts)

-- START UNDO OF CHANGE SCRIPT ${script}

BEGIN TRANSACTION$!{separator}

${script.getUndoContent()}

DELETE FROM ${changeLogTableName} WHERE Folder = '$script.Folder' AND ScriptNumber = $script.ScriptNumber$!{separator}${delimiter}

-- END UNDO OF CHANGE SCRIPT ${script}
COMMIT TRANSACTION$!{separator}
#end
4 changes: 3 additions & 1 deletion src/SolutionVersionAssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
// This file will be changed when building a package to contain the correct version// Do not commit any changes hereusing System.Reflection;[assembly: AssemblyVersionAttribute("0.0.0.0")][assembly: AssemblyInformationalVersionAttribute("0.0.0.0-devel")][assembly: AssemblyFileVersionAttribute("0.0.0.0")]
// This file will be changed when building a package to contain the correct version// Do not commit any changes hereusing System.Reflection;[assembly: AssemblyVersionAttribute("2.2.0.4")]
[assembly: AssemblyInformationalVersionAttribute("2.2.0.4-devel")]
[assembly: AssemblyFileVersionAttribute("2.2.0.4")]
Expand Down
1 change: 1 addition & 0 deletions src/Test.Net.Sf.Dbdeploy/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<add key="ConnString-2ARMITAGE" value="Server=.;Initial Catalog=DBDEPLOY;Trusted_Connection=true" />
<add key="MySqlConnString" value="Server=192.168.1.112;Initial Catalog=DBDEPLOY;User Id=root;Password=password" />
<add key="OracleConnString" value="data source=ORACLE;user id=scott;password=tiger" />
<add key="Db2ConnString" value="Driver={IBM DB2 ODBC DRIVER};DataBase=DB1; HostName=192.168.72.135; Protocol=TCPIP;Port=50000;Uid=root;Pwd=password;CurrentSchema=DB01;DB2NETNamedParam=1;HostVarParameters=1" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public abstract class AbstractDatabaseSchemaVersionManagerTest

protected DatabaseSchemaVersionManager databaseSchemaVersion;

private IDbmsSyntax syntax;
protected IDbmsSyntax syntax;

[SetUp]
protected void SetUp()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,15 @@ public void ShouldUpdateChangelogTable()
this.syntax.Setup(s => s.CurrentTimestamp).Returns("TIMESTAMP");

this.schemaVersionManager.RecordScriptStatus(this.script, ScriptStatus.Success, "Script output");
string expected = @"INSERT INTO ChangeLog (Folder, ScriptNumber, ScriptName, StartDate, CompleteDate, AppliedBy, ScriptStatus, ScriptOutput) VALUES (@1, @2, @3, TIMESTAMP, TIMESTAMP, DBUSER, @4, @5)
SELECT ChangeId FROM ChangeLog WHERE Folder = @1 and ScriptNumber = @2";
string insertSql = "INSERT INTO ChangeLog (Folder, ScriptNumber, ScriptName, StartDate, CompleteDate, AppliedBy, ScriptStatus, ScriptOutput) VALUES (@1, @2, @3, TIMESTAMP, TIMESTAMP, DBUSER, @4, @5)";
string expected = "SELECT ChangeId FROM ChangeLog WHERE Folder = @1 and ScriptNumber = @2";

Assert.AreEqual(expected, this.executedQueries.FirstOrDefault(), "The query executed was incorrect.");
Assert.AreEqual(2, this.executedQueries.Count, "The query executed was incorrect.");
Assert.AreEqual(insertSql, this.executedQueries[0], "The query executed was incorrect.");
Assert.AreEqual(expected, this.executedQueries[1], "The query executed was incorrect.");

this.queryExecuter.Verify(e => e.ExecuteQuery(expected, this.script.Folder, this.script.ScriptNumber, this.script.ScriptName, (int)ScriptStatus.Success, "Script output"), Times.Once());
this.queryExecuter.Verify(e => e.ExecuteQuery(insertSql, this.script.Folder, this.script.ScriptNumber, this.script.ScriptName, (int)ScriptStatus.Success, "Script output"), Times.Once());
this.queryExecuter.Verify(e => e.ExecuteQuery(expected, this.script.Folder, this.script.ScriptNumber), Times.Once());
}

[Test]
Expand Down
Loading