From 2b2e16652a1749e81c2d83ce95f45a9b3c2f061a Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Wed, 15 Aug 2007 08:24:14 +0000
Subject: [PATCH] - enable database language if necessary - move PostgreSQL
 class to package postgresql

SVN: 1369
---
 .../cisd/dbmigration/DBUtilities.java         | 13 +++----
 .../DatabaseConfigurationContext.java         |  2 +-
 .../dbmigration/DatabaseVersionLogDAO.java    |  4 +--
 .../cisd/dbmigration/SqlScriptExecutor.java   |  4 +--
 .../{ => postgresql}/PostgreSQLAdminDAO.java  | 34 +++++++++++++++----
 .../PostgreSQLDAOFactory.java                 | 10 +++++-
 .../PostgreSQLMassUploader.java               |  3 +-
 7 files changed, 51 insertions(+), 19 deletions(-)
 rename dbmigration/source/java/ch/systemsx/cisd/dbmigration/{ => postgresql}/PostgreSQLAdminDAO.java (68%)
 rename dbmigration/source/java/ch/systemsx/cisd/dbmigration/{ => postgresql}/PostgreSQLDAOFactory.java (81%)
 rename dbmigration/source/java/ch/systemsx/cisd/dbmigration/{ => postgresql}/PostgreSQLMassUploader.java (98%)

diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBUtilities.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBUtilities.java
index 94e340767a7..8f0fc88535d 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBUtilities.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBUtilities.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.common.db.SQLStateUtils;
  *
  * @author Franz-Josef Elmer
  */
-class DBUtilities
+public class DBUtilities
 {
     /**
      * Checks whether given <code>DataAccessException</code> is caused by a "database does not exist" exception.
@@ -33,22 +33,23 @@ class DBUtilities
      * This is database specific.
      * </p>
      */
-    static boolean isDBNotExistException(DataAccessException ex)
+    public static boolean isDBNotExistException(DataAccessException ex)
     {
         // 3D000: INVALID CATALOG NAME
         return SQLStateUtils.isInvalidCatalogName(SQLStateUtils.getSqlState(ex));
     }
 
-    private DBUtilities() {}
-
     /**
-     * Checks whether given <code>DataAccessException</code> is caused by a "user already exists" exception.
+     * Checks whether given <code>DataAccessException</code> is caused by a "duplicate object" exception.
      * <p>
      * This is database specific.
      * </p>
      */
-    static boolean ownerAlreadyExists(DataAccessException ex) {
+    public static boolean isDuplicateObjectException(DataAccessException ex) {
         // 42710 DUPLICATE OBJECT
         return SQLStateUtils.isDuplicateObject(SQLStateUtils.getSqlState(ex));
     }
+    
+    private DBUtilities() {}
+    
 }
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java
index f7c2f9cb584..a635dad82f0 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java
@@ -118,7 +118,7 @@ public class DatabaseConfigurationContext
     /**
      * Returns data source for admin purposes.
      */
-    final DataSource getAdminDataSource()
+    public final DataSource getAdminDataSource()
     {
         if (adminDataSource == null)
         {
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseVersionLogDAO.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseVersionLogDAO.java
index 7289a5e5b68..ddf73b37211 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseVersionLogDAO.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseVersionLogDAO.java
@@ -49,7 +49,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
  *
  * @author Franz-Josef Elmer
  */
-class DatabaseVersionLogDAO extends SimpleJdbcDaoSupport implements IDatabaseVersionLogDAO
+public class DatabaseVersionLogDAO extends SimpleJdbcDaoSupport implements IDatabaseVersionLogDAO
 {
     private static final String ENCODING = "utf8";
     
@@ -111,7 +111,7 @@ class DatabaseVersionLogDAO extends SimpleJdbcDaoSupport implements IDatabaseVer
 
     final LobHandler lobHandler;
 
-    DatabaseVersionLogDAO(DataSource dataSource, LobHandler lobHandler)
+    public DatabaseVersionLogDAO(DataSource dataSource, LobHandler lobHandler)
     {
         setDataSource(dataSource);
         this.lobHandler = lobHandler;
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptExecutor.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptExecutor.java
index 54477700ba0..db480d9b9d2 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptExecutor.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptExecutor.java
@@ -25,9 +25,9 @@ import org.springframework.jdbc.core.support.JdbcDaoSupport;
  *
  * @author Franz-Josef Elmer
  */
-class SqlScriptExecutor extends JdbcDaoSupport implements ISqlScriptExecutor
+public class SqlScriptExecutor extends JdbcDaoSupport implements ISqlScriptExecutor
 {
-    SqlScriptExecutor(DataSource dataSource)
+    public SqlScriptExecutor(DataSource dataSource)
     {
         setDataSource(dataSource);
     }
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLAdminDAO.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLAdminDAO.java
similarity index 68%
rename from dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLAdminDAO.java
rename to dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLAdminDAO.java
index 0364de4323f..4ae8800d11b 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLAdminDAO.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLAdminDAO.java
@@ -14,16 +14,20 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.dbmigration;
+package ch.systemsx.cisd.dbmigration.postgresql;
 
 import javax.sql.DataSource;
 
 import org.apache.log4j.Logger;
 import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
 
+import ch.systemsx.cisd.common.db.SQLStateUtils;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.dbmigration.DBUtilities;
+import ch.systemsx.cisd.dbmigration.IDatabaseAdminDAO;
 
 /**
  * Implementation of {@link IDatabaseAdminDAO} for PostgreSQL.
@@ -68,7 +72,7 @@ public class PostgreSQLAdminDAO extends SimpleJdbcDaoSupport implements IDatabas
             }
         } catch (DataAccessException ex)
         {
-            if (DBUtilities.ownerAlreadyExists(ex))
+            if (DBUtilities.isDuplicateObjectException(ex))
             {
                 if (operationLog.isInfoEnabled())
                 {
@@ -84,10 +88,28 @@ public class PostgreSQLAdminDAO extends SimpleJdbcDaoSupport implements IDatabas
 
     public void createDatabase()
     {
-        getJdbcTemplate().execute(
-                "create database " + database + " with owner = " + owner
-                        + " encoding = 'utf8' tablespace = pg_default;" + "alter database " + database
-                        + " set default_with_oids = off;");
+        JdbcTemplate jdbcTemplate = getJdbcTemplate();
+        jdbcTemplate.execute("create database " + database + " with owner = " + owner
+                                        + " encoding = 'utf8' tablespace = pg_default;" 
+                             + "alter database " + database + " set default_with_oids = off;");
+        try
+        {
+            jdbcTemplate.execute("create trusted procedural language 'plpgsql' handler plpgsql_call_handler "
+                                 + "validator plpgsql_validator;");
+        } catch (DataAccessException e)
+        {
+            if (DBUtilities.isDuplicateObjectException(e))
+            {
+                if (operationLog.isInfoEnabled())
+                {
+                    operationLog.info("Couldn't create language:" + e+":"+SQLStateUtils.getSqlState(e));
+                }
+            } else
+            {
+                operationLog.error("Database language 'plpgsql' couldn't be created:", e);
+                throw e;
+            }
+        }
     }
 
     public void dropDatabase()
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLDAOFactory.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLDAOFactory.java
similarity index 81%
rename from dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLDAOFactory.java
rename to dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLDAOFactory.java
index 9be5d5b16f5..e9bc2e95089 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLDAOFactory.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLDAOFactory.java
@@ -14,13 +14,21 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.dbmigration;
+package ch.systemsx.cisd.dbmigration.postgresql;
 
 import java.sql.SQLException;
 
 import javax.sql.DataSource;
 
 import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+import ch.systemsx.cisd.dbmigration.DatabaseVersionLogDAO;
+import ch.systemsx.cisd.dbmigration.IDAOFactory;
+import ch.systemsx.cisd.dbmigration.IDatabaseAdminDAO;
+import ch.systemsx.cisd.dbmigration.IDatabaseVersionLogDAO;
+import ch.systemsx.cisd.dbmigration.IMassUploader;
+import ch.systemsx.cisd.dbmigration.ISqlScriptExecutor;
+import ch.systemsx.cisd.dbmigration.SqlScriptExecutor;
 
 /**
  * Implementation of {@link IDAOFactory} for PostgreSQL.
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLMassUploader.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLMassUploader.java
similarity index 98%
rename from dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLMassUploader.java
rename to dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLMassUploader.java
index 291de73c560..493807a0ad5 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/PostgreSQLMassUploader.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/postgresql/PostgreSQLMassUploader.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.dbmigration;
+package ch.systemsx.cisd.dbmigration.postgresql;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -37,6 +37,7 @@ import ch.systemsx.cisd.common.db.ISequencerHandler;
 import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.dbmigration.IMassUploader;
 
 /**
  * A {@link IMassUploader} for the PostgreSQL database.
-- 
GitLab