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