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 2016/01/06 15:25:48 UTC

svn commit: r1723333 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java

Author: reschke
Date: Wed Jan  6 14:25:48 2016
New Revision: 1723333

URL: http://svn.apache.org/viewvc?rev=1723333&view=rev
Log:
OAK-3739: RDBDocumentStore: allow schema evolution part 1: check for required columns, log unexpected new columns

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=1723333&r1=1723332&r2=1723333&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 Wed Jan  6 14:25:48 2016
@@ -692,6 +692,10 @@ public class RDBDocumentStore implements
     private static final Set<String> INDEXEDPROPERTIES = new HashSet<String>(Arrays.asList(new String[] { MODIFIED,
             NodeDocument.HAS_BINARY_FLAG, NodeDocument.DELETED_ONCE }));
 
+    // set of required table columns
+    private static final Set<String> REQUIREDCOLUMNS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(
+            new String[] { "id", "dsize", "deletedonce", "bdata", "data", "cmodcount", "modcount", "hasbinary", "modified" })));
+
     // set of properties not serialized to JSON
     private static final Set<String> COLUMNPROPERTIES = new HashSet<String>(Arrays.asList(new String[] { ID,
             NodeDocument.HAS_BINARY_FLAG, NodeDocument.DELETED_ONCE, COLLISIONSMODCOUNT, MODIFIED, MODCOUNT }));
@@ -944,6 +948,29 @@ public class RDBDocumentStore implements
             ResultSetMetaData met = checkResultSet.getMetaData();
             obtainFlagsFromResultSetMeta(met, tmd);
 
+            // check that all required columns are present
+            Set<String> requiredColumns = new HashSet<String>(REQUIREDCOLUMNS);
+            Set<String> unknownColumns = new HashSet<String>();
+            for (int i = 1; i <= met.getColumnCount(); i++) {
+                String cname = met.getColumnName(i).toLowerCase(Locale.ENGLISH);
+                if (!requiredColumns.remove(cname)) {
+                    unknownColumns.add(cname);
+                }
+            }
+
+            if (!requiredColumns.isEmpty()) {
+                String message = String.format("Table %s: the following required columns are missing: %s", tableName,
+                        requiredColumns.toString());
+                LOG.error(message);
+                throw new DocumentStoreException(message);
+            }
+
+            if (!unknownColumns.isEmpty()) {
+                String message = String.format("Table %s: the following columns are unknown and will not be maintained: %s",
+                        tableName, unknownColumns.toString());
+                LOG.info(message);
+            }
+
             if (col == Collection.NODES) {
                 String tableInfo = RDBJDBCTools.dumpResultSetMeta(met);
                 diagnostics.append(tableInfo);