merge trunk to hibernate4
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / types / SqlServer2005DatabaseType.java
index 233ef4797101c93a61a2ecec92387cee6e650e72..3ffc33d37757382dedeac97c991e8054ef5b55e1 100644 (file)
@@ -9,6 +9,10 @@
 \r
 package eu.etaxonomy.cdm.database.types;\r
 \r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+\r
+import eu.etaxonomy.cdm.database.CdmDataSource;\r
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
 \r
@@ -30,10 +34,10 @@ public class SqlServer2005DatabaseType extends DatabaseTypeBase {
        //[serverName[\instanceName][:portNumber]][;property=value[;property=value]]\r
        \r
     //default port\r
-    private int defaultPort = 1433;\r
+    protected int defaultPort = 1433;\r
     \r
     //hibernate dialect\r
-    private String hibernateDialect = "SQLServerDialect";\r
+    protected String hibernateDialect = "SQLServer2005Dialect";\r
  \r
     public String getConnectionString(ICdmDataSource ds, int port){\r
        return getConnectionString(ds, port, null);\r
@@ -46,10 +50,72 @@ public class SqlServer2005DatabaseType extends DatabaseTypeBase {
                }\r
        return urlString + ds.getServer() + instance + ":" + port + ";databaseName=" + ds.getDatabase() +";SelectMethod=cursor";\r
     }\r
+    \r
+    \r
+    /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.types.DatabaseTypeBase#getServerNameByConnectionString(java.lang.String)\r
+        */\r
+       @Override\r
+       public String getServerNameByConnectionString(String connectionString) {\r
+               String dbSeparator = ";";\r
+               return super.getServerNameByConnectionString(connectionString, urlString, dbSeparator);\r
+       }\r
+    \r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.types.DatabaseTypeBase#getPortByConnectionString(java.lang.String)\r
+        */\r
+       @Override\r
+       public int getPortByConnectionString(String connectionString) {\r
+               String dbSeparator = ";";\r
+               return getPortByConnectionString(connectionString, urlString, dbSeparator);\r
+       }\r
+       \r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.database.types.DatabaseTypeBase#getServerNameByConnectionString(java.lang.String)\r
+     */\r
+    @Override\r
+    public String getDatabaseNameByConnectionString(String connectionString){\r
+       String result;\r
+       String dbStart = ";databaseName=";\r
+       int posDbStart = connectionString.indexOf(dbStart);\r
+       result = connectionString.substring(posDbStart + dbStart.length());\r
+       int posNextAttr = result.indexOf(";");\r
+       if (posNextAttr != 0){\r
+               result = result.substring(0, posNextAttr);\r
+       }\r
+       return result;\r
+    }\r
        \r
        //Constructor\r
     public SqlServer2005DatabaseType() {\r
        init (typeName, classString, urlString, defaultPort,  hibernateDialect );\r
        }\r
+    \r
+    \r
+    /**\r
+     * Deletes all foreign keys between tables in a sql server database.\r
+     * This makes deleting tables easier.\r
+     * @param sqlServerDataSource\r
+     * @return\r
+     * @throws SQLException\r
+     */\r
+    public boolean deleteForeignKeys(CdmDataSource sqlServerDataSource) throws SQLException{\r
+       String sql = "SELECT name, id FROM sys.sysobjects WHERE (xtype = 'U')"; //all tables\r
+               ResultSet rs = sqlServerDataSource.executeQuery(sql);\r
+               while (rs.next()){\r
+                       String tableName = rs.getString("name");\r
+                       long tableId = rs.getLong("id");\r
+                       sql = "SELECT name FROM sys.sysobjects WHERE xtype='F' and parent_obj = " +  tableId;//get foreignkeys\r
+                       ResultSet rsFk = sqlServerDataSource.executeQuery(sql);\r
+                       while (rsFk.next()){\r
+                               String fk = rsFk.getString("name");\r
+                               sql = " ALTER TABLE "+tableName+" DROP CONSTRAINT "+fk + "";\r
+                               sqlServerDataSource.executeUpdate(sql);\r
+                       }\r
+                       \r
+               }\r
+               return true;\r
+    }\r
 \r
 }
\ No newline at end of file