Author: reschke
Date: Fri Mar 13 09:54:28 2015
New Revision: 1666384

URL: http://svn.apache.org/r1666384
Log:
OAK-2395 - use binary primary key for mssql, adjust tests

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1666384&r1=1666383&r2=1666384&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
 Fri Mar 13 09:54:28 2015
@@ -422,9 +422,15 @@ public class RDBDocumentStore implements
 
         MSSQL("Microsoft SQL Server") {
             @Override
+            public boolean isPrimaryColumnByteEncoded() {
+                // TODO: we should dynamically detect this
+                return true;
+            }
+
+            @Override
             public String getTableCreationStatement(String tableName) {
                 // see https://issues.apache.org/jira/browse/OAK-2395
-                return ("create table " + tableName + " (ID nvarchar(512) not 
null primary key, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, 
MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA nvarchar(4000), BDATA 
varbinary(max))");
+                return ("create table " + tableName + " (ID varbinary(512) not 
null primary key, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, 
MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA nvarchar(4000), BDATA 
varbinary(max))");
             }
 
             @Override

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1666384&r1=1666383&r2=1666384&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
 Fri Mar 13 09:54:28 2015
@@ -70,9 +70,6 @@ public class BasicDocumentStoreTest exte
 
     @Test
     public void testMaxIdAscii() {
-        // TODO see OAK-2395
-        Assume.assumeTrue(! super.dsname.contains("MSSql"));
-
         int result = testMaxId(true);
         assertTrue("needs to support keys of 512 bytes length, but only 
supports " + result, result >= 512);
     }
@@ -718,7 +715,7 @@ public class BasicDocumentStoreTest exte
                 PreparedStatement stmt = connection.prepareStatement("insert 
into " + table
                         + " (ID, MODCOUNT, DATA) values (?, ?, ?)");
                 try {
-                    stmt.setString(1, key);
+                    setIdInStatement(stmt, 1, key);
                     stmt.setLong(2, 0);
                     stmt.setString(3, "X");
                     stmt.executeUpdate();
@@ -728,6 +725,7 @@ public class BasicDocumentStoreTest exte
                 }
             } catch (SQLException ex) {
                 // ignored
+                // ex.printStackTrace();
             } finally {
                 if (connection != null) {
                     try {
@@ -763,7 +761,7 @@ public class BasicDocumentStoreTest exte
                         PreparedStatement stmt = 
connection.prepareStatement("update " + table + " set MODCOUNT = ? where ID = 
?");
                         try {
                             stmt.setLong(1, cnt);
-                            stmt.setString(2, key);
+                            setIdInStatement(stmt, 2, key);
                             assertEquals(1, stmt.executeUpdate());
                             connection.commit();
                         } finally {
@@ -775,7 +773,7 @@ public class BasicDocumentStoreTest exte
                         try {
                             stmt.setLong(1, cnt);
                             stmt.setString(2, "JSON data " + 
UUID.randomUUID());
-                            stmt.setString(3, key);
+                            setIdInStatement(stmt, 3, key);
                             assertEquals(1, stmt.executeUpdate());
                             connection.commit();
                         } finally {
@@ -790,7 +788,7 @@ public class BasicDocumentStoreTest exte
                             bdata[(int) cnt % bdata.length] = (byte) (cnt & 
0xff);
                             stmt.setString(2, "JSON data " + 
UUID.randomUUID());
                             stmt.setBytes(3, bdata);
-                            stmt.setString(4, key);
+                            setIdInStatement(stmt, 4, key);
                             assertEquals(1, stmt.executeUpdate());
                             connection.commit();
                         } finally {
@@ -814,11 +812,12 @@ public class BasicDocumentStoreTest exte
                         PreparedStatement stmt = 
connection.prepareStatement(t);
                         try {
                             stmt.setString(1, appendString);
-                            stmt.setString(2, key);
+                            setIdInStatement(stmt, 2, key);
                             assertEquals(1, stmt.executeUpdate());
                             connection.commit();
                             expect.append(appendString);
                         } catch (SQLException ex) {
+                            // ex.printStackTrace();
                             String state = ex.getSQLState();
                             if ("22001".equals(state) /* everybody */ || 
("72000".equals(state) && 1489 == ex.getErrorCode()) /* Oracle */) {
                                 // overflow
@@ -826,11 +825,12 @@ public class BasicDocumentStoreTest exte
                                 stmt = connection.prepareStatement("update " + 
table
                                         + " set MODCOUNT = MODCOUNT + 1, DATA 
= ? where ID = ?");
                                 stmt.setString(1, "X");
-                                stmt.setString(2, key);
+                                setIdInStatement(stmt, 2, key);
                                 assertEquals(1, stmt.executeUpdate());
                                 connection.commit();
                                 expect = new StringBuffer("X");
                             } else {
+                                // ex.printStackTrace();
                                 throw (ex);
                             }
                         } finally {
@@ -855,7 +855,7 @@ public class BasicDocumentStoreTest exte
                                 stmt.setString(si++, "null");
                                 stmt.setBytes(si++, sdata.getBytes("UTF-8"));
                             }
-                            stmt.setString(si++, key);
+                            setIdInStatement(stmt, si++, key);
                             assertEquals(1, stmt.executeUpdate());
                             connection.commit();
                             sdata += appendString;
@@ -886,7 +886,7 @@ public class BasicDocumentStoreTest exte
                     connection.setAutoCommit(false);
                     PreparedStatement stmt = 
connection.prepareStatement("select DATA, MODCOUNT from " + table + " where ID 
= ?");
                     try {
-                        stmt.setString(1, key);
+                        setIdInStatement(stmt, 1, key);
                         ResultSet rs = stmt.executeQuery();
                         assertTrue(rs.next());
                         String got = rs.getString(1);
@@ -968,6 +968,20 @@ public class BasicDocumentStoreTest exte
         }
     }
 
+    private void setIdInStatement(PreparedStatement stmt, int idx, String id) 
throws SQLException {
+        boolean binaryId = super.dsname.contains("MySQL") || 
super.dsname.contains("MSSql");
+        if (binaryId) {
+            try {
+                stmt.setBytes(idx, id.getBytes("UTF-8"));
+            } catch (UnsupportedEncodingException ex) {
+                LOG.error("UTF-8 not supported??", ex);
+                throw new DocumentStoreException(ex);
+            }
+        } else {
+            stmt.setString(idx, id);
+        }
+    }
+
     @Test
     public void description() throws Exception{
         Map<String, String> desc = ds.getMetadata();


Reply via email to