示例#1
0
        internal virtual void Analyze(Transaction trans)
        {
            _ref = trans.ReferenceForObject(_obj);
            if (_ref != null)
            {
                _classMetadata = _ref.ClassMetadata();
                return;
            }
            IReflectClass claxx = _container.Reflector().ForObject(_obj);

            if (claxx == null)
            {
                NotStorable(_obj, claxx);
                return;
            }
            if (!DetectClassMetadata(trans, claxx))
            {
                return;
            }
            if (IsValueType(_classMetadata))
            {
                NotStorable(_obj, _classMetadata.ClassReflector(), " Value types can only be stored embedded in parent objects."
                            );
            }
        }
示例#2
0
 public override Db4objects.Db4o.Internal.ClassMetadata ClassMetadata()
 {
     Db4objects.Db4o.Internal.ClassMetadata classMetadata = _reference.ClassMetadata();
     if (classMetadata == null)
     {
         throw new InvalidOperationException();
     }
     return(classMetadata);
 }
 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();
 }
示例#4
0
		internal virtual void Analyze(Transaction trans)
		{
			_ref = trans.ReferenceForObject(_obj);
			if (_ref != null)
			{
				_classMetadata = _ref.ClassMetadata();
				return;
			}
			IReflectClass claxx = _container.Reflector().ForObject(_obj);
			if (claxx == null)
			{
				NotStorable(_obj, claxx);
				return;
			}
			if (!DetectClassMetadata(trans, claxx))
			{
				return;
			}
			if (IsValueType(_classMetadata))
			{
				NotStorable(_obj, _classMetadata.ClassReflector());
			}
		}
        public sealed override bool Delete4(Transaction transaction, ObjectReference @ref
                                            , object obj, int cascade, bool userCall)
        {
            int            id     = @ref.GetID();
            StatefulBuffer reader = ReadStatefulBufferById(transaction, id);

            if (reader != null)
            {
                if (obj != null)
                {
                    if ((!ShowInternalClasses()) && Const4.ClassInternal.IsAssignableFrom(obj.GetType
                                                                                              ()))
                    {
                        return(false);
                    }
                }
                reader.SetCascadeDeletes(cascade);
                transaction.IdSystem().NotifySlotDeleted(id, SlotChangeFactory.UserObjects);
                ClassMetadata classMetadata = @ref.ClassMetadata();
                classMetadata.Delete(reader, obj);
                return(true);
            }
            return(false);
        }
示例#6
0
        internal virtual void Analyze(Transaction trans)
        {
            _ref = trans.ReferenceForObject(_obj);
            if (_ref != null)
            {
                _classMetadata = _ref.ClassMetadata();
                return;
            }
            var claxx = _container.Reflector().ForObject(_obj);

            if (claxx == null)
            {
                NotStorable(_obj, claxx);
                return;
            }
            if (!DetectClassMetadata(trans, claxx))
            {
                return;
            }
            if (IsValueType(_classMetadata))
            {
                NotStorable(_obj, _classMetadata.ClassReflector());
            }
        }
示例#7
0
		internal void Delete3(Transaction trans, ObjectReference @ref, object obj, int cascade
			, bool userCall)
		{
			// The passed reference can be null, when calling from Transaction.
			if (@ref == null || [email protected]())
			{
				return;
			}
			// This check is performed twice, here and in delete2, intentionally.
			if (BreakDeleteForEnum(@ref, userCall))
			{
				@ref.EndProcessing();
				return;
			}
			if ([email protected]())
			{
				@ref.EndProcessing();
				return;
			}
			ClassMetadata yc = @ref.ClassMetadata();
			// We have to end processing temporarily here, otherwise the can delete callback
			// can't do anything at all with this object.
			@ref.EndProcessing();
			ActivateForDeletionCallback(trans, yc, @ref, obj);
			if (!ObjectCanDelete(trans, yc, @ref))
			{
				return;
			}
			@ref.BeginProcessing();
			if (DTrace.enabled)
			{
				DTrace.Delete.Log(@ref.GetID());
			}
			if (Delete4(trans, @ref, obj, cascade, userCall))
			{
				ObjectOnDelete(trans, yc, @ref);
				if (ConfigImpl.MessageLevel() > Const4.State)
				{
					Message(string.Empty + @ref.GetID() + " delete " + @ref.ClassMetadata().GetName()
						);
				}
			}
			@ref.EndProcessing();
		}
示例#8
0
		private bool BreakDeleteForEnum(ObjectReference reference, bool userCall)
		{
			return false;
			if (userCall)
			{
				return false;
			}
			if (reference == null)
			{
				return false;
			}
			return Platform4.IsEnum(Reflector(), reference.ClassMetadata().ClassReflector());
		}
示例#9
0
		public int Store2(Transaction trans, object obj, IUpdateDepth updateDepth, bool checkJustSet
			)
		{
			if (obj == null || (obj is ITransientClass))
			{
				return 0;
			}
			ObjectAnalyzer analyzer = new ObjectAnalyzer(this, obj);
			analyzer.Analyze(trans);
			if (analyzer.NotStorable())
			{
				return 0;
			}
			ObjectReference @ref = analyzer.ObjectReference();
			if (@ref == null)
			{
				ClassMetadata classMetadata = analyzer.ClassMetadata();
				if (!ObjectCanNew(trans, classMetadata, obj))
				{
					return 0;
				}
				@ref = new ObjectReference();
				@ref.Store(trans, classMetadata, obj);
				trans.AddNewReference(@ref);
				if (obj is IDb4oTypeImpl)
				{
					((IDb4oTypeImpl)obj).SetTrans(trans);
				}
				if (ConfigImpl.MessageLevel() > Const4.State)
				{
					Message(string.Empty + @ref.GetID() + " new " + @ref.ClassMetadata().GetName());
				}
				FlagAsHandled(@ref);
				StillToSet(trans, @ref, updateDepth);
			}
			else
			{
				if (@ref.IsFlaggedAsHandled(_topLevelCallId))
				{
					AssertNotInCallback();
				}
				if (CanUpdate())
				{
					if (checkJustSet)
					{
						if (([email protected]()) && HandledInCurrentTopLevelCall(@ref))
						{
							return @ref.GetID();
						}
					}
					if (updateDepth.SufficientDepth())
					{
						FlagAsHandled(@ref);
						@ref.WriteUpdate(trans, updateDepth);
					}
				}
			}
			ProcessPendingClassUpdates();
			return @ref.GetID();
		}
示例#10
0
		public override bool CanSkip(ObjectReference @ref)
		{
			ClassMetadata clazz = @ref.ClassMetadata();
			return clazz.Reflector().ForClass(typeof(IActivatable)).IsAssignableFrom(clazz.ClassReflector
				()) && !_query.IsModified(@ref.GetObject());
		}
示例#11
0
 private bool IsStruct(ObjectReference @ref)
 {
     return @ref.ClassMetadata().IsStruct();
 }
示例#12
0
 private bool IsStruct(ObjectReference @ref)
 {
     return(@ref.ClassMetadata().IsStruct());
 }
示例#13
0
		public sealed override bool Delete4(Transaction transaction, ObjectReference @ref
			, object obj, int cascade, bool userCall)
		{
			int id = @ref.GetID();
			StatefulBuffer reader = ReadStatefulBufferById(transaction, id);
			if (reader != null)
			{
				if (obj != null)
				{
					if ((!ShowInternalClasses()) && Const4.ClassInternal.IsAssignableFrom(obj.GetType
						()))
					{
						return false;
					}
				}
				reader.SetCascadeDeletes(cascade);
				transaction.IdSystem().NotifySlotDeleted(id, SlotChangeFactory.UserObjects);
				ClassMetadata classMetadata = @ref.ClassMetadata();
				classMetadata.Delete(reader, obj);
				return true;
			}
			return false;
		}