diff --git a/example_scripts/Dbdeploy.NAnt.dll b/example_scripts/Dbdeploy.NAnt.dll index 59f7b34..15e089f 100644 Binary files a/example_scripts/Dbdeploy.NAnt.dll and b/example_scripts/Dbdeploy.NAnt.dll differ diff --git a/example_scripts/Net.Sf.Dbdeploy.dll b/example_scripts/Net.Sf.Dbdeploy.dll index e27a901..01b71e7 100755 Binary files a/example_scripts/Net.Sf.Dbdeploy.dll and b/example_scripts/Net.Sf.Dbdeploy.dll differ diff --git a/example_scripts/Resources/postgres_apply.vm b/example_scripts/Resources/postgres_apply.vm new file mode 100644 index 0000000..38b31e3 --- /dev/null +++ b/example_scripts/Resources/postgres_apply.vm @@ -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, USER, 1, '')${separator}${delimiter} + +${script.getContent()} + +UPDATE ${changeLogTableName} +SET CompleteDate = getdate(), ScriptStatus = 1, ScriptOutput = '' +WHERE Folder = '$script.Folder' AND ScriptNumber = $script.ScriptNumber$!{separator}${delimiter} + +COMMIT${separator}${delimiter} + +-- END CHANGE SCRIPT ${script} + +#end \ No newline at end of file diff --git a/example_scripts/Resources/postgres_undo.vm b/example_scripts/Resources/postgres_undo.vm new file mode 100644 index 0000000..de06142 --- /dev/null +++ b/example_scripts/Resources/postgres_undo.vm @@ -0,0 +1,13 @@ +#foreach($script in $scripts) + +-- START UNDO OF CHANGE SCRIPT ${script} + +${script.getUndoContent()} + +DELETE FROM ${changeLogTableName} WHERE Folder = '$script.Folder' AND ScriptNumber = $script.ScriptNumber${separator}${delimiter} + +COMMIT${separator}${delimiter} + +-- END UNDO OF CHANGE SCRIPT ${script} + +#end \ No newline at end of file diff --git a/example_scripts/dbproviders.xml b/example_scripts/dbproviders.xml index ac3400a..3558f34 100755 --- a/example_scripts/dbproviders.xml +++ b/example_scripts/dbproviders.xml @@ -17,4 +17,10 @@ assemblyName="MySql.Data, Version=1.0.7.30072, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection" /> + diff --git a/example_scripts/example.build b/example_scripts/example.build index c84a17a..37b1c8e 100755 --- a/example_scripts/example.build +++ b/example_scripts/example.build @@ -3,8 +3,8 @@ - diff --git a/scripts/CreateSchemaVersionTable.postgres.sql b/scripts/CreateSchemaVersionTable.postgres.sql new file mode 100644 index 0000000..fba1c9d --- /dev/null +++ b/scripts/CreateSchemaVersionTable.postgres.sql @@ -0,0 +1,15 @@ +CREATE TABLE $(QualifiedTableName) ( + ChangeId bigserial, + Folder character varying(256) NOT NULL, + ScriptNumber smallint NOT NULL, + ScriptName character varying(512) NOT NULL, + StartDate timestamp NOT NULL, + CompleteDate timestamp NULL, + AppliedBy character varying(128) NOT NULL, + ScriptStatus smallint NOT NULL, + ScriptOutput text NOT NULL +); + +ALTER TABLE $(QualifiedTableName) ADD CONSTRAINT PK_$(TableName) PRIMARY KEY (ChangeId); + +CREATE INDEX IX_$(TableName) ON $(QualifiedTableName) (Folder, ScriptNumber) \ No newline at end of file diff --git a/src/Dbdeploy.Console/OptionsManager.cs b/src/Dbdeploy.Console/OptionsManager.cs index e643f0b..a637bbb 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 'postgres')", s => config.Dbms = s) .Add( diff --git a/src/Dbdeploy.NAnt/NAntTask.cs b/src/Dbdeploy.NAnt/NAntTask.cs index fc68285..57e2bb1 100644 --- a/src/Dbdeploy.NAnt/NAntTask.cs +++ b/src/Dbdeploy.NAnt/NAntTask.cs @@ -168,7 +168,7 @@ public void PrintUsage() string message = "\n\nDbdeploy Ant Task Usage" + "\n=======================" + "\n\n\t(IDataReader reader, string name) var columnValue = reader[name]; if (columnValue != DBNull.Value) { - value = (T)columnValue; + value = (T)Convert.ChangeType(columnValue, typeof(T)); } return value; diff --git a/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs b/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs index 8d4e8fd..28428cb 100755 --- a/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs +++ b/src/Net.Sf.Dbdeploy/Database/DbmsFactory.cs @@ -30,8 +30,10 @@ public virtual IDbmsSyntax CreateDbmsSyntax() return new MsSqlDbmsSyntax(); case "mysql": return new MySqlDbmsSyntax(); + case "postgres": + return new PostgresDbmsSyntax(); default: - throw new ArgumentException("Supported dbms: ora, mssql, mysql"); + throw new ArgumentException("Supported dbms: ora, mssql, mysql, postgres"); } } diff --git a/src/Net.Sf.Dbdeploy/Database/DbmsSyntax.cs b/src/Net.Sf.Dbdeploy/Database/DbmsSyntax.cs index 582c4d1..76797df 100755 --- a/src/Net.Sf.Dbdeploy/Database/DbmsSyntax.cs +++ b/src/Net.Sf.Dbdeploy/Database/DbmsSyntax.cs @@ -107,17 +107,12 @@ public virtual string TableExists(string tableName) if (!string.IsNullOrWhiteSpace(tableInfo.Schema)) { syntax = string.Format(CultureInfo.InvariantCulture, -@"SELECT table_schema -FROM INFORMATION_SCHEMA.TABLES -WHERE TABLE_SCHEMA = '{0}' -AND TABLE_NAME = '{1}'", tableInfo.Schema, tableInfo.TableName); +@"SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE lower(TABLE_SCHEMA) = lower('{0}') AND lower(TABLE_NAME) = lower('{1}')", tableInfo.Schema, tableInfo.TableName); } else { - syntax = string.Format(CultureInfo.InvariantCulture, -@"SELECT table_schema -FROM INFORMATION_SCHEMA.TABLES -WHERE TABLE_NAME = '{0}'", tableName); + syntax = string.Format(CultureInfo.InvariantCulture, +@"SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE lower(TABLE_NAME) = lower('{0}')", tableName); } return syntax; diff --git a/src/Net.Sf.Dbdeploy/Database/PostgresDbmsSyntax.cs b/src/Net.Sf.Dbdeploy/Database/PostgresDbmsSyntax.cs new file mode 100644 index 0000000..210a2b2 --- /dev/null +++ b/src/Net.Sf.Dbdeploy/Database/PostgresDbmsSyntax.cs @@ -0,0 +1,43 @@ +namespace Net.Sf.Dbdeploy.Database +{ + /// + /// Postgres syntax. + /// + public class PostgresDbmsSyntax : DbmsSyntax + { + /// + /// Initializes a new instance of the class. + /// + public PostgresDbmsSyntax() + : base("postgres") + { + } + + public override string DefaultSchema + { + get { return "public"; } + } + + /// + /// 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 "USER"; } + } + } +} \ No newline at end of file diff --git a/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj b/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj index cbdca51..f86c403 100755 --- a/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj +++ b/src/Net.Sf.Dbdeploy/Net.Sf.Dbdeploy.csproj @@ -96,6 +96,7 @@ + @@ -189,6 +190,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + @@ -211,6 +218,11 @@ PreserveNewest + + + PreserveNewest + + + + ..\packages\Npgsql.2.2.5\lib\net40\Mono.Security.dll + False ..\packages\Moq.4.1.1308.2321\lib\net40\Moq.dll @@ -86,6 +89,9 @@ False ..\..\lib\NAnt.Core.dll + + ..\packages\Npgsql.2.2.5\lib\net40\Npgsql.dll + False ..\..\lib\nunit.core.dll @@ -124,6 +130,7 @@ + diff --git a/src/Test.Net.Sf.Dbdeploy/packages.config b/src/Test.Net.Sf.Dbdeploy/packages.config index 6e63897..1fc1c80 100644 --- a/src/Test.Net.Sf.Dbdeploy/packages.config +++ b/src/Test.Net.Sf.Dbdeploy/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/src/dbproviders.xml b/src/dbproviders.xml index ac3400a..e24a9b2 100755 --- a/src/dbproviders.xml +++ b/src/dbproviders.xml @@ -17,4 +17,10 @@ assemblyName="MySql.Data, Version=1.0.7.30072, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection" /> +