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


Reply via email to