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/19 13:23:53 UTC

svn commit: r1875423 - in /jackrabbit/oak/branches/1.6/oak-core: ./ src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java

Author: reschke
Date: Thu Mar 19 13:23:52 2020
New Revision: 1875423

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

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

Propchange: jackrabbit/oak/branches/1.6/oak-core/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk/oak-store-document:r1874249

Modified: jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1875423&r1=1875422&r2=1875423&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Thu Mar 19 13:23:52 2020
@@ -628,6 +628,7 @@ public class RDBDocumentStore implements
 
         private final String name;
         private boolean idIsBinary = false;
+        private boolean dataIsNChar = false;
         private int dataLimitInOctets = 16384;
 
         public RDBTableMetaData(String name) {
@@ -642,10 +643,18 @@ public class RDBDocumentStore implements
             return this.name;
         }
 
+        public boolean isDataNChar() {
+            return this.dataIsNChar;
+        }
+
         public boolean isIdBinary() {
             return this.idIsBinary;
         }
 
+        public void setDataIsNChar(boolean dataIsNChar) {
+            this.dataIsNChar = dataIsNChar;
+        }
+
         public void setIdIsBinary(boolean idIsBinary) {
             this.idIsBinary = idIsBinary;
         }
@@ -896,7 +905,12 @@ 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 void obtainFlagsFromResultSetMeta(ResultSetMetaData met, RDBTableMetaData tmd) throws SQLException {
+
         for (int i = 1; i <= met.getColumnCount(); i++) {
             String lcName = met.getColumnName(i).toLowerCase(Locale.ENGLISH);
             if ("id".equals(lcName)) {
@@ -904,6 +918,7 @@ public class RDBDocumentStore implements
             }
             if ("data".equals(lcName)) {
                 tmd.setDataLimitInOctets(met.getPrecision(i));
+                tmd.setDataIsNChar(isNChar(met.getColumnType(i)));
             }
         }
     }

Modified: jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1875423&r1=1875422&r2=1875423&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java Thu Mar 19 13:23:52 2020
@@ -275,10 +275,10 @@ public class RDBDocumentStoreJDBC {
                 stmt.setObject(si++, cmodcount == null ? Long.valueOf(0) : cmodcount, Types.BIGINT);
                 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);
                 }
@@ -354,10 +354,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);
                 }
@@ -822,10 +822,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);
             }
@@ -929,6 +929,14 @@ public class RDBDocumentStoreJDBC {
         } else {
             stmt.setString(idx, id);
         }
+    }
+
+    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 {