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();