예제 #1
0
		public static int SlotHandlerVersion(IExtObjectContainer objectContainer, object 
			obj)
		{
			int id = (int)objectContainer.GetID(obj);
			IObjectInfo objectInfo = objectContainer.GetObjectInfo(obj);
			ObjectContainerBase container = (ObjectContainerBase)objectContainer;
			Transaction trans = container.Transaction;
			ByteArrayBuffer buffer = container.ReadBufferById(trans, id);
			UnmarshallingContext context = new UnmarshallingContext(trans, (ObjectReference)objectInfo
				, Const4.Transient, false);
			context.Buffer(buffer);
			context.PersistentObject(obj);
			context.ActivationDepth(new LegacyActivationDepth(0));
			context.Read();
			return context.HandlerVersion();
		}
예제 #2
0
 private object WriteAndRead(object obj)
 {
     var imaginativeID = 500;
     var @ref = new ObjectReference(ClassMetadataForObject(obj), imaginativeID
         );
     @ref.SetObject(obj);
     var marshallingContext = new MarshallingContext(Trans(), @ref, Container
         ().UpdateDepthProvider().ForDepth(int.MaxValue), true);
     Handlers4.Write(@ref.ClassMetadata().TypeHandler(), marshallingContext, obj);
     var pointer = marshallingContext.AllocateSlot();
     var buffer = marshallingContext.ToWriteBuffer(pointer);
     buffer.Seek(0);
     //        String str = new String(buffer._buffer);
     //        System.out.println(str);
     var unmarshallingContext = new UnmarshallingContext(Trans(), @ref
         , Const4.AddToIdTree, false);
     unmarshallingContext.Buffer(buffer);
     unmarshallingContext.ActivationDepth(new LegacyActivationDepth(5));
     return unmarshallingContext.Read();
 }
예제 #3
0
		public override void Activate(UnmarshallingContext context)
		{
			object obj = Read(context);
			// Activation of members is necessary on purpose here.
			// Classes like Hashtable need fully activated members
			// to be able to calculate hashCode()
			if (obj != null)
			{
				context.Container().Activate(context.Transaction(), obj, context.ActivationDepth(
					));
			}
			SetOn(context.Transaction(), context.PersistentObject(), obj);
		}
예제 #4
0
		private UnmarshallingContext DescendMarshallingContext(Transaction trans, ObjectReference
			 @ref)
		{
			UnmarshallingContext context = new UnmarshallingContext(trans, @ref, Const4.AddToIdTree
				, false);
			context.ActivationDepth(ActivationDepthProvider().ActivationDepth(1, ActivationMode
				.Activate));
			return context;
		}
예제 #5
0
 private object Activate(UnmarshallingContext context)
 {
     var obj = context.PersistentObject();
     var objectReference = context.ObjectReference();
     if (!ObjectCanActivate(context.Transaction(), obj))
     {
         objectReference.SetStateDeactivated();
         return obj;
     }
     objectReference.SetStateClean();
     if (context.ActivationDepth().RequiresActivation())
     {
         InstantiateFields(context);
     }
     ObjectOnActivate(context.Transaction(), objectReference);
     return obj;
 }
예제 #6
0
 public virtual object InstantiateTransient(UnmarshallingContext context)
 {
     // overridden in YapClassPrimitive
     // never called for primitive YapAny
     var obj = InstantiateObject(context);
     if (obj == null)
     {
         return null;
     }
     context.Container().Peeked(context.ObjectId(), obj);
     if (context.ActivationDepth().RequiresActivation())
     {
         InstantiateFields(context);
     }
     return obj;
 }
예제 #7
0
 public virtual object Instantiate(UnmarshallingContext context)
 {
     // overridden in PrimitiveTypeMetadata
     // never called for primitive YapAny
     // FIXME: [TA] no longer necessary?
     //        context.adjustInstantiationDepth();
     var obj = context.PersistentObject();
     var instantiating = (obj == null);
     if (instantiating)
     {
         obj = InstantiateObject(context);
         if (obj == null)
         {
             return null;
         }
         ShareTransaction(obj, context.Transaction());
         ShareObjectReference(obj, context.ObjectReference());
         OnInstantiate(context, obj);
         if (context.ActivationDepth().Mode().IsPrefetch())
         {
             context.ObjectReference().SetStateDeactivated();
             return obj;
         }
         if (!context.ActivationDepth().RequiresActivation())
         {
             context.ObjectReference().SetStateDeactivated();
             return obj;
         }
         return Activate(context);
     }
     if (ActivatingActiveObject(context.ActivationDepth().Mode(), context.ObjectReference
         ()))
     {
         var child = context.ActivationDepth().Descend(this);
         if (child.RequiresActivation())
         {
             CascadeActivation(new ActivationContext4(context.Transaction(), obj, child));
         }
         return obj;
     }
     return Activate(context);
 }
예제 #8
0
		public virtual object ReadPrefetch(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer
			 buffer, int addToIDTree)
		{
			UnmarshallingContext context = new UnmarshallingContext(trans, buffer, this, addToIDTree
				, false);
			context.ActivationDepth(new FixedActivationDepth(1, ActivationMode.Prefetch));
			return context.Read();
		}
예제 #9
0
		public object Read(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer buffer
			, object obj, IActivationDepth instantiationDepth, int addToIDTree, bool checkIDTree
			)
		{
			UnmarshallingContext context = new UnmarshallingContext(trans, buffer, this, addToIDTree
				, checkIDTree);
			context.PersistentObject(obj);
			context.ActivationDepth(instantiationDepth);
			return context.Read();
		}
예제 #10
0
		public object Get(Transaction trans, object onObject)
		{
			if (_containingClass == null)
			{
				return null;
			}
			ObjectContainerBase container = Container();
			if (container == null)
			{
				return null;
			}
			lock (container.Lock())
			{
				// FIXME: The following is not really transactional.
				//        This will work OK for normal C/S and for
				//        single local mode but the transaction will
				//        be wrong for MTOC.
				if (trans == null)
				{
					trans = container.Transaction;
				}
				container.CheckClosed();
				ObjectReference @ref = trans.ReferenceForObject(onObject);
				if (@ref == null)
				{
					return null;
				}
				int id = @ref.GetID();
				if (id <= 0)
				{
					return null;
				}
				UnmarshallingContext context = new UnmarshallingContext(trans, @ref, Const4.AddToIdTree
					, false);
				context.ActivationDepth(new LegacyActivationDepth(1));
				return context.ReadFieldValue(this);
			}
		}