Author: toad
Date: 2008-10-18 17:53:16 +0000 (Sat, 18 Oct 2008)
New Revision: 23000

Added:
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/MInstanceCount.java
Modified:
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/Db4oVersion.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/Defragment.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/DefragmentServicesImpl.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/ext/StoredClass.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/ClassMetadata.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/Const4.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/FieldMetadata.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/HandlerVersionRegistry.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/InternalObjectContainer.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/LocalObjectContainer.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PartialEmbeddedClientObjectContainer.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PrimitiveFieldHandler.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/StoredClassImpl.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/ClientObjectContainer.java
   trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/Msg.java
   
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/marshall/ClassMarshaller.java
Log:
Update db4o to 7.4.63.11890 from website.

Modified: trunk/contrib/db4o/src/db4oj/core/src/com/db4o/Db4oVersion.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/Db4oVersion.java     
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/Db4oVersion.java     
2008-10-18 17:53:16 UTC (rev 23000)
@@ -24,9 +24,9 @@
 * @exclude
 */
 public class Db4oVersion {
-    public static final String NAME = "7.4.58.11547";
+    public static final String NAME = "7.4.63.11890";
     public static final int MAJOR = 7;
     public static final int MINOR = 4;
-    public static final int ITERATION = 58;
-    public static final int REVISION = 11547;
+    public static final int ITERATION = 63;
+    public static final int REVISION = 11890;
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/Defragment.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/Defragment.java   
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/Defragment.java   
2008-10-18 17:53:16 UTC (rev 23000)
@@ -267,12 +267,12 @@
        }

        private static boolean parentHasIndex(ClassMetadata curClass) {
-               ClassMetadata parentClass = curClass.i_ancestor;
+               ClassMetadata parentClass = curClass.getAncestor();
                while (parentClass != null) {
                        if (parentClass.hasClassIndex()) {
                                return true;
                        }
-                       parentClass = parentClass.i_ancestor;
+                       parentClass = parentClass.getAncestor();
                }
                return false;
        }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/DefragmentServicesImpl.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/DefragmentServicesImpl.java
       2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/defragment/DefragmentServicesImpl.java
       2008-10-18 17:53:16 UTC (rev 23000)
@@ -334,15 +334,19 @@
                        return cachedHasFieldIndex.definiteYes();
                }
                final BooleanByRef hasFieldIndex = new BooleanByRef(false);
-               clazz.forEachDeclaredField(new Procedure4() {
-                       public void apply(Object arg) {
-                               FieldMetadata curField = (FieldMetadata)arg;
-                               if (curField.hasIndex()
-                                               && (curField.getHandler() 
instanceof StringHandler)) {
-                                       hasFieldIndex.value = true;
+               ClassMetadata curClazz = clazz;
+               while(!hasFieldIndex.value && curClazz != null) {
+                       curClazz.forEachDeclaredField(new Procedure4() {
+                               public void apply(Object arg) {
+                                       FieldMetadata curField = 
(FieldMetadata)arg;
+                                       if (curField.hasIndex()
+                                                       && 
(curField.getHandler() instanceof StringHandler)) {
+                                               hasFieldIndex.value = true;
+                                       }
                                }
-                       }
-               });
+                       });
+                       curClazz = curClazz.getAncestor();
+               }
                _hasFieldIndexCache.put(clazz, 
TernaryBool.forBoolean(hasFieldIndex.value));
                return hasFieldIndex.value;
        }

Modified: trunk/contrib/db4o/src/db4oj/core/src/com/db4o/ext/StoredClass.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/ext/StoredClass.java 
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/ext/StoredClass.java 
2008-10-18 17:53:16 UTC (rev 23000)
@@ -74,5 +74,14 @@
         * @return the {@link StoredField}
         */
        public StoredField storedField(String name, Object type);
-        
+
+       /**
+        * Returns the number of instances of this class that have been 
persisted to the
+        * database, as seen by the transaction (container) that produces this 
StoredClass
+        * instance.
+        * 
+        * @return The number of instances
+        */
+       public int instanceCount();
+
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/ClassMetadata.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/ClassMetadata.java  
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/ClassMetadata.java  
2008-10-18 17:53:16 UTC (rev 23000)
@@ -768,7 +768,7 @@
     }


-    ClassMetadata getAncestor() {
+    public ClassMetadata getAncestor() {
         return i_ancestor;
     }

@@ -2001,5 +2001,12 @@
        return _aspects == null;
     }

-    
+       public int instanceCount() {
+               return instanceCount(_container.transaction());
+       }
+
+       public int instanceCount(Transaction trans) {
+               return _container.instanceCount(this, trans);
+       }
+
 }

Modified: trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/Const4.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/Const4.java 
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/Const4.java 
2008-10-18 17:53:16 UTC (rev 23000)
@@ -27,7 +27,9 @@
 /**
  * @exclude
  * 
- *  TODO: Split into separate enums with defined range and values. 
+ *  TODO: Split into separate enums with defined range and values.
+ *  
+ *   @sharpen.partial
  */
 public final class Const4
 {
@@ -177,8 +179,9 @@
     };

     public static final String VIRTUAL_FIELD_PREFIX = "v4o";
-    
+
+    /**
+     * @sharpen.ignore
+     */
     public static final int MAX_STACK_DEPTH = 20;
-
-
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/FieldMetadata.java
===================================================================
--- trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/FieldMetadata.java  
2008-10-18 14:39:52 UTC (rev 22999)
+++ trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/FieldMetadata.java  
2008-10-18 17:53:16 UTC (rev 23000)
@@ -706,16 +706,15 @@

     private boolean checkAlive(AspectVersionContext context){
        if(! checkEnabled(context)){
-               return false;
-       }
-       
-        boolean alive = alive(); 
-        if (! alive) {
-            incrementOffset((ReadBuffer)context);
-        }
-        return alive;
+                       return false;
+               }               
+               boolean alive = alive(); 
+               if (!alive) {
+                   incrementOffset((ReadBuffer)context);
+               }
+               return alive;
     }
-    
+
     private void informAboutTransaction(Object obj, Transaction trans){
         if (_db4oType != null  && obj != null) {
             ((Db4oTypeImpl) obj).setTrans(trans);
@@ -887,12 +886,23 @@
     }

     public Object read(InternalReadContext context) {
-        if (!checkAlive((AspectVersionContext)context)) {
+        if(!canReadFromSlot((AspectVersionContext) context)) {
+                       incrementOffset(context);
             return null;
         }
         return context.read(_handler);
     }

+       private boolean canReadFromSlot(AspectVersionContext context) {
+       if(! enabled(context)){
+               return false;
+       }
+       if(alive()) {
+               return true;
+       }
+               return _state != FieldMetadataState.NOT_LOADED;
+       }
+
     /** never called but keep for Rickie */
     public void refreshActivated() {
        _state = FieldMetadataState.AVAILABLE;

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/HandlerVersionRegistry.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/HandlerVersionRegistry.java
 2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/HandlerVersionRegistry.java
 2008-10-18 17:53:16 UTC (rev 23000)
@@ -46,6 +46,9 @@
         if(version >= HandlerRegistry.HANDLER_VERSION){
             return originalHandler;
         }
+        if(originalHandler == null){
+               return null;  // HandlerVersionKey with null key will throw NPE.
+        }
         TypeHandler4 replacement = (TypeHandler4) _versions.get(new 
HandlerVersionKey(genericTemplate(originalHandler), version));
         if(replacement == null){
             return correctHandlerVersion(originalHandler, version + 1);    

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/InternalObjectContainer.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/InternalObjectContainer.java
        2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/InternalObjectContainer.java
        2008-10-18 17:53:16 UTC (rev 23000)
@@ -56,4 +56,6 @@

     public Object syncExec(Closure4 block);

+    public int instanceCount(ClassMetadata clazz, Transaction trans);
+
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/LocalObjectContainer.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/LocalObjectContainer.java
   2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/LocalObjectContainer.java
   2008-10-18 17:53:16 UTC (rev 23000)
@@ -865,5 +865,11 @@
     public void onCommittedListener() {
         // do nothing
     }
+
+       public int instanceCount(ClassMetadata clazz, Transaction trans) {
+               synchronized(lock()) {
+                       return clazz.indexEntryCount(trans);
+               }
+       }

 }
\ No newline at end of file

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PartialEmbeddedClientObjectContainer.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PartialEmbeddedClientObjectContainer.java
   2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PartialEmbeddedClientObjectContainer.java
   2008-10-18 17:53:16 UTC (rev 23000)
@@ -473,4 +473,8 @@
        return _server.syncExec(block);
     }

+       public int instanceCount(ClassMetadata clazz, Transaction trans) {
+               return _server.instanceCount(clazz, trans);
+       }
+
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PrimitiveFieldHandler.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PrimitiveFieldHandler.java
  2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/PrimitiveFieldHandler.java
  2008-10-18 17:53:16 UTC (rev 23000)
@@ -18,231 +18,234 @@
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */
-package com.db4o.internal;
-
-import com.db4o.ext.*;
-import com.db4o.foundation.*;
-import com.db4o.internal.activation.*;
-import com.db4o.internal.delete.*;
-import com.db4o.internal.fieldhandlers.*;
-import com.db4o.internal.handlers.*;
-import com.db4o.internal.handlers.array.*;
-import com.db4o.internal.marshall.*;
-import com.db4o.marshall.*;
-import com.db4o.reflect.*;
-import com.db4o.typehandlers.*;
-
-
-/**
- * @exclude
- */
-public class PrimitiveFieldHandler extends ClassMetadata implements 
FieldHandler, VersionedTypeHandler{
-    
-    private static final int HASHCODE_FOR_NULL = 283636383;
-    
-    private final TypeHandler4 _handler;
-    
-    public PrimitiveFieldHandler(ObjectContainerBase container, TypeHandler4 
handler, int handlerID, ReflectClass classReflector) {
-       super(container, classReflector);
-        _aspects = FieldMetadata.EMPTY_ARRAY;
-        _handler = handler;
-        _id = handlerID;
-    }
-    
-    public PrimitiveFieldHandler(){
-        super(null, null);
-        _handler = null;
-    }
-
-    public void activateFields(Transaction trans, Object obj, ActivationDepth 
depth) {
-        // Override
-        // do nothing
-    }
-
-    final void addToIndex(Transaction trans, int id) {
-        // Override
-        // Primitive Indices will be created later.
-    }
-
-    boolean allowsQueries() {
-        return false;
-    }
-
-    void cacheDirty(Collection4 col) {
-        // do nothing
-    }
-    
-    public boolean descendOnCascadingActivation() {
-        return false;
-    }
-
-    public void delete(DeleteContext context) throws Db4oIOException {
-       if(context.isLegacyHandlerVersion()){
-               context.readInt();
-               context.defragmentRecommended();
-       }
-    }
-
-    void deleteMembers(MarshallerFamily mf, ObjectHeaderAttributes attributes, 
StatefulBuffer a_bytes, int a_type, boolean isUpdate) {
-        if (a_type == Const4.TYPE_ARRAY) {
-            new ArrayHandler(this, true).deletePrimitiveEmbedded(a_bytes, 
this);
-        } else if (a_type == Const4.TYPE_NARRAY) {
-            new MultidimensionalArrayHandler(this, 
true).deletePrimitiveEmbedded(a_bytes, this);
-        }
-    }
-    
-    void deleteMembers(DeleteContextImpl context, int a_type, boolean 
isUpdate) {
-        if (a_type == Const4.TYPE_ARRAY) {
-            new ArrayHandler(this, 
true).deletePrimitiveEmbedded((StatefulBuffer) context.buffer(), this);
-        } else if (a_type == Const4.TYPE_NARRAY) {
-            new MultidimensionalArrayHandler(this, 
true).deletePrimitiveEmbedded((StatefulBuffer) context.buffer(), this);
-        }
-    }
-    
-       final void free(StatefulBuffer a_bytes, int a_id) {
-          a_bytes.transaction().slotFreePointerOnCommit(a_id, a_bytes.slot());
-       }
-    
-       public boolean hasClassIndex() {
-           return false;
-       }
-
-    public Object instantiate(UnmarshallingContext context) {
-        Object obj = context.persistentObject();
-        if (obj == null) {
-            obj = context.read(_handler);
-            context.setObjectWeak(obj);
-        }
-        context.setStateClean();
-        return obj;
-    }
-    
-    public Object instantiateTransient(UnmarshallingContext context) {
-        return _handler.read(context);
-    }
-
-    Object instantiateFields(UnmarshallingContext context) {
-        Object obj = context.read(_handler);
-        if (obj == null  ||  ! (_handler instanceof DateHandler)) {
-            return obj;
-        }
-        final Object existing = context.persistentObject();
-               Object newValue = dateHandler().copyValue(obj, existing);
-               
-        // FIXME: It should not be necessary to set persistentObject here
-        context.persistentObject(newValue);
-        
-               return newValue;
-    }
-
-       private DateHandler dateHandler() {
-               return ((DateHandler)_handler);
-       }
-
-    public boolean isArray() {
-        return _id == Handlers4.ANY_ARRAY_ID || _id == 
Handlers4.ANY_ARRAY_N_ID;
-    }
-    
-    public boolean isPrimitive(){
-        return true;
-    }
-    
-       public boolean isStrongTyped(){
-               return false;
-       }
-    
-    public PreparedComparison prepareComparison(Context context, Object 
source) {
-       return _handler.prepareComparison(context, source);
-    }
-    
-    public TypeHandler4 readCandidateHandler(QueryingReadContext context) {
-        if (isArray()) {
-            return _handler;
-        }
-        return null;
-    }
-    
-    public ObjectID readObjectID(InternalReadContext context){
-        if(_handler instanceof ClassMetadata){
-            return ((ClassMetadata)_handler).readObjectID(context);
-        }
-        if(_handler instanceof ArrayHandler){
-            // TODO: Here we should theoretically read through the array and 
collect candidates.
-            // The respective construct is wild: "Contains query through an 
array in an array."
-            // Ignore for now.
-            return ObjectID.IGNORE;
-        }
-        return ObjectID.NOT_POSSIBLE;
-    }
-    
-    void removeFromIndex(Transaction ta, int id) {
-        // do nothing
-    }
-    
-    public final boolean writeObjectBegin() {
-        return false;
-    }
-    
-    public String toString(){
-        return "Wraps " + _handler.toString() + " in YapClassPrimitive";
-    }
-
-    public void defragment(DefragmentContext context) {
-       _handler.defragment(context);
-    }
-    
-    public Object wrapWithTransactionContext(Transaction transaction, Object 
value) {
-        return value;
-    }
-    
-    public Object read(ReadContext context) {
-        return _handler.read(context);
-    }
-    
-    public void write(WriteContext context, Object obj) {
-        _handler.write(context, obj);
-    }
-    
-    public TypeHandler4 typeHandler(){
-        return _handler;
-    }
-    
-    public TypeHandler4 delegateTypeHandler(){
-        return _handler;
-    }
-    
-    public TypeHandler4 unversionedTemplate() {
-        return new PrimitiveFieldHandler(null, null, 0, null);
-    }
-    
-    public boolean equals(Object obj) {
-        if(! (obj instanceof PrimitiveFieldHandler)){
-            return false;
-        }
-        PrimitiveFieldHandler other = (PrimitiveFieldHandler) obj;
-        if(_handler == null){
-            return other._handler == null;
-        }
-        return _handler.equals(other._handler);
-    }
-    
-    public int hashCode() {
-        if(_handler == null){
-            return HASHCODE_FOR_NULL;
-        }
-        return _handler.hashCode();
-    }
-    
-    public Object deepClone(Object context) {
-        TypeHandlerCloneContext typeHandlerCloneContext = 
(TypeHandlerCloneContext) context;
-        PrimitiveFieldHandler original = (PrimitiveFieldHandler) 
typeHandlerCloneContext.original;
-        TypeHandler4 delegateTypeHandler = 
typeHandlerCloneContext.correctHandlerVersion(original.delegateTypeHandler());
-        return new PrimitiveFieldHandler(original.container(), 
delegateTypeHandler, original._id, original.classReflector());
-    }
-    
-    public boolean isSecondClass() {
-       return isSecondClass(_handler);
-    }
-
-
-}
+package com.db4o.internal;
+
+import com.db4o.ext.*;
+import com.db4o.foundation.*;
+import com.db4o.internal.activation.*;
+import com.db4o.internal.delete.*;
+import com.db4o.internal.fieldhandlers.*;
+import com.db4o.internal.handlers.*;
+import com.db4o.internal.handlers.array.*;
+import com.db4o.internal.marshall.*;
+import com.db4o.marshall.*;
+import com.db4o.reflect.*;
+import com.db4o.typehandlers.*;
+
+
+/**
+ * @exclude
+ */
+public class PrimitiveFieldHandler extends ClassMetadata implements 
FieldHandler, VersionedTypeHandler{
+    
+    private static final int HASHCODE_FOR_NULL = 283636383;
+    
+    private final TypeHandler4 _handler;
+    
+    public PrimitiveFieldHandler(ObjectContainerBase container, TypeHandler4 
handler, int handlerID, ReflectClass classReflector) {
+       super(container, classReflector);
+        _aspects = FieldMetadata.EMPTY_ARRAY;
+        _handler = handler;
+        _id = handlerID;
+    }
+    
+    public PrimitiveFieldHandler(){
+        super(null, null);
+        _handler = null;
+    }
+
+    public void activateFields(Transaction trans, Object obj, ActivationDepth 
depth) {
+        // Override
+        // do nothing
+    }
+
+    final void addToIndex(Transaction trans, int id) {
+        // Override
+        // Primitive Indices will be created later.
+    }
+
+    boolean allowsQueries() {
+        return false;
+    }
+
+    void cacheDirty(Collection4 col) {
+        // do nothing
+    }
+    
+    public boolean descendOnCascadingActivation() {
+        return false;
+    }
+
+    public void delete(DeleteContext context) throws Db4oIOException {
+       if(context.isLegacyHandlerVersion()){
+               context.readInt();
+               context.defragmentRecommended();
+       }
+    }
+
+    void deleteMembers(MarshallerFamily mf, ObjectHeaderAttributes attributes, 
StatefulBuffer a_bytes, int a_type, boolean isUpdate) {
+        if (a_type == Const4.TYPE_ARRAY) {
+            new ArrayHandler(this, true).deletePrimitiveEmbedded(a_bytes, 
this);
+        } else if (a_type == Const4.TYPE_NARRAY) {
+            new MultidimensionalArrayHandler(this, 
true).deletePrimitiveEmbedded(a_bytes, this);
+        }
+    }
+    
+    void deleteMembers(DeleteContextImpl context, int a_type, boolean 
isUpdate) {
+        if (a_type == Const4.TYPE_ARRAY) {
+            new ArrayHandler(this, 
true).deletePrimitiveEmbedded((StatefulBuffer) context.buffer(), this);
+        } else if (a_type == Const4.TYPE_NARRAY) {
+            new MultidimensionalArrayHandler(this, 
true).deletePrimitiveEmbedded((StatefulBuffer) context.buffer(), this);
+        }
+    }
+    
+       final void free(StatefulBuffer a_bytes, int a_id) {
+          a_bytes.transaction().slotFreePointerOnCommit(a_id, a_bytes.slot());
+       }
+    
+       public boolean hasClassIndex() {
+           return false;
+       }
+
+    public Object instantiate(UnmarshallingContext context) {
+        Object obj = context.persistentObject();
+        if (obj == null) {
+            obj = context.read(_handler);
+            context.setObjectWeak(obj);
+        }
+        context.setStateClean();
+        return obj;
+    }
+    
+    public Object instantiateTransient(UnmarshallingContext context) {
+        return correctHandlerVersion(context).read(context);
+    }
+
+    Object instantiateFields(UnmarshallingContext context) {
+        Object obj = context.read(_handler);
+        if (obj == null  ||  ! (_handler instanceof DateHandler)) {
+            return obj;
+        }
+        final Object existing = context.persistentObject();
+               Object newValue = dateHandler().copyValue(obj, existing);
+               
+        // FIXME: It should not be necessary to set persistentObject here
+        context.persistentObject(newValue);
+        
+               return newValue;
+    }
+
+       private DateHandler dateHandler() {
+               return ((DateHandler)_handler);
+       }
+
+    public boolean isArray() {
+        return _id == Handlers4.ANY_ARRAY_ID || _id == 
Handlers4.ANY_ARRAY_N_ID;
+    }
+    
+    public boolean isPrimitive(){
+        return true;
+    }
+    
+       public boolean isStrongTyped(){
+               return false;
+       }
+    
+    public PreparedComparison prepareComparison(Context context, Object 
source) {
+       return _handler.prepareComparison(context, source);
+    }
+    
+    public TypeHandler4 readCandidateHandler(QueryingReadContext context) {
+        if (isArray()) {
+            return _handler;
+        }
+        return null;
+    }
+    
+    public ObjectID readObjectID(InternalReadContext context){
+        if(_handler instanceof ClassMetadata){
+            return ((ClassMetadata)_handler).readObjectID(context);
+        }
+        if(_handler instanceof ArrayHandler){
+            // TODO: Here we should theoretically read through the array and 
collect candidates.
+            // The respective construct is wild: "Contains query through an 
array in an array."
+            // Ignore for now.
+            return ObjectID.IGNORE;
+        }
+        return ObjectID.NOT_POSSIBLE;
+    }
+    
+    void removeFromIndex(Transaction ta, int id) {
+        // do nothing
+    }
+    
+    public final boolean writeObjectBegin() {
+        return false;
+    }
+    
+    public String toString(){
+        return "Wraps " + _handler.toString() + " in YapClassPrimitive";
+    }
+
+    public void defragment(DefragmentContext context) {
+       correctHandlerVersion(context).defragment(context);
+    }
+    
+    public Object wrapWithTransactionContext(Transaction transaction, Object 
value) {
+        return value;
+    }
+    
+    public Object read(ReadContext context) {
+        return correctHandlerVersion(context).read(context);
+    }
+    
+    public void write(WriteContext context, Object obj) {
+        _handler.write(context, obj);
+    }
+    
+    public TypeHandler4 typeHandler(){
+        return _handler;
+    }
+    
+    public TypeHandler4 delegateTypeHandler(){
+        return _handler;
+    }
+    
+    public TypeHandler4 unversionedTemplate() {
+        return new PrimitiveFieldHandler(null, null, 0, null);
+    }
+    
+    public boolean equals(Object obj) {
+        if(! (obj instanceof PrimitiveFieldHandler)){
+            return false;
+        }
+        PrimitiveFieldHandler other = (PrimitiveFieldHandler) obj;
+        if(_handler == null){
+            return other._handler == null;
+        }
+        return _handler.equals(other._handler);
+    }
+    
+    public int hashCode() {
+        if(_handler == null){
+            return HASHCODE_FOR_NULL;
+        }
+        return _handler.hashCode();
+    }
+    
+    public Object deepClone(Object context) {
+        TypeHandlerCloneContext typeHandlerCloneContext = 
(TypeHandlerCloneContext) context;
+        PrimitiveFieldHandler original = (PrimitiveFieldHandler) 
typeHandlerCloneContext.original;
+        TypeHandler4 delegateTypeHandler = 
typeHandlerCloneContext.correctHandlerVersion(original.delegateTypeHandler());
+        return new PrimitiveFieldHandler(original.container(), 
delegateTypeHandler, original._id, original.classReflector());
+    }
+    
+    public boolean isSecondClass() {
+       return isSecondClass(_handler);
+    }
+    
+    private TypeHandler4 correctHandlerVersion(Context context){
+       return Handlers4.correctHandlerVersion((HandlerVersionContext)context, 
_handler);
+    }
+
+}

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/StoredClassImpl.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/StoredClassImpl.java    
    2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/StoredClassImpl.java    
    2008-10-18 17:53:16 UTC (rev 23000)
@@ -96,4 +96,8 @@
         return _classMetadata.equals(((StoredClassImpl) obj)._classMetadata);
     }

+       public int instanceCount() {
+               return _classMetadata.instanceCount(_transaction);
+       }
+
 }

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/ClientObjectContainer.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/ClientObjectContainer.java
       2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/ClientObjectContainer.java
       2008-10-18 17:53:16 UTC (rev 23000)
@@ -900,4 +900,11 @@
         return response.readInt();
     }

+       public int instanceCount(ClassMetadata clazz, Transaction trans) {
+        MsgD msg = Msg.INSTANCE_COUNT.getWriterForInt(trans, clazz.getID());
+        write(msg);
+        MsgD response = (MsgD) expectedResponse(Msg.INSTANCE_COUNT);
+        return response.readInt();
+       }
+       
 }

Added: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/MInstanceCount.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/MInstanceCount.java
                             (rev 0)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/MInstanceCount.java
     2008-10-18 17:53:16 UTC (rev 23000)
@@ -0,0 +1,37 @@
+/* Copyright (C) 2004 - 2008  db4objects Inc.  http://www.db4o.com
+
+This file is part of the db4o open source object database.
+
+db4o is free software; you can redistribute it and/or modify it under
+the terms of version 2 of the GNU General Public License as published
+by the Free Software Foundation and as clarified by db4objects' GPL 
+interpretation policy, available at
+http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
+Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
+Suite 350, San Mateo, CA 94403, USA.
+
+db4o is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */
+package com.db4o.internal.cs.messages;
+
+import com.db4o.internal.*;
+
+public class MInstanceCount extends MsgD implements ServerSideMessage {
+
+       public boolean processAtServer() {
+               MsgD writer = null;
+               synchronized(streamLock()) {
+                       ClassMetadata clazz = 
file().classMetadataForId(readInt());
+                       writer = 
Msg.INSTANCE_COUNT.getWriterForInt(transaction(), 
clazz.indexEntryCount(transaction()));
+               }
+               write(writer);
+               return true;
+       }
+
+}

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/Msg.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/Msg.java    
    2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/cs/messages/Msg.java    
    2008-10-18 17:53:16 UTC (rev 23000)
@@ -103,6 +103,7 @@
        public static final MWriteUpdateDeleteMembers 
WRITE_UPDATE_DELETE_MEMBERS = new MWriteUpdateDeleteMembers();
        public static final MWriteBatchedMessages WRITE_BATCHED_MESSAGES = new 
MWriteBatchedMessages();
        public static final MsgBlob DELETE_BLOB_FILE = new MDeleteBlobFile();
+       public static final MInstanceCount INSTANCE_COUNT = new 
MInstanceCount();

        Msg() {
                _msgID = _messageIdGenerator++;

Modified: 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/marshall/ClassMarshaller.java
===================================================================
--- 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/marshall/ClassMarshaller.java
       2008-10-18 14:39:52 UTC (rev 22999)
+++ 
trunk/contrib/db4o/src/db4oj/core/src/com/db4o/internal/marshall/ClassMarshaller.java
       2008-10-18 17:53:16 UTC (rev 23000)
@@ -153,17 +153,24 @@

                context.writeInt(indexIDForWriting(classIndexID));

-               // field length
-               int numFields = context.readInt();
+               final int aspectCount = context.readInt();

-               if(numFields > classMetadata.declaredAspectCount()) {
+               if(aspectCount > classMetadata.declaredAspectCount()) {
                        throw new IllegalStateException();
                }
+               
+               final IntByRef processedAspectCount = new IntByRef(0);
+               
                classMetadata.forEachDeclaredAspect(new Procedure4() {
                        public void apply(Object arg) {
+                               if(processedAspectCount.value >= aspectCount){
+                                       return;
+                               }
                                ClassAspect aspect = (ClassAspect) arg;
                                
_family._field.defrag(classMetadata,aspect,sio,context);
+                               processedAspectCount.value++;
                        }
                });
+               
        }
 }


Reply via email to