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