Author: reschke
Date: Thu Jun 26 14:38:05 2014
New Revision: 1605799

URL: http://svn.apache.org/r1605799
Log:
OAK-1914 - add workarounds for VARCHAR limit on Oracle

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.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=1605799&r1=1605798&r2=1605799&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
 Thu Jun 26 14:38:05 2014
@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingExcept
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
@@ -283,8 +284,9 @@ public class RDBDocumentStore implements
 
     private DataSource ds;
 
-    // string length at which we switch to BLOB storage
-    private static int DATALIMIT = 16384 / 4;
+    // capacity of DATA column
+    // we assume six octets per Java character as worst case for now
+    private int datalimit = 16384 / 6;
 
     // number of retries for updates
     private static int RETRIES = 10;
@@ -318,9 +320,15 @@ public class RDBDocumentStore implements
 
             for (String tableName : new String[] { "CLUSTERNODES", "NODES", 
"SETTINGS" }) {
                 try {
-                    PreparedStatement stmt = con.prepareStatement("select ID 
from " + tableName + " where ID = ?");
+                    PreparedStatement stmt = con.prepareStatement("select DATA 
from " + tableName + " where ID = ?");
                     stmt.setString(1, "0:/");
-                    stmt.executeQuery();
+                    ResultSet rs = stmt.executeQuery();
+
+                    if ("NODES".equals(tableName)) {
+                        // try to discover size of DATA column
+                        ResultSetMetaData met = rs.getMetaData();
+                        datalimit = met.getPrecision(1) / 6;
+                    }
                 } catch (SQLException ex) {
                     // table does not appear to exist
                     con.rollback();
@@ -348,7 +356,7 @@ public class RDBDocumentStore implements
                         // see https://issues.apache.org/jira/browse/OAK-1914
                         stmt.execute("create table "
                                 + tableName
-                                + " (ID varchar(767) not null primary key, 
MODIFIED number, HASBINARY number, MODCOUNT number, DSIZE number, DATA 
varchar(4000), BDATA blob)");
+                                + " (ID varchar(1000) not null primary key, 
MODIFIED number, HASBINARY number, MODCOUNT number, DSIZE number, DATA 
varchar(4000), BDATA blob)");
                     } else {
                         stmt.execute("create table "
                                 + tableName
@@ -894,7 +902,7 @@ public class RDBDocumentStore implements
             stmt.setObject(si++, modcount, Types.BIGINT);
             stmt.setObject(si++, data.length(), Types.BIGINT);
 
-            if (data.length() < DATALIMIT) {
+            if (data.length() < datalimit) {
                 stmt.setString(si++, data);
                 stmt.setBinaryStream(si++, null, 0);
             } else {
@@ -928,15 +936,14 @@ public class RDBDocumentStore implements
             stmt.setObject(si++, hasBinary ? 1 : 0, Types.SMALLINT);
             stmt.setObject(si++, modcount, Types.BIGINT);
             stmt.setObject(si++, data.length(), Types.BIGINT);
-            if (data.length() < DATALIMIT) {
+            if (data.length() < datalimit) {
                 stmt.setString(si++, data);
                 stmt.setBinaryStream(si++, null, 0);
             } else {
-                stmt.setString(si++, "truncated...:" + data.substring(0, 
1023));
+                stmt.setString(si++, "truncated...:" + data.substring(0, 
datalimit - 20));
                 byte[] bytes = asBytes(data);
                 stmt.setBytes(si++, bytes);
             }
-
             int result = stmt.executeUpdate();
             if (result != 1) {
                 LOG.debug("DB insert failed for " + tableName + "/" + id);


Reply via email to