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"
/>
+