You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2020/03/05 08:51:21 UTC

svn commit: r1874825 - in /jackrabbit/oak/branches/1.22: ./ oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/

Author: reschke
Date: Thu Mar  5 08:51:20 2020
New Revision: 1874825

URL: http://svn.apache.org/viewvc?rev=1874825&view=rev
Log:
OAK-8915: RDBDocumentStore: use setNString() for columns known to be of type N*CHAR (merged r1874249 into 1.22)

Modified:
    jackrabbit/oak/branches/1.22/   (props changed)
    jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java

Propchange: jackrabbit/oak/branches/1.22/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1874249

Modified: jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1874825&r1=1874824&r2=1874825&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Thu Mar  5 08:51:20 2020
@@ -695,6 +695,7 @@ public class RDBDocumentStore implements
         private final String catalog;
         private final String name;
         private boolean idIsBinary = false;
+        private boolean dataIsNChar = false;
         private boolean hasVersion = false;
         private boolean hasSplitDocs = false;
         private int dataLimitInOctets = 16384;
@@ -736,6 +737,10 @@ public class RDBDocumentStore implements
             return this.schemaInfo;
         }
 
+        public boolean isDataNChar() {
+            return this.dataIsNChar;
+        }
+
         public boolean isIdBinary() {
             return this.idIsBinary;
         }
@@ -748,6 +753,10 @@ public class RDBDocumentStore implements
             return this.hasVersion;
         }
 
+        public void setDataIsNChar(boolean dataIsNChar) {
+            this.dataIsNChar = dataIsNChar;
+        }
+
         public void setIdIsBinary(boolean idIsBinary) {
             this.idIsBinary = idIsBinary;
         }
@@ -1102,6 +1111,10 @@ public class RDBDocumentStore implements
         return sqlType == Types.VARBINARY || sqlType == Types.BINARY || sqlType == Types.LONGVARBINARY;
     }
 
+    private static boolean isNChar(int sqlType) {
+        return sqlType == Types.NCHAR || sqlType == Types.NVARCHAR || sqlType == Types.LONGNVARCHAR;
+    }
+
     private static void obtainFlagsFromResultSetMeta(ResultSetMetaData met, RDBTableMetaData tmd) throws SQLException {
 
         for (int i = 1; i <= met.getColumnCount(); i++) {
@@ -1111,6 +1124,7 @@ public class RDBDocumentStore implements
             }
             if ("data".equals(lcName)) {
                 tmd.setDataLimitInOctets(met.getPrecision(i));
+                tmd.setDataIsNChar(isNChar(met.getColumnType(i)));
             }
             if ("version".equals(lcName)) {
                 tmd.setHasVersion(true);

Modified: jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1874825&r1=1874824&r2=1874825&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java (original)
+++ jackrabbit/oak/branches/1.22/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java Thu Mar  5 08:51:20 2020
@@ -283,10 +283,10 @@ public class RDBDocumentStoreJDBC {
                     stmt.setObject(si++, document.get(NodeDocument.SD_MAX_REV_TIME_IN_SECS));
                 }
                 if (data.length() < tmd.getDataLimitInOctets() / CHAR2OCTETRATIO) {
-                    stmt.setString(si++, data);
+                    setDataInStatement(tmd, stmt, si++, data);
                     stmt.setBinaryStream(si++, null, 0);
                 } else {
-                    stmt.setString(si++, "\"blob\"");
+                    setDataInStatement(tmd, stmt, si++, "\"blob\"");
                     byte[] bytes = asBytes(data);
                     stmt.setBytes(si++, bytes);
                 }
@@ -364,10 +364,10 @@ public class RDBDocumentStoreJDBC {
                 stmt.setObject(si++, data.length(), Types.BIGINT);
 
                 if (data.length() < tmd.getDataLimitInOctets() / CHAR2OCTETRATIO) {
-                    stmt.setString(si++, data);
+                    setDataInStatement(tmd, stmt, si++, data);
                     stmt.setBinaryStream(si++, null, 0);
                 } else {
-                    stmt.setString(si++, "\"blob\"");
+                    setDataInStatement(tmd, stmt, si++, "\"blob\"");
                     byte[] bytes = asBytes(data);
                     stmt.setBytes(si++, bytes);
                 }
@@ -933,10 +933,10 @@ public class RDBDocumentStoreJDBC {
             stmt.setObject(si++, data.length(), Types.BIGINT);
 
             if (data.length() < tmd.getDataLimitInOctets() / CHAR2OCTETRATIO) {
-                stmt.setString(si++, data);
+                setDataInStatement(tmd, stmt, si++, data);
                 stmt.setBinaryStream(si++, null, 0);
             } else {
-                stmt.setString(si++, "\"blob\"");
+                setDataInStatement(tmd, stmt, si++, "\"blob\"");
                 byte[] bytes = asBytes(data);
                 stmt.setBytes(si++, bytes);
             }
@@ -1079,6 +1079,14 @@ public class RDBDocumentStoreJDBC {
         }
     }
 
+    private static void setDataInStatement(RDBTableMetaData tmd, PreparedStatement stmt, int idx, String id) throws SQLException {
+        if (tmd.isDataNChar()) {
+            stmt.setNString(idx, id);
+        } else {
+            stmt.setString(idx, id);
+        }
+    }
+
     private static long readLongFromResultSet(ResultSet res, int index) throws SQLException {
         long v = res.getLong(index);
         return res.wasNull() ? RDBRow.LONG_UNSET : v;