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 2013/12/12 14:55:32 UTC

svn commit: r1550418 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java

Author: reschke
Date: Thu Dec 12 13:55:31 2013
New Revision: 1550418

URL: http://svn.apache.org/r1550418
Log:
OAK-1266 - work in progress SQL/JDBC DocumentStore implementation - refactoring

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java?rev=1550418&r1=1550417&r2=1550418&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java Thu Dec 12 13:55:31 2013
@@ -149,6 +149,9 @@ public class SQLDocumentStore implements
 
     // implementation
 
+    private final String MODIFIED = "_modified";
+    private final String MODCOUNT = "_modCount";
+
     private static final Logger LOG = LoggerFactory.getLogger(SQLDocumentStore.class);
 
     private final Comparator<Revision> comparator = Collections.reverseOrder(new StableRevisionComparator());
@@ -171,9 +174,9 @@ public class SQLDocumentStore implements
         try {
             for (UpdateOp update : updates) {
                 T doc = collection.newDocument(this);
-                update.increment("_modCount", 1);
+                update.increment(MODCOUNT, 1);
                 UpdateUtils.applyChanges(doc, update, comparator);
-                writeDocument(collection, doc, null, true);
+                insertDocument(collection, doc);
             }
             // FIXME to be atomic
             return true;
@@ -197,10 +200,15 @@ public class SQLDocumentStore implements
         if (checkConditions && !UpdateUtils.checkConditions(doc, update)) {
             return null;
         }
-        update.increment("_modCount", 1);
+        update.increment(MODCOUNT, 1);
         UpdateUtils.applyChanges(doc, update, comparator);
-        writeDocument(collection, doc, oldDoc != null ? (Long) oldDoc.get("_modCount") : null, oldDoc == null);
         doc.seal();
+        if (oldDoc == null)  {
+            insertDocument(collection, doc);
+        }
+        else {
+            updateDocument(collection, doc, oldDoc != null ? (Long) oldDoc.get(MODCOUNT) : null);
+        }
 
         return oldDoc;
     }
@@ -215,12 +223,12 @@ public class SQLDocumentStore implements
                     throw new MicroKernelException(tableName + " " + id + " not found");
                 }
                 T doc = fromString(collection, in);
-                Long oldmodcount = (Long) doc.get("_modCount");
-                update.increment("_modCount", 1);
+                Long oldmodcount = (Long) doc.get(MODCOUNT);
+                update.increment(MODCOUNT, 1);
                 UpdateUtils.applyChanges(doc, update, comparator);
                 String data = asString(doc);
-                Long modified = (Long) doc.get("_modified");
-                Long modcount = (Long) doc.get("_modCount");
+                Long modified = (Long) doc.get(MODIFIED);
+                Long modcount = (Long) doc.get(MODCOUNT);
                 dbUpdate(connection, tableName, id, modified, modcount, oldmodcount, data);
             }
             connection.commit();
@@ -233,8 +241,8 @@ public class SQLDocumentStore implements
             String indexedProperty, long startValue, int limit) {
         String tableName = getTable(collection);
         List<T> result = new ArrayList<T>();
-        if (indexedProperty != null && !"_modified".equals(indexedProperty)) {
-            throw new RuntimeException("indexed property " + indexedProperty + " not supported");
+        if (indexedProperty != null && !MODIFIED.equals(indexedProperty)) {
+            throw new MicroKernelException("indexed property " + indexedProperty + " not supported");
         }
         try {
             List<String> dbresult = dbQuery(connection, tableName, fromKey, toKey, indexedProperty, startValue, limit);
@@ -320,17 +328,26 @@ public class SQLDocumentStore implements
         }
     }
 
-    private <T extends Document> void writeDocument(Collection<T> collection, T document, Long oldmodcount, boolean insert) {
+    private <T extends Document> void updateDocument(Collection<T> collection, T document, Long oldmodcount) {
         String tableName = getTable(collection);
         try {
             String data = asString(document);
-            Long modified = (Long) document.get("_modified");
-            Long modcount = (Long) document.get("_modCount");
-            if (insert) {
-                dbInsert(connection, tableName, document.getId(), modified, modcount, data);
-            } else {
-                dbUpdate(connection, tableName, document.getId(), modified, modcount, oldmodcount, data);
-            }
+            Long modified = (Long) document.get(MODIFIED);
+            Long modcount = (Long) document.get(MODCOUNT);
+            dbUpdate(connection, tableName, document.getId(), modified, modcount, oldmodcount, data);
+            connection.commit();
+        } catch (SQLException ex) {
+            throw new MicroKernelException(ex);
+        }
+    }
+
+    private <T extends Document> void insertDocument(Collection<T> collection, T document) {
+        String tableName = getTable(collection);
+        try {
+            String data = asString(document);
+            Long modified = (Long) document.get(MODIFIED);
+            Long modcount = (Long) document.get(MODCOUNT);
+            dbInsert(connection, tableName, document.getId(), modified, modcount, data);
             connection.commit();
         } catch (SQLException ex) {
             throw new MicroKernelException(ex);
@@ -361,6 +378,7 @@ public class SQLDocumentStore implements
         if (indexedProperty != null) {
             t += " and MODIFIED >= ?";
         }
+        t += " order by ID";
         if (limit != Integer.MAX_VALUE) {
             t += " limit ?";
         }
@@ -395,12 +413,13 @@ public class SQLDocumentStore implements
         }
         PreparedStatement stmt = connection.prepareStatement(t);
         try {
-            stmt.setObject(1, modified, Types.BIGINT);
-            stmt.setObject(2, modcount, Types.BIGINT);
-            stmt.setString(3, data);
-            stmt.setString(4, id);
+            int si = 1;
+            stmt.setObject(si++, modified, Types.BIGINT);
+            stmt.setObject(si++, modcount, Types.BIGINT);
+            stmt.setString(si++, data);
+            stmt.setString(si++, id);
             if (oldmodcount != null) {
-                stmt.setObject(5, oldmodcount, Types.BIGINT);
+                stmt.setObject(si++, oldmodcount, Types.BIGINT);
             }
             int result = stmt.executeUpdate();
             if (result != 1) {
@@ -413,7 +432,7 @@ public class SQLDocumentStore implements
         }
     }
 
-    private void dbInsert(Connection connection, String tableName, String id, Long modified, Long modcount, String data)
+    private boolean dbInsert(Connection connection, String tableName, String id, Long modified, Long modcount, String data)
             throws SQLException {
         PreparedStatement stmt = connection.prepareStatement("insert into " + tableName + " values(?, ?, ?, ?)");
         try {
@@ -421,17 +440,25 @@ public class SQLDocumentStore implements
             stmt.setObject(2, modified, Types.BIGINT);
             stmt.setObject(3, modcount, Types.BIGINT);
             stmt.setString(4, data);
-            stmt.executeUpdate();
+            int result = stmt.executeUpdate();
+            if (result != 1) {
+                LOG.debug("DB insert failed for " + tableName + "/" + id);
+            }
+            return result == 1;
         } finally {
             stmt.close();
         }
     }
 
-    private void dbDelete(Connection connection, String tableName, String id) throws SQLException {
+    private boolean dbDelete(Connection connection, String tableName, String id) throws SQLException {
         PreparedStatement stmt = connection.prepareStatement("delete from " + tableName + " where ID = ?");
         try {
             stmt.setString(1, id);
-            stmt.executeUpdate();
+            int result = stmt.executeUpdate();
+            if (result != 1) {
+                LOG.debug("DB delete failed for " + tableName + "/" + id);
+            }
+            return result == 1;
         } finally {
             stmt.close();
         }