You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2007/09/19 15:07:51 UTC

svn commit: r577297 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/persistence/bundle/ main/java/org/apache/jackrabbit/core/persistence/bundle/util/ test/java/org/apache/jackrabbit/core/data/

Author: thomasm
Date: Wed Sep 19 06:07:50 2007
New Revision: 577297

URL: http://svn.apache.org/viewvc?rev=577297&view=rev
Log:
JCR-1138: Add AbstractBundlePersistenceManager.getAllNodeIds

Added:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java Wed Sep 19 06:07:50 2007
@@ -29,6 +29,7 @@
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.NodeIdIterator;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
 import org.apache.jackrabbit.core.nodetype.PropDefId;
@@ -78,7 +79,7 @@
  * <li>&lt;param name="{@link #setBundleCacheSize(String) bundleCacheSize}" value="8"/>
  * </ul>
  */
-abstract public class AbstractBundlePersistenceManager implements 
+public abstract class AbstractBundlePersistenceManager implements 
         PersistenceManager, CachingPersistenceManager {
 
     /** the cvs/svn id */
@@ -112,13 +113,13 @@
     private LRUNodeIdCache missing;
 
     /** definition id of the jcr:uuid property */
-    private PropDefId ID_JCR_UUID;
+    private PropDefId idJcrUUID;
 
     /** definition id of the jcr:primaryType property */
-    private PropDefId ID_JCR_PRIMARYTYPE;
+    private PropDefId idJcrPrimaryType;
 
     /** definition id of the jcr:mixinTypes property */
-    private PropDefId ID_JCR_MIXINTYPES;
+    private PropDefId idJcrMixinTypes;
 
     /** the persistence manager context */
     protected PMContext context;
@@ -141,7 +142,7 @@
      * @param bundleCacheSize the bundle cache size in megabytes.
      */
     public void setBundleCacheSize(String bundleCacheSize) {
-        this.bundleCacheSize = Long.parseLong(bundleCacheSize)*1024*1024;
+        this.bundleCacheSize = Long.parseLong(bundleCacheSize) * 1024 * 1024;
     }
 
     /**
@@ -368,7 +369,7 @@
     /**
      * {@inheritDoc}
      */
-    abstract public NodeReferences load(NodeReferencesId targetId)
+    public abstract NodeReferences load(NodeReferencesId targetId)
             throws NoSuchItemStateException, ItemStateException;
 
     /**
@@ -404,11 +405,11 @@
 
         // init prop defs
         if (context.getNodeTypeRegistry() != null) {
-            ID_JCR_UUID = context.getNodeTypeRegistry().getEffectiveNodeType(QName.MIX_REFERENCEABLE).getApplicablePropertyDef(
+            idJcrUUID = context.getNodeTypeRegistry().getEffectiveNodeType(QName.MIX_REFERENCEABLE).getApplicablePropertyDef(
                     QName.JCR_UUID, PropertyType.STRING, false).getId();
-            ID_JCR_PRIMARYTYPE = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
+            idJcrPrimaryType = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
                     QName.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId();
-            ID_JCR_MIXINTYPES = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
+            idJcrMixinTypes = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
                     QName.JCR_MIXINTYPES, PropertyType.NAME, true).getId();
         }
     }
@@ -444,20 +445,20 @@
             if (id.getName().equals(QName.JCR_UUID)) {
                 state = createNew(id);
                 state.setType(PropertyType.STRING);
-                state.setDefinitionId(ID_JCR_UUID);
+                state.setDefinitionId(idJcrUUID);
                 state.setMultiValued(false);
                 state.setValues(new InternalValue[]{InternalValue.create(id.getParentId().getUUID().toString())});
             } else if (id.getName().equals(QName.JCR_PRIMARYTYPE)) {
                 state = createNew(id);
                 state.setType(PropertyType.NAME);
-                state.setDefinitionId(ID_JCR_PRIMARYTYPE);
+                state.setDefinitionId(idJcrPrimaryType);
                 state.setMultiValued(false);
                 state.setValues(new InternalValue[]{InternalValue.create(bundle.getNodeTypeName())});
             } else if (id.getName().equals(QName.JCR_MIXINTYPES)) {
                 Set mixins = bundle.getMixinTypeNames();
                 state = createNew(id);
                 state.setType(PropertyType.NAME);
-                state.setDefinitionId(ID_JCR_MIXINTYPES);
+                state.setDefinitionId(idJcrMixinTypes);
                 state.setMultiValued(true);
                 state.setValues(InternalValue.create((QName[]) mixins.toArray(new QName[mixins.size()])));
             } else {
@@ -475,7 +476,7 @@
      */
     public synchronized boolean exists(PropertyId id) throws ItemStateException {
         NodePropBundle bundle = getBundle(id.getParentId());
-        return bundle !=null && bundle.hasProperty(id.getName());
+        return bundle != null && bundle.hasProperty(id.getName());
     }
 
     /**
@@ -701,4 +702,20 @@
             bundles.put(bundle);
         }
     }
+
+    /**
+     * Get all node ids. 
+     * A typical application will call this method multiple times, where 'after'
+     * is the last row read. The maxCount parameter defines the maximum number of 
+     * node ids returned, 0 meaning no limit. The order of the node ids is specific for the 
+     * given persistent manager. Items that are added concurrently may not be included.
+     * 
+     * @param after the lower limit, or null for no limit.
+     * @param maxCount the maximum number of node ids to return, or 0 for no limit.
+     * @return an iterator of all bundles.
+     * @throws ItemStateException if an error while loading occurs.
+     */
+    public abstract NodeIdIterator getAllNodeIds(NodeId after, int maxCount)
+            throws ItemStateException;
+
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java Wed Sep 19 06:07:50 2007
@@ -38,6 +38,7 @@
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.NodeIdIterator;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.uuid.UUID;
 
@@ -62,6 +63,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import javax.jcr.RepositoryException;
 
@@ -149,6 +151,8 @@
     protected String bundleUpdateSQL;
     protected String bundleSelectSQL;
     protected String bundleDeleteSQL;
+    protected String bundleSelectAllIdsFromSQL;
+    protected String bundleSelectAllIdsSQL;
 
     // SQL statements for NodeReference management
     protected String nodeReferenceInsertSQL;
@@ -891,6 +895,63 @@
     /**
      * {@inheritDoc}
      */
+    public synchronized NodeIdIterator getAllNodeIds(NodeId bigger, int maxCount)
+            throws ItemStateException {
+        ResultSet rs = null;
+        try {
+            UUID lowUuid;
+            Object[] keys;
+            String sql;
+            if (bigger == null) {
+                sql = bundleSelectAllIdsSQL;
+                lowUuid = null;
+                keys = new Object[0];
+            } else {
+                sql = bundleSelectAllIdsFromSQL;
+                lowUuid = bigger.getUUID();
+                keys = getKey(lowUuid);
+            }
+            if (maxCount > 0) {
+                // get some more rows, in case the first row is smaller
+                // only required for SM_LONGLONG_KEYS
+                // probability is very low to get get the wrong first key, < 1 : 2^64
+                // see also bundleSelectAllIdsFrom SQL statement
+                maxCount += 10;
+            }
+            Statement stmt = connectionManager.executeStmt(sql, keys, false, maxCount + 10);
+            rs = stmt.getResultSet();
+            ArrayList result = new ArrayList();
+            while ((maxCount == 0 || result.size() < maxCount) && rs.next()) {
+                UUID current;
+                if (getStorageModel() == SM_BINARY_KEYS) {
+                    current = new UUID(rs.getBytes(1));
+                } else {
+                    long high = rs.getLong(1);
+                    long low = rs.getLong(2);
+                    current = new UUID(high, low);
+                }
+                if (lowUuid != null) {
+                    // skip the keys that are smaller or equal (see above, maxCount += 10)
+                    if (current.compareTo(lowUuid) <= 0) {
+                        continue;
+                    }
+                }
+                result.add(current);
+            }        
+            ListNodeIdIterator it = new ListNodeIdIterator(result);
+            return it;
+        } catch (SQLException e) {
+            String msg = "getAllNodeIds failed.";
+            log.error(msg, e);
+            throw new ItemStateException(msg, e);
+        } finally {
+            closeResultSet(rs);
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
     protected synchronized NodePropBundle loadBundle(NodeId id)
             throws ItemStateException {
         ResultSet rs = null;
@@ -1198,6 +1259,9 @@
             nodeReferenceUpdateSQL = "update " + schemaObjectPrefix + "REFS set REFS_DATA = ? where NODE_ID = ?";
             nodeReferenceSelectSQL = "select REFS_DATA from " + schemaObjectPrefix + "REFS where NODE_ID = ?";
             nodeReferenceDeleteSQL = "delete from " + schemaObjectPrefix + "REFS where NODE_ID = ?";
+            
+            bundleSelectAllIdsSQL = "select NODE_ID from " + schemaObjectPrefix + "BUNDLE";
+            bundleSelectAllIdsFromSQL = "select NODE_ID from " + schemaObjectPrefix + "BUNDLE WHERE NODE_ID > ? ORDER BY NODE_ID";
         } else {
             bundleInsertSQL = "insert into " + schemaObjectPrefix + "BUNDLE (BUNDLE_DATA, NODE_ID_HI, NODE_ID_LO) values (?, ?, ?)";
             bundleUpdateSQL = "update " + schemaObjectPrefix + "BUNDLE set BUNDLE_DATA = ? where NODE_ID_HI = ? and NODE_ID_LO = ?";
@@ -1208,7 +1272,13 @@
             nodeReferenceUpdateSQL = "update " + schemaObjectPrefix + "REFS set REFS_DATA = ? where NODE_ID_HI = ? and NODE_ID_LO = ?";
             nodeReferenceSelectSQL = "select REFS_DATA from " + schemaObjectPrefix + "REFS where NODE_ID_HI = ? and NODE_ID_LO = ?";
             nodeReferenceDeleteSQL = "delete from " + schemaObjectPrefix + "REFS where NODE_ID_HI = ? and NODE_ID_LO = ?";
+            
+            bundleSelectAllIdsSQL = "select NODE_ID_HI, NODE_ID_LO from " + schemaObjectPrefix + "BUNDLE";
+            // need to use HI and LO parameters
+            // this is not the exact statement, but not all databases support WHERE (NODE_ID_HI, NODE_ID_LOW) >= (?, ?)
+            bundleSelectAllIdsFromSQL = "select NODE_ID_HI, NODE_ID_LO from " + schemaObjectPrefix + "BUNDLE WHERE (NODE_ID_HI >= ?) AND (? IS NOT NULL) ORDER BY NODE_ID_HI, NODE_ID_LO";
         }
+        
     }
 
     /**
@@ -1339,4 +1409,35 @@
             // owning BundleDbPersistenceManager
         }
     }
+
+    private class ListNodeIdIterator implements NodeIdIterator {
+        
+        private final ArrayList list;
+        private int pos;
+        
+        ListNodeIdIterator(ArrayList list) {
+            this.list = list;
+        }
+        
+        public NodeId nextNodeId() throws NoSuchElementException {
+            if (!hasNext()) {
+                throw new NoSuchElementException();
+            }
+            return new NodeId((UUID) list.get(pos++));
+        }        
+
+        public boolean hasNext() {
+            return pos < list.size();
+        }
+
+        public Object next() {
+            return nextNodeId();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+        
+    }
+
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java Wed Sep 19 06:07:50 2007
@@ -20,6 +20,7 @@
 import org.slf4j.LoggerFactory;
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.BasedFileSystem;
+import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle;
@@ -30,11 +31,13 @@
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
 import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
 import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.NodeIdIterator;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
+import org.apache.jackrabbit.uuid.UUID;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -43,6 +46,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
 
 /**
  * This is a generic persistence manager that stores the {@link NodePropBundle}s
@@ -677,4 +683,105 @@
         }
     }
 
-}
\ No newline at end of file
+    /**
+     * {@inheritDoc}
+     */
+    public NodeIdIterator getAllNodeIds(NodeId bigger, int maxCount)
+            throws ItemStateException {
+        ArrayList list = new ArrayList();
+        try {
+            getListRecursive(list, "", bigger == null ? null : bigger.getUUID(), maxCount);
+            return new FileNodeIdIterator(list);
+        } catch (FileSystemException e) {
+            String msg = "failed to read node list: " + bigger + ": " + e;
+            log.error(msg);
+            throw new ItemStateException(msg, e);
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */    
+    protected UUID getUUIDFromFileName(String fileName) {
+        StringBuffer buff = new StringBuffer(35);
+        if (!fileName.endsWith("." + NODEFILENAME)) {
+            return null;
+        }
+        for (int i = 0; i < fileName.length(); i++) {
+            char c = fileName.charAt(i);
+            if (c == '.') {
+                break;
+            }
+            if (c != '/') {
+                buff.append(c);
+                int len = buff.length();
+                if (len == 8 || len == 13 || len == 18 || len == 23) {
+                    buff.append('-');
+                }
+            }
+        }
+        String u = buff.toString();
+        return new UUID(u);
+    }    
+    
+    private void getListRecursive(ArrayList list, String path, UUID bigger,
+            int maxCount) throws FileSystemException {
+        if (maxCount > 0 && list.size() >= maxCount) {
+            return;
+        }
+        String[] files = itemFs.listFiles(path);
+        Arrays.sort(files);
+        for (int i = 0; i < files.length; i++) {
+            String f = files[i];
+            UUID u = getUUIDFromFileName(path + FileSystem.SEPARATOR + f);
+            if (u == null) {
+                continue;
+            }
+            if (bigger != null && bigger.toString().compareTo(u.toString()) < 0) {
+                continue;
+            }
+            NodeId n = new NodeId(u);
+            list.add(n);
+            if (maxCount > 0 && list.size() >= maxCount) {
+                return;
+            }
+        }
+        String[] dirs = itemFs.listFolders(path);
+        Arrays.sort(dirs);
+        for (int i = 0; i < dirs.length; i++) {
+            getListRecursive(list, path + FileSystem.SEPARATOR + dirs[i],
+                    bigger, maxCount);
+        }
+    }
+    
+    private static class FileNodeIdIterator implements NodeIdIterator {
+
+        private final ArrayList list;
+        private int pos;
+
+        FileNodeIdIterator(ArrayList list) {
+            this.list = list;
+        }
+
+        public NodeId nextNodeId() throws NoSuchElementException {
+            if (pos < list.size()) {
+                return (NodeId) list.get(pos++);
+            }
+            throw new NoSuchElementException();
+        }
+
+        public boolean hasNext() {
+            return pos < list.size();
+        }
+
+        public Object next() {
+            return nextNodeId();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+        
+    }
+
+}

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java Wed Sep 19 06:07:50 2007
@@ -205,36 +205,35 @@
      * @throws SQLException if an error occurs
      */
     public synchronized Statement executeStmt(String sql, Object[] params) throws SQLException {
-        try {
-            PreparedStatement stmt = (PreparedStatement) preparedStatements.get(sql);
-            if (stmt == null) {
-                stmt = getConnection().prepareStatement(sql);
-                preparedStatements.put(sql, stmt);
-            }
-            return executeStmtInternal(params, stmt);
-        } catch (SQLException e) {
-            logException("could not execute statement", e);
-            close();
-            throw e;
-        }
-    }
+        return executeStmt(sql, params, false, 0);
+    }    
 
     /**
      * Executes the given SQL statement with the specified parameters.
      *
      * @param sql statement to execute
      * @param params parameters to set
-     * @param autoGeneratedKeys the constant that tells the driver to make auto generated keys available
+     * @param returnGeneratedKeys if the statement should return auto generated keys
+     * @param maxRows the maximum number of rows to return (0 for all rows)
      * @return the <code>Statement</code> object that had been executed
      * @throws SQLException if an error occurs
      */
-    public synchronized Statement executeStmt(String sql, Object[] params, int autoGeneratedKeys) throws SQLException {
+    public synchronized Statement executeStmt(String sql, Object[] params, boolean returnGeneratedKeys, int maxRows) throws SQLException {
         try {
-            PreparedStatement stmt = (PreparedStatement) preparedStatements.get(sql + "_" + autoGeneratedKeys);
+            String key = sql;
+            if (returnGeneratedKeys) {
+                key += " RETURN_GENERATED_KEYS";
+            }
+            PreparedStatement stmt = (PreparedStatement) preparedStatements.get(key);
             if (stmt == null) {
-                stmt = getConnection().prepareStatement(sql, autoGeneratedKeys);
-                preparedStatements.put(sql + "_" + autoGeneratedKeys, stmt);
+                if (returnGeneratedKeys) {
+                    stmt = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
+                } else {
+                    stmt = getConnection().prepareStatement(sql);
+                }
+                preparedStatements.put(key, stmt);
             }
+            stmt.setMaxRows(maxRows);
             return executeStmtInternal(params, stmt);
         } catch (SQLException e) {
             logException("could not execute statement", e);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java Wed Sep 19 06:07:50 2007
@@ -140,7 +140,7 @@
         // assert index does not exist
         ResultSet rs = null;
         try {
-            Statement stmt = connectionManager.executeStmt(nameInsertSQL, new Object[]{string}, Statement.RETURN_GENERATED_KEYS);
+            Statement stmt = connectionManager.executeStmt(nameInsertSQL, new Object[]{string}, true, 0);
             rs = stmt.getGeneratedKeys();
             if (!rs.next()) {
                 return -1;

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java?rev=577297&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java Wed Sep 19 06:07:50 2007
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.data;
+
+import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.NodeIdIterator;
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
+import org.apache.jackrabbit.core.persistence.bundle.AbstractBundlePersistenceManager;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.uuid.UUID;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Method;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.Session;
+
+public class PersistenceManagerIteratorTest extends AbstractJCRTest {
+    /** logger instance */
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceManagerIteratorTest.class);
+
+    private void log(String s) {
+        // System.out.println(s);
+        LOG.info(s);
+    }
+
+    public void testGetAllNodeIds() throws Exception {
+        Node root = testRootNode;
+        Session session = root.getSession();
+        Repository rep = session.getRepository();
+
+        if (!(rep instanceof RepositoryImpl)) {
+            log("Test skipped. Required repository class: "
+                    + RepositoryImpl.class + " got: " + rep.getClass());
+            return;
+        }
+
+        RepositoryImpl r = (RepositoryImpl) rep;
+        Method m = r.getClass().getDeclaredMethod("getWorkspaceNames",
+                new Class[0]);
+        m.setAccessible(true);
+        String[] names = (String[]) m.invoke(r, new Object[0]);
+        for (int i = 0; i < names.length; i++) {
+            m = r.getClass().getDeclaredMethod("getWorkspaceInfo", new Class[] { String.class });
+            m.setAccessible(true);
+            Object info = m.invoke(r, new String[] { names[i] });
+            m = info.getClass().getDeclaredMethod("getPersistenceManager", new Class[0]);
+            m.setAccessible(true);
+            PersistenceManager pm = (PersistenceManager) m.invoke(info, new Object[0]);
+            if (!(pm instanceof AbstractBundlePersistenceManager)) {
+                log("PM skipped: " + pm.getClass());
+                continue;
+            }
+            AbstractBundlePersistenceManager apm = (AbstractBundlePersistenceManager) pm;
+            log("PM: " + pm.getClass().getName());
+
+            log("All nodes in one step");
+            NodeIdIterator it = apm.getAllNodeIds(null, 0);
+            NodeId after = null;
+            while (it.hasNext()) {
+                NodeId id = it.nextNodeId();
+                log("  " + id.toString());
+                if (after != null) {
+                    assertEquals(id.getUUID().compareTo(after.getUUID()), 1);
+                }
+                after = id;
+            }
+
+            log("All nodes using batches");
+            while (true) {
+                log(" bigger than: " + after);
+                it = apm.getAllNodeIds(after, 2);
+                if (!it.hasNext()) {
+                    break;
+                }
+                while (it.hasNext()) {
+                    NodeId id = it.nextNodeId();
+                    log("    " + id.toString());
+                    assertEquals(id.getUUID().compareTo(after.getUUID()), 1);
+                    after = id;
+                }
+            }
+
+            log("Random access");
+            for (int j = 0; j < 50; j++) {
+                after = new NodeId(UUID.randomUUID());
+                log(" bigger than: " + after);
+                it = apm.getAllNodeIds(after, 2);
+                while (it.hasNext()) {
+                    NodeId id = it.nextNodeId();
+                    log("    " + id.toString());
+                    assertEquals(id.getUUID().compareTo(after.getUUID()), 1);
+                    after = id;
+                }
+            }
+        }
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java?rev=577297&r1=577296&r2=577297&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java Wed Sep 19 06:07:50 2007
@@ -35,6 +35,7 @@
         suite.addTestSuite(NodeTypeTest.class);
         suite.addTestSuite(ExportImportTest.class);
         suite.addTestSuite(GarbageCollectorTest.class);
+        suite.addTestSuite(PersistenceManagerIteratorTest.class);
         return suite;
     }