You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2007/02/08 07:33:51 UTC

svn commit: r504804 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/platform/sybase/ test/org/apache/ddlutils/io/

Author: tomdz
Date: Wed Feb  7 22:33:51 2007
New Revision: 504804

URL: http://svn.apache.org/viewvc?view=rev&rev=504804
Log:
Fixed identity handling for Sybase
Made tests more robust

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java?view=diff&rev=504804&r1=504803&r2=504804
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java Wed Feb  7 22:33:51 2007
@@ -184,15 +184,65 @@
     }
 
     /**
-     * Writes the statement that turns on the ability to write delimited identifiers.
+     * Returns the SQL to enable identity override mode.
+     * 
+     * @param table The table to enable the mode for
+     * @return The SQL
      */
-    private void writeQuotationOnStatement() throws IOException
+    protected String getEnableIdentityOverrideSql(Table table)
+    {
+        StringBuffer result = new StringBuffer();
+
+        result.append(getQuotationOnStatement());
+        result.append("SET IDENTITY_INSERT ");
+        result.append(getDelimitedIdentifier(getTableName(table)));
+        result.append(" ON");
+
+        return result.toString();
+    }
+
+    /**
+     * Returns the SQL to disable identity override mode.
+     * 
+     * @param table The table to disable the mode for
+     * @return The SQL
+     */
+    protected String getDisableIdentityOverrideSql(Table table)
+    {
+        StringBuffer result = new StringBuffer();
+
+        result.append(getQuotationOnStatement());
+        result.append("SET IDENTITY_INSERT ");
+        result.append(getDelimitedIdentifier(getTableName(table)));
+        result.append(" OFF");
+
+        return result.toString();
+    }
+
+    /**
+     * Returns the statement that turns on the ability to write delimited identifiers.
+     * 
+     * @return The quotation-on statement
+     */
+    private String getQuotationOnStatement()
     {
         if (getPlatform().isDelimitedIdentifierModeOn())
         {
-            print("SET quoted_identifier on");
-            printEndOfStatement();
+            return "SET quoted_identifier on";
         }
+        else
+        {
+            return "";
+        }
+    }
+
+    /**
+     * Writes the statement that turns on the ability to write delimited identifiers.
+     */
+    private void writeQuotationOnStatement() throws IOException
+    {
+        print(getQuotationOnStatement());
+        printEndOfStatement();
     }
 
     /**

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java?view=diff&rev=504804&r1=504803&r2=504804
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java Wed Feb  7 22:33:51 2007
@@ -255,4 +255,60 @@
 		setTextSize(MAX_TEXT_SIZE);
 		return super.query(model, sql, queryHints);
 	}
+
+
+    /**
+     * Determines whether we need to use identity override mode for the given table.
+     * 
+     * @param table The table
+     * @return <code>true</code> if identity override mode is needed
+     */
+    private boolean useIdentityOverrideFor(Table table)
+    {
+        return isIdentityOverrideOn() &&
+               getPlatformInfo().isIdentityOverrideAllowed() &&
+               (table.getAutoIncrementColumns().length > 0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void beforeInsert(Connection connection, Table table) throws SQLException
+    {
+        if (useIdentityOverrideFor(table))
+        {
+            SybaseBuilder builder = (SybaseBuilder)getSqlBuilder();
+    
+            connection.createStatement().execute(builder.getEnableIdentityOverrideSql(table));
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void afterInsert(Connection connection, Table table) throws SQLException
+    {
+        if (useIdentityOverrideFor(table))
+        {
+            SybaseBuilder builder = (SybaseBuilder)getSqlBuilder();
+    
+            connection.createStatement().execute(builder.getDisableIdentityOverrideSql(table));
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void beforeUpdate(Connection connection, Table table) throws SQLException
+    {
+        beforeInsert(connection, table);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void afterUpdate(Connection connection, Table table) throws SQLException
+    {
+        afterInsert(connection, table);
+    }
 }

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java?view=diff&rev=504804&r1=504803&r2=504804
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java Wed Feb  7 22:33:51 2007
@@ -499,8 +499,8 @@
             (expected.getTypeCode() == Types.DECIMAL))
         {
             assertEquals("Precision not the same for column "+actual.getName()+".",
-                         expected.getSize(),
-                         actual.getSize());
+                         expected.getSizeAsInt(),
+                         actual.getSizeAsInt());
             assertEquals("Scale not the same for column "+actual.getName()+".",
                          expected.getScale(),
                          actual.getScale());

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java?view=diff&rev=504804&r1=504803&r2=504804
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java Wed Feb  7 22:33:51 2007
@@ -545,59 +545,69 @@
         {
             return;
         }
-
-        boolean isSybase  = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
-        String  model1Xml = 
-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-            "<database name='roundtriptest'>\n"+
-            "  <table name='roundtrip'>\n"+
-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-            "    <column name='avalue' type='INTEGER'/>\n"+
-            "  </table>\n"+
-            "</database>";
-        String model2Xml;
-
-        // since some databases require/automatically make the column required
-        // we also make the column required in order to avoid problems when
-        // comparing the model from the live database with our assumed one
-        if (isSybase)
-        {
-            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                        "<database name='roundtriptest'>\n"+
-                        "  <table name='roundtrip'>\n"+
-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                        "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true' required='true'/>\n"+
-                        "  </table>\n"+
-                        "</database>";
-        }
-        else
+        // Sybase does not like INTEGER auto-increment columns
+        if (SybasePlatform.DATABASENAME.equals(getPlatform().getName()))
         {
-            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                        "<database name='roundtriptest'>\n"+
-                        "  <table name='roundtrip'>\n"+
-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                        "    <column name='avalue' type='INTEGER' autoIncrement='true' required='true'/>\n"+
-                        "  </table>\n"+
-                        "</database>";
-        }
+            String  model1Xml = 
+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+                "<database name='roundtriptest'>\n"+
+                "  <table name='roundtrip'>\n"+
+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+                "    <column name='avalue' type='NUMERIC' size='12,0'/>\n"+
+                "  </table>\n"+
+                "</database>";
+            String model2Xml =
+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+                "<database name='roundtriptest'>\n"+
+                "  <table name='roundtrip'>\n"+
+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+                "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true' required='true'/>\n"+
+                "  </table>\n"+
+                "</database>";
+
+            createDatabase(model1Xml);
 
-        createDatabase(model1Xml);
+            insertRow("roundtrip", new Object[] { new Integer(1), new BigDecimal(2) });
 
-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });
+            alterDatabase(model2Xml);
 
-    	alterDatabase(model2Xml);
+            assertEquals(getAdjustedModel(),
+                         readModelFromDatabase("roundtriptest"));
 
-        assertEquals(getAdjustedModel(),
-                     readModelFromDatabase("roundtriptest"));
-
-        List beans = getRows("roundtrip");
+            List beans = getRows("roundtrip");
 
-        if (isSybase)
-        {
             assertEquals(new BigDecimal(2), beans.get(0), "avalue");
         }
         else
         {
+            String  model1Xml = 
+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+                "<database name='roundtriptest'>\n"+
+                "  <table name='roundtrip'>\n"+
+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+                "    <column name='avalue' type='INTEGER'/>\n"+
+                "  </table>\n"+
+                "</database>";
+            String model2Xml=
+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+                "<database name='roundtriptest'>\n"+
+                "  <table name='roundtrip'>\n"+
+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+                "    <column name='avalue' type='INTEGER' autoIncrement='true' required='true'/>\n"+
+                "  </table>\n"+
+                "</database>";
+
+            createDatabase(model1Xml);
+
+            insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });
+
+            alterDatabase(model2Xml);
+
+            assertEquals(getAdjustedModel(),
+                         readModelFromDatabase("roundtriptest"));
+
+            List beans = getRows("roundtrip");
+
             assertEquals(new Integer(2), beans.get(0), "avalue");
         }
     }
@@ -1964,7 +1974,7 @@
 
         createDatabase(model1Xml);
 
-        insertRow("roundtrip1", new Object[] { new Integer(1) });
+        insertRow("roundtrip1", new Object[] { "1" });
 
         alterDatabase(model2Xml);
 
@@ -2079,7 +2089,7 @@
 
         createDatabase(model1Xml);
 
-        insertRow("roundtrip", new Object[] { null, new Integer(1) });
+        insertRow("roundtrip", new Object[] { null, "1" });
 
         alterDatabase(model2Xml);