Пример #1
0
        public ServerHistoryProvider(
            CharacterName characterName, IPersistent<PersistentModel.ServerHistory> persistentData,
            IWurmLogsMonitorInternal logsMonitor,
            IWurmLogsHistory logsSearcher,
            IWurmServerList wurmServerList,
            ILogger logger,
            IWurmCharacterLogFiles wurmCharacterLogFiles)
        {
            if (characterName == null) throw new ArgumentNullException("characterName");
            if (persistentData == null) throw new ArgumentNullException("persistentData");
            if (logsMonitor == null) throw new ArgumentNullException("logsMonitor");
            if (logsSearcher == null) throw new ArgumentNullException("logsSearcher");
            if (wurmServerList == null) throw new ArgumentNullException("wurmServerList");
            if (logger == null) throw new ArgumentNullException("logger");
            if (wurmCharacterLogFiles == null) throw new ArgumentNullException("wurmCharacterLogFiles");
            this.characterName = characterName;
            this.sortedServerHistory = new SortedServerHistory(persistentData);
            this.persistentData = persistentData;
            this.logsMonitor = logsMonitor;
            this.logsSearcher = logsSearcher;
            this.wurmServerList = wurmServerList;
            this.logger = logger;
            this.wurmCharacterLogFiles = wurmCharacterLogFiles;

            logsMonitor.SubscribeInternal(characterName, LogType.Event, HandleEventLogEntries);
        }
Пример #2
0
        public V Set(Key key, V obj)
        {
            IPersistent s = index.Get(key);

            if (s == null)
            {
                Relation <V, V> r = Database.CreateRelation <V, V>(null);
                r.Add(obj);
                index.Put(key, r);
                nElems += 1;
                Modify();
                return(null);
            }
            else if (s is Relation <V, V> )
            {
                Relation <V, V> r = (Relation <V, V>)s;
                if (r.Count == 1)
                {
                    V prev = r[0];
                    r[0] = obj;
                    return(prev);
                }
            }
            throw new DatabaseException(DatabaseException.ErrorCode.KEY_NOT_UNIQUE);
        }
Пример #3
0
        public void Invalidate()
        {
            while (true)
            {
                lock (this)
                {
                    for (int i = 0; i < table.Length; i++)
                    {
                        for (Entry e = table[i]; e != null; e = e.next)
                        {
                            IPersistent obj = (IPersistent)e.oref.Target;
                            if (obj != null)
                            {
                                if (obj.IsModified())
                                {
                                    e.dirty = 0;
                                    unpinObject(e);
                                    obj.Invalidate();
                                }
                            }
                            else if (e.dirty != 0)
                            {
                                goto waitFinalization;
                            }
                        }
                        table[i] = null;
                    }
                    count = 0;
                    return;
                }
waitFinalization:
                GC.WaitForPendingFinalizers();
            }
        }
 public void AddElement(string name, IPersistent child)
 {
     if (child != null)
     {
         element.AppendChild(child.ToXml(name, doc));
     }
 }
Пример #5
0
 /// <summary>
 /// Sets the value of the field defined by info on the object o
 /// to the value value. If the fields aren't of the same type
 /// it will be silently ignored.
 /// </summary>
 private void TrySetValue(IPersistent o, FieldInfo info, Object value)
 {
     if (value.GetType() == info.FieldType)
     {
         info.SetValue(o, value);
     }
 }
Пример #6
0
        IPersistent loadItem(int i)
        {
            IPersistent mbr = item[i];

            mbr.Load();
            return(mbr);
        }
Пример #7
0
 /// <summary> Project specified selection</summary>
 /// <param name="selection">array with selected object
 /// </param>
 public virtual void Project(IPersistent[] selection)
 {
     for (int i = 0; i < selection.Length; i++)
     {
         Map(selection[i]);
     }
 }
Пример #8
0
        public virtual int IndexOf(IPersistent obj)
        {
            int oid;

            if (obj != null && (oid = ((IPersistent)obj).Oid) != 0)
            {
                for (int i = used; --i >= 0;)
                {
                    IPersistent elem = arr[i];
                    if (elem != null && elem.Oid == oid)
                    {
                        return(i);
                    }
                }
            }
            else
            {
                for (int i = used; --i >= 0;)
                {
                    if (arr[i] == obj)
                    {
                        return(i);
                    }
                }
            }
            return(-1);
        }
Пример #9
0
 /// <summary>
 ///     Sets the value of the property defined by info on the object o
 ///     to the value value. If the fields aren't of the same type
 ///     it will be silently ignored.
 /// </summary>
 static void TrySetValue(IPersistent o, PropertyInfo info, Object value)
 {
     if (value.GetType() == info.PropertyType)
     {
         info.SetValue(o, value, null);
     }
 }
Пример #10
0
        /// <summary>
        ///     Initializes fields and properties of the object o, with
        ///     data of the specified category and of the specified id.
        /// </summary>
        /// <param name="o">Object to get its fields initialized.</param>
        /// <param name="type">
        ///     The category this object belongs, all objects
        ///     of the same category will get the same values.
        /// </param>
        /// <param name="id">
        ///     The id of the object which identifies it inside
        ///     its category, it
        /// </param>
        public void InitializeObject(IPersistent o)
        {
            var t   = o.GetType();
            var ids = o.Ids.Split(CommaDelimiter, StringSplitOptions.RemoveEmptyEntries);

            // Hey, lock here, there might be other threads
            // trying to initialize their values also.
            lock (_data) {
                foreach (var id in ids)
                {
                    if (!_data.ContainsKey(id)) // Do we have something for this id?
                    {
                        continue;
                    }

                    // Iterate over what we have for this id
                    foreach (var pair in _data[id])
                    {
                        // Does o has a member we can write to?
                        var members = t.GetMember(pair.Key);
                        foreach (var info in members)
                        {
                            if (info is FieldInfo)
                            {
                                TrySetValue(o, (FieldInfo)info, _data[id][info.Name]);
                            }
                            else if (info is PropertyInfo)
                            {
                                TrySetValue(o, (PropertyInfo)info, _data[id][info.Name]);
                            }
                        }
                    }
                }
            }
        }
Пример #11
0
        public virtual void Append(IPersistent obj)
        {
            lock (this)
            {
                Key key;
                try
                {
                    switch (type)
                    {
                        case ClassDescriptor.tpInt:
                            key = new Key((int) autoincCount);
                            fld.SetValue(obj, (int) autoincCount);
                            break;

                        case ClassDescriptor.tpLong:
                            key = new Key(autoincCount);
                            fld.SetValue(obj, autoincCount);
                            break;

                        default:
                            throw new StorageError(StorageError.UNSUPPORTED_INDEX_TYPE, fld.FieldType);
                    }
                }
                catch (System.Exception x)
                {
                    throw new StorageError(StorageError.ACCESS_VIOLATION, x);
                }
                autoincCount += 1;
                obj.Modify();
                base.Insert(key, obj, false);
            }
        }
Пример #12
0
        public void Flush()
        {
            while (true)
            {
                lock (this)
                {
                    for (int i = 0; i < table.Length; i++)
                    {
                        for (Entry e = table[i]; e != null; e = e.next)
                        {
                            IPersistent obj = (IPersistent)e.oref.Target;
                            if (obj != null)
                            {
                                if (obj.IsModified())
                                {
                                    obj.Store();
                                }
                            }
                            else if (e.dirty != 0)
                            {
                                goto waitFinalization;
                            }
                        }
                    }
                    return;
                }
waitFinalization:
                GC.WaitForPendingFinalizers();
            }
        }
Пример #13
0
        public virtual void Put(IPersistent obj, int mask)
        {
            StorageImpl db = (StorageImpl) Storage;
            if (db == null)
            {
                throw new StorageError(StorageError.DELETED_OBJECT);
            }

            if (!obj.IsPersistent())
            {
                db.MakePersistent(obj);
            }

            Key ins = new Key(mask, obj.Oid);
            if (root == 0)
            {
                root = BitIndexPage.Allocate(db, 0, ins);
                height = 1;
            }
            else
            {
                int result = BitIndexPage.Insert(db, root, ins, height);
                if (result == op_overflow)
                {
                    root = BitIndexPage.Allocate(db, root, ins);
                    height += 1;
                }
            }

            updateCounter += 1;
            nElems += 1;
            Modify();
        }
Пример #14
0
        public void Put(int oid, IPersistent obj)
        {
            lock (this)
            {
                Entry[] tab   = table;
                int     index = (oid & 0x7FFFFFFF) % tab.Length;
                for (Entry e = tab[index]; e != null; e = e.next)
                {
                    if (e.oid == oid)
                    {
                        e.oref.Target = obj;
                        pinObject(e, obj);
                        return;
                    }
                }
                if (count >= threshold)
                {
                    // Rehash the table if the threshold is exceeded
                    rehash();
                    tab   = table;
                    index = (oid & 0x7FFFFFFF) % tab.Length;
                }

                // Creates the new entry.
                tab[index] = new Entry(oid, new WeakReference(obj), tab[index]);
                pinObject(tab[index], obj);
                count++;
            }
        }
Пример #15
0
        public void Put(int oid, IPersistent obj)
        {
            lock (this)
            {
                Entry[] tab = table;
                int index = (oid & 0x7FFFFFFF) % tab.Length;
                for (Entry e = tab[index]; e != null; e = e.next)
                {
                    if (e.oid == oid)
                    {
                        e.oref = obj;
                        return;
                    }
                }
                if (count >= threshold)
                {
                    // Rehash the table if the threshold is exceeded
                    rehash();
                    tab = table;
                    index = (oid & 0x7FFFFFFF) % tab.Length;
                }

                // Creates the new entry.
                tab[index] = new Entry(oid, obj, tab[index]);
                count++;
            }
        }
Пример #16
0
 public virtual void Set(int i, IPersistent obj)
 {
     if (i < 0 || i >= used)
     {
         throw new IndexOutOfRangeException();
     }
     arr[i] = obj;
 }
Пример #17
0
        public virtual int Get(IPersistent obj)
        {
            StorageImpl db = (StorageImpl) Storage;
            if (root == 0)
                throw new StorageError(StorageError.KEY_NOT_FOUND);

            return BitIndexPage.Find(db, root, obj.Oid, height);
        }
Пример #18
0
 protected PersistentEntityBase(IPersistent <TEntity> persistent)
 {
     if (persistent == null)
     {
         throw new ArgumentNullException(nameof(persistent));
     }
     this.persistent = persistent;
 }
Пример #19
0
		protected virtual void InitParent( IPersistent parent )
		{
			Check.VerifyNotNull( parent, Error.NullParameter, "parent" );
			Check.Verify( parent.IsPersisted || ! parentMap.IsAutoGeneratedPrimaryKey, Error.DeveloperError,
			              "The parent object must have been persisted before you can use the list." );
			this.parent = parent;
			parentMap = ObjectFactory.GetMap( broker, parent );
		}
Пример #20
0
 public PersistentDataWithMigrationNoFilter(IPersistent <Dto> persistent)
     : base(persistent)
 {
     RunMigration(0, 1, dto =>
     {
         dto.Data = TestValues.ValueAfterMigration;
     });
 }
Пример #21
0
        public SortedServerHistory(IPersistent<PersistentModel.ServerHistory> persistentData)
        {
            if (persistentData == null)
                throw new ArgumentNullException("persistentData");
            this.persistentData = persistentData;

            Rebuild(persistentData.Entity.ServerStamps);
        }
Пример #22
0
        public static void Initialize(this IPersistent persistent, Guid?currentUserId = null)
        {
            persistent.Oid          = Guid.NewGuid();
            persistent.UpdateUserId = currentUserId;
            persistent.UpdateTime   = DateTime.UtcNow;

            persistent.AfterConstruction();
        }
Пример #23
0
 protected virtual void InitParent(IPersistent parent)
 {
     Check.VerifyNotNull(parent, Error.NullParameter, "parent");
     Check.Verify(parent.IsPersisted || !parentMap.IsAutoGeneratedPrimaryKey, Error.DeveloperError,
                  "The parent object must have been persisted before you can use the list.");
     this.parent = parent;
     parentMap   = ObjectFactory.GetMap(broker, parent);
 }
Пример #24
0
 public bool Add(IPersistent o)
 {
     if (!o.IsPersistent())
     {
         ((StorageImpl)Storage).storeObject(o);
     }
     return(base.Put(new Key(o), o));
 }
 private void AddItem(IPersistent obj, DataGrid dataGrid)
 {
     Database.AddRecord(obj); // Adding new record to Database
     ((IList)dataGrid.ItemsSource).Insert(0, obj);
     dataGrid.SelectedItem = obj;
     ShowDetailPanel(dataGrid);
     ((DetailPanel)swDetail.Content).FocusFirstTextBox();
 }
Пример #26
0
 internal void linkAfter(Entry head, IPersistent obj)
 {
     mru      = head.mru;
     mru.lru  = this;
     head.mru = this;
     lru      = head;
     pin      = obj;
 }
 private void AddItem(IPersistent obj, DataGrid dataGrid)
 {
     Database.AddRecord(obj); // Adding new record to Database
     ((IList)dataGrid.ItemsSource).Insert(0, obj);
     dataGrid.SelectedItem = obj;
     ShowDetailPanel(dataGrid);
     ((DetailPanel)swDetail.Content).FocusFirstTextBox();
 }
Пример #28
0
 public LogHistorySaved(IPersistent <ServersData> persistenceManager)
 {
     if (persistenceManager == null)
     {
         throw new ArgumentNullException(nameof(persistenceManager));
     }
     this.persistenceManager = persistenceManager;
 }
Пример #29
0
 public virtual IPersistent[] ToArray()
 {
     IPersistent[] a = new IPersistent[used];
     for (int i = used; --i >= 0;)
     {
         a[i] = loadElem(i);
     }
     return(a);
 }
Пример #30
0
 internal void reserveSpace(int len)
 {
     if (used + len > arr.Length)
     {
         IPersistent[] newArr = new IPersistent[used + len > arr.Length * 2?used + len:arr.Length * 2];
         Array.Copy(arr, 0, newArr, 0, used);
         arr = newArr;
     }
 }
Пример #31
0
        public static IPersistent CreateObject(XmlDocument doc, XmlElement element)
        {
            String      typeName     = element.Attributes["type"].Value;
            String      assemblyName = element.Attributes["assembly"].Value;
            IPersistent persistent   = (IPersistent)AssemblyCache.CreateObject(typeName, assemblyName);

            persistent.FromXml(element);
            return(persistent);
        }
Пример #32
0
 private Key extractKey(IPersistent obj)
 {
     object[] keys = new object[mbr.Length];
     for (int i = 0; i < keys.Length; i++)
     {
         keys[i] = mbr[i] is FieldInfo ? ((FieldInfo)mbr[i]).GetValue(obj) : ((PropertyInfo)mbr[i]).GetValue(obj, null);
     }
     return(new Key(new CompoundKey(keys)));
 }
Пример #33
0
 public IPersistent[] ToArray()
 {
     IPersistent[] arr = new IPersistent[nMembers];
     if (root != null)
     {
         root.toArray(arr, 0);
     }
     return(arr);
 }
            void IDataMapper.Insert(IPersistent entity)
            {
                CustomSetting e = (CustomSetting)entity;

                bool ok = false;

                using (SqlConnection connection = new SqlConnection(ConnectionString))
                {
                    connection.Open();

                    SqlCommand command = connection.CreateCommand();
                    command.CommandType = CommandType.Text;
                    command.CommandText = InsertCommandText;

                    SqlParameter parameter = null;

                    parameter           = new SqlParameter("key", SqlDbType.UniqueIdentifier);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value     = e.identity;
                    command.Parameters.Add(parameter);

                    parameter           = new SqlParameter("owner_", SqlDbType.Int);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value     = (e.owner == null) ? 0 : e.owner.TypeCode;
                    command.Parameters.Add(parameter);

                    parameter           = new SqlParameter("owner", SqlDbType.UniqueIdentifier);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value     = (e.owner == null) ? Guid.Empty : e.owner.Identity;
                    command.Parameters.Add(parameter);

                    parameter           = new SqlParameter("name", SqlDbType.NVarChar);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value     = (e.name == null) ? string.Empty : e.name;
                    command.Parameters.Add(parameter);

                    parameter           = new SqlParameter("value", SqlDbType.NVarChar);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value     = (e._value == null) ? string.Empty : e._value;
                    command.Parameters.Add(parameter);

                    SqlDataReader reader = command.ExecuteReader();

                    if (reader.Read())
                    {
                        e.version = (byte[])reader[0]; ok = true;
                    }

                    reader.Close(); connection.Close();
                }

                if (!ok)
                {
                    throw new ApplicationException("Error executing insert command.");
                }
            }
Пример #35
0
        private T loadElem(int i)
        {
            IPersistent elem = arr[i];

            if (elem != null && elem.IsRaw())
            {
                elem = ((DatabaseImpl)elem.Database).lookupObject(elem.Oid, null);
            }
            return((T)elem);
        }
Пример #36
0
 internal RtreePage(IPersistent obj, Rectangle r)
 {
     b    = new Branch[card];
     n    = 1;
     b[0] = new Branch(r, obj);
     for (int i = 1; i < card; i++)
     {
         b[i] = new Branch();
     }
 }
        /// <summary>
        /// Each subscriber can call this method to include any data it wishes to persist.  This data is intended to be user state metadata. It is not intended to be used for
        /// wholesale application database data.
        /// </summary>
        /// <param name="model">
        /// The model to persist.  The type of this model will be used as a key and when data is loaded back from persistent storage this key (type) will be used
        /// to retrieve it.  No other component should use this type, or collisions will occur.
        /// </param>
        /// <exception cref="System.Data.DuplicateNameException">Attempt to save application state with a model that has already been saved.</exception>
        public void PersistThisModel(IPersistent model)
        {
            if (this.modelsToPersist.Any(m => m.GetType() == model.GetType()))
            {
                throw new DuplicateNameException(
                    "Attempt to save application state with a model that has already been saved.");
            }

            this.modelsToPersist.Add(model);
        }
Пример #38
0
		protected virtual void InitType( Type containedType, IPersistent parent, Type viaType )
		{
			containedMap = ObjectFactory.GetMap( broker, containedType );
			Check.Verify( containedType.GetInterface( "IPersistent", false ) != null,
			              Error.UnsupportedType, containedType );
			listType = parent == null
			           	? GentleListType.StandAlone
			           	:
			           		(viaType == null ? GentleListType.OneToMany : GentleListType.ManyToMany);
		}
Пример #39
0
 protected virtual void InitType(Type containedType, IPersistent parent, Type viaType)
 {
     containedMap = ObjectFactory.GetMap(broker, containedType);
     Check.Verify(containedType.GetInterface("IPersistent", false) != null,
                  Error.UnsupportedType, containedType);
     listType = parent == null
                                 ? GentleListType.StandAlone
                                 :
                (viaType == null ? GentleListType.OneToMany : GentleListType.ManyToMany);
 }
Пример #40
0
        public SortedServerHistory(IPersistent <PersistentModel.ServerHistory> persistentData)
        {
            if (persistentData == null)
            {
                throw new ArgumentNullException(nameof(persistentData));
            }
            this.persistentData = persistentData;

            Rebuild(persistentData.Entity.ServerStamps);
        }
Пример #41
0
            internal IPersistent remove(ulong key, int keyLength)
            {
                if (keyLength >= this.keyLength)
                {
                    if (key == this.key && keyLength == this.keyLength)
                    {
                        IPersistent obj = this.obj;
                        this.obj = null;
                        return(obj);
                    }
                    else
                    {
                        int   keyLengthCommon = getCommonPart(key, keyLength, this.key, this.keyLength);
                        int   keyLengthDiff   = keyLength - keyLengthCommon;
                        ulong keyCommon       = key >> keyLengthDiff;
                        ulong keyDiff         = key - (keyCommon << keyLengthDiff);

                        if (firstDigit(keyDiff, keyLengthDiff) == 1)
                        {
                            if (childOne != null)
                            {
                                IPersistent obj = childOne.findBestMatch(keyDiff, keyLengthDiff);
                                if (obj != null)
                                {
                                    if (childOne.isNotUsed())
                                    {
                                        Modify();
                                        childOne.Deallocate();
                                        childOne = null;
                                    }
                                    return(obj);
                                }
                            }
                        }
                        else
                        {
                            if (childZero != null)
                            {
                                IPersistent obj = childZero.findBestMatch(keyDiff, keyLengthDiff);
                                if (obj != null)
                                {
                                    if (childZero.isNotUsed())
                                    {
                                        Modify();
                                        childZero.Deallocate();
                                        childZero = null;
                                    }
                                    return(obj);
                                }
                            }
                        }
                    }
                }
                return(null);
            }
 public CharacterMonthlyLogHeuristics(IPersistent<WurmCharacterLogsEntity> persistentData,
     MonthlyHeuristicsExtractorFactory monthlyHeuristicsExtractorFactory,
     IWurmCharacterLogFiles wurmCharacterLogFiles)
 {
     if (persistentData == null) throw new ArgumentNullException("persistentData");
     if (monthlyHeuristicsExtractorFactory == null) throw new ArgumentNullException("monthlyHeuristicsExtractorFactory");
     if (wurmCharacterLogFiles == null) throw new ArgumentNullException("wurmCharacterLogFiles");
     this.persistentData = persistentData;
     this.monthlyHeuristicsExtractorFactory = monthlyHeuristicsExtractorFactory;
     this.wurmCharacterLogFiles = wurmCharacterLogFiles;
 }
Пример #43
0
 internal RtreeR2Page(IDatabase db, IPersistent obj, RectangleR2 r)
 {
     branch = db.CreateLink<IPersistent>(card);
     branch.Length = card;
     b = new RectangleR2[card];
     setBranch(0, new RectangleR2(r), obj);
     n = 1;
     for (int i = 1; i < card; i++)
     {
         b[i] = new RectangleR2();
     }
 }
Пример #44
0
 internal RtreePage AddBranch(Storage storage, Rectangle r, IPersistent obj)
 {
     if (n < card)
     {
         SetBranch(n++, r, obj);
         return null;
     }
     else
     {
         return SplitPage(storage, r, obj);
     }
 }
Пример #45
0
 internal RtreePage(Storage storage, IPersistent obj, Rectangle r)
 {
     branch = storage.CreateLink(card);
     branch.Size = card;
     b = new Rectangle[card];
     SetBranch(0, new Rectangle(r), obj);
     n = 1;
     for (int i = 1; i < card; i++)
     {
         b[i] = new Rectangle();
     }
 }
Пример #46
0
		/// <summary>
		/// Create a new list for storing the specified type of objects.
		/// </summary>
		public GentleRelation( PersistenceBroker broker, Type containedType, IPersistent parent,
		                       params Type[] relatedTypes ) : base( broker )
		{
			Check.VerifyNotNull( relatedTypes, Error.NullParameter, "relatedTypes" );
			/*Check.Verify( parent == null && relatedTypes.Length == 2 ||
				parent != null && relatedTypes.Length == 1, Error.NotImplemented,
			              "The GentleRelation class is currently only able to manage two-way relations." ); */
			this.relatedTypes = relatedTypes;
			this.parent = parent;
			containedMap = ObjectFactory.GetMap( broker, containedType );
			// note: "this." required on broker param or original null param might get passed
			relations = new GentleList( this.broker, containedType, parent );
			// verify that the linked types are supported by Gentle
			foreach( Type relatedType in relatedTypes )
			{
				Check.Verify( relatedType.IsSubclassOf( typeof(Persistent) ) || relatedType.GetInterface( "IPersistent" ) != null,
				              Error.UnsupportedType, relatedType );
			}
		}
Пример #47
0
 public virtual bool Contains(IPersistent obj)
 {
     Key key = ExtractKey(obj);
     if (unique)
     {
         return base.Get(key) != null;
     }
     else
     {
         IPersistent[] mbrs = Get(key, key);
         for (int i = 0; i < mbrs.Length; i++)
         {
             if (mbrs[i] == obj)
             {
                 return true;
             }
         }
         return false;
     }
 }
Пример #48
0
 /// <summary> Add new member to collection</summary>
 /// <param name="obj">new member
 /// </param>
 /// <returns> <code>true</code> if object is successfully added in the index,
 /// <code>false</code> if collection was declared as unique and there is already member with such value
 /// of the key in the collection.
 /// </returns>
 public virtual bool Add(IPersistent obj)
 {
     TtreePage newRoot;
     if (root == null)
     {
         newRoot = new TtreePage(obj);
     }
     else
     {
         TtreePage.PageReference ref_Renamed = new TtreePage.PageReference(root);
         if (root.Insert(comparator, obj, unique, ref_Renamed) == TtreePage.NOT_UNIQUE)
         {
             return false;
         }
         newRoot = ref_Renamed.pg;
     }
     root = newRoot;
     nMembers += 1;
     Modify();
     return true;
 }
Пример #49
0
        public virtual void Remove(IPersistent obj)
        {
            StorageImpl db = (StorageImpl) Storage;
            if (db == null)
            {
                throw new StorageError(StorageError.DELETED_OBJECT);
            }
            if (root == 0)
            {
                throw new StorageError(StorageError.KEY_NOT_FOUND);
            }
            int result = BitIndexPage.Remove(db, root, obj.Oid, height);
            if (result == op_not_found)
            {
                throw new StorageError(StorageError.KEY_NOT_FOUND);
            }
            nElems -= 1;
            if (result == op_underflow)
            {
                Page pg = db.GetPage(root);
                if (BitIndexPage.GetItemsCount(pg) == 0)
                {
                    int newRoot = 0;
                    if (height != 1)
                    {
                        newRoot = BitIndexPage.GetItem(pg, BitIndexPage.maxItems - 1);
                    }
                    db.FreePage(root);
                    root = newRoot;
                    height -= 1;
                }
                db.pool.Unfix(pg);
            }

            updateCounter += 1;
            Modify();
        }
Пример #50
0
 internal Entry(int oid, IPersistent oref, Entry chain)
 {
     next = chain;
     this.oid = oid;
     this.oref = oref;
 }
Пример #51
0
 internal virtual void Unpin()
 {
     Unlink();
     lru = mru = null;
     pin = null;
 }
Пример #52
0
 internal virtual void LinkAfter(Entry head, IPersistent obj)
 {
     mru = head.mru;
     mru.lru = this;
     head.mru = this;
     lru = head;
     pin = obj;
 }
Пример #53
0
 private void PinObject(Entry e, IPersistent obj)
 {
     if (pinLimit != 0)
     {
         if (e.pin != null)
         {
             e.Unlink();
         }
         else
         {
             if (nPinned == pinLimit)
             {
                 pinList.lru.Unpin();
             }
             else
             {
                 nPinned += 1;
             }
         }
         e.LinkAfter(pinList, obj);
     }
 }
Пример #54
0
        public virtual void Put(int oid, IPersistent obj)
        {
            lock (this)
            {
                WeakReference ref_Renamed = CreateReference(obj);
                Entry[] tab = table;
                int index = (oid & 0x7FFFFFFF) % tab.Length;
                for (Entry e = tab[index]; e != null; e = e.next)
                {
                    if (e.oid == oid)
                    {
                        e.ref_Renamed = ref_Renamed;
                        PinObject(e, obj);
                        return;
                    }
                }
                if (count >= threshold)
                {
                    // Rehash the table if the threshold is exceeded
                    Rehash();
                    tab = table;
                    index = (oid & 0x7FFFFFFF) % tab.Length;
                }

                // Creates the new entry.
                tab[index] = new Entry(oid, ref_Renamed, tab[index]);
                PinObject(tab[index], obj);
                count++;
            }
        }
Пример #55
0
 public virtual void LockObject(IPersistent obj)
 {
     if (useSerializableTransactions)
     {
         ThreadTransactionContext ctx = TransactionContext;
         if (ctx.nested != 0)
         {
             // serializable transaction
             ctx.locked.Add(obj);
         }
     }
 }
Пример #56
0
 public virtual void LoadObject(IPersistent obj)
 {
     lock (this)
     {
         if (obj.IsRaw())
         {
             LoadStub(obj.Oid, obj, obj.GetType());
         }
     }
 }
Пример #57
0
 public virtual void DeallocateObject(IPersistent obj)
 {
     lock (this)
     {
         lock (objectCache)
         {
             int oid = obj.Oid;
             if (oid == 0)
             {
                 return;
             }
             long pos = GetPos(oid);
             objectCache.Remove(oid);
             int offs = (int) pos & (Page.pageSize - 1);
             if ((offs & (dbFreeHandleFlag | dbPageObjectFlag)) != 0)
             {
                 throw new StorageError(StorageError.DELETED_OBJECT);
             }
             Page pg = pool.GetPage(pos - offs);
             offs &= ~ dbFlagsMask;
             int size = ObjectHeader.GetSize(pg.data, offs);
             pool.Unfix(pg);
             FreeId(oid);
             if ((pos & dbModifiedFlag) != 0)
             {
                 Free(pos & ~ dbFlagsMask, size);
             }
             else
             {
                 CloneBitmap(pos, size);
             }
             obj.AssignOid(this, 0, false);
         }
     }
 }
Пример #58
0
 public virtual Relation CreateRelation(IPersistent owner)
 {
     return new RelationImpl(owner);
 }
Пример #59
0
        private void StoreObject0(IPersistent obj)
        {
            obj.OnStore();
            int oid = obj.Oid;
            bool newObject = false;
            if (oid == 0)
            {
                oid = AllocateId();
                if (!obj.Deleted)
                {
                    objectCache.Put(oid, obj);
                }
                obj.AssignOid(this, oid, false);
                newObject = true;
            }
            else if (obj.Modified)
            {
                objectCache.ClearDirty(oid);
            }
            byte[] data = PackObject(obj);
            long pos;
            int newSize = ObjectHeader.GetSize(data, 0);
            if (newObject || (pos = GetPos(oid)) == 0)
            {
                pos = Allocate(newSize, 0);
                SetPos(oid, pos | dbModifiedFlag);
            }
            else
            {
                int offs = (int) pos & (Page.pageSize - 1);
                if ((offs & (dbFreeHandleFlag | dbPageObjectFlag)) != 0)
                {
                    throw new StorageError(StorageError.DELETED_OBJECT);
                }

                Page pg = pool.GetPage(pos - offs);
                offs &= ~ dbFlagsMask;
                int size = ObjectHeader.GetSize(pg.data, offs);
                pool.Unfix(pg);
                if ((pos & dbModifiedFlag) == 0)
                {
                    CloneBitmap(pos & ~ dbFlagsMask, size);
                    pos = Allocate(newSize, 0);
                    SetPos(oid, pos | dbModifiedFlag);
                }
                else
                {
                    if (((newSize + dbAllocationQuantum - 1) & ~ (dbAllocationQuantum - 1)) > ((size + dbAllocationQuantum - 1) & ~ (dbAllocationQuantum - 1)))
                    {
                        long newPos = Allocate(newSize, 0);
                        CloneBitmap(pos & ~ dbFlagsMask, size);
                        Free(pos & ~ dbFlagsMask, size);
                        pos = newPos;
                        SetPos(oid, pos | dbModifiedFlag);
                    }
                    else if (newSize < size)
                    {
                        ObjectHeader.SetSize(data, 0, size);
                    }
                }
            }
            modified = true;
            pool.Put(pos & ~ dbFlagsMask, data, newSize);
        }
Пример #60
0
        internal int UnpackObject(object obj, ClassDescriptor desc, bool recursiveLoading, byte[] body, int offs, IPersistent po)
        {
            ClassDescriptor.FieldDescriptor[] all = desc.allFields;
            ReflectionProvider provider = ClassDescriptor.ReflectionProvider;
            int len;

            for (int i = 0, n = all.Length; i < n; i++)
            {
                ClassDescriptor.FieldDescriptor fd = all[i];
                FieldInfo f = fd.field;

                if (f == null || obj == null)
                {
                    switch (fd.type)
                    {
                        case ClassDescriptor.tpBoolean:
                        case ClassDescriptor.tpByte:
                            offs += 1;
                            continue;

                        case ClassDescriptor.tpChar:
                        case ClassDescriptor.tpShort:
                            offs += 2;
                            continue;

                        case ClassDescriptor.tpInt:
                        case ClassDescriptor.tpFloat:
                        case ClassDescriptor.tpObject:
                            offs += 4;
                            continue;

                        case ClassDescriptor.tpLong:
                        case ClassDescriptor.tpDouble:
                        case ClassDescriptor.tpDate:
                            offs += 8;
                            continue;

                        case ClassDescriptor.tpString:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                offs += len * 2;
                            }
                            else if (len < -1)
                            {
                                offs -= (len + 2);
                            }
                            continue;

                        case ClassDescriptor.tpValue:
                            offs = UnpackObject((object) null, fd.valueDesc, recursiveLoading, body, offs, po);
                            continue;

                        case ClassDescriptor.tpRaw:
                        case ClassDescriptor.tpArrayOfByte:
                        case ClassDescriptor.tpArrayOfBoolean:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                offs += len;
                            }
                            else if (len < -1)
                            {
                                offs += ClassDescriptor.Sizeof[-2 - len];
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfShort:
                        case ClassDescriptor.tpArrayOfChar:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                offs += len * 2;
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfInt:
                        case ClassDescriptor.tpArrayOfFloat:
                        case ClassDescriptor.tpArrayOfObject:
                        case ClassDescriptor.tpLink:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                offs += len * 4;
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfLong:
                        case ClassDescriptor.tpArrayOfDouble:
                        case ClassDescriptor.tpArrayOfDate:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                offs += len * 8;
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfString:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                for (int j = 0; j < len; j++)
                                {
                                    int strlen = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                    if (strlen > 0)
                                    {
                                        offs += strlen * 2;
                                    }
                                    else if (strlen < -1)
                                    {
                                        offs -= (strlen + 2);
                                    }
                                }
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfValue:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                ClassDescriptor valueDesc = fd.valueDesc;
                                for (int j = 0; j < len; j++)
                                {
                                    offs = UnpackObject((object) null, valueDesc, recursiveLoading, body, offs, po);
                                }
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfRaw:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len > 0)
                            {
                                for (int j = 0; j < len; j++)
                                {
                                    int rawlen = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                    if (rawlen > 0)
                                    {
                                        offs += rawlen;
                                    }
                                    else if (rawlen < -1)
                                    {
                                        offs += ClassDescriptor.Sizeof[-2 - rawlen];
                                    }
                                }
                            }
                            continue;
                        }
                }
                else
                {
                    switch (fd.type)
                    {
                        case ClassDescriptor.tpBoolean:
                            provider.SetBoolean(f, obj, body[offs++] != 0);
                            continue;

                        case ClassDescriptor.tpByte:
                            provider.SetByte(f, obj, body[offs++]);
                            continue;

                        case ClassDescriptor.tpChar:
                            provider.SetChar(f, obj, (char) Bytes.Unpack2(body, offs));
                            offs += 2;
                            continue;

                        case ClassDescriptor.tpShort:
                            provider.SetShort(f, obj, Bytes.Unpack2(body, offs));
                            offs += 2;
                            continue;

                        case ClassDescriptor.tpInt:
                            provider.SetInt(f, obj, Bytes.Unpack4(body, offs));
                            offs += 4;
                            continue;

                        case ClassDescriptor.tpLong:
                            provider.SetLong(f, obj, Bytes.Unpack8(body, offs));
                            offs += 8;
                            continue;

                        case ClassDescriptor.tpFloat:
                            provider.SetFloat(f, obj, Bytes.UnpackF4(body, offs));
                            offs += 4;
                            continue;

                        case ClassDescriptor.tpDouble:
                            provider.SetDouble(f, obj, Bytes.UnpackF8(body, offs));
                            offs += 8;
                            continue;

                        case ClassDescriptor.tpString:
                        {
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            string str = null;
                            if (len >= 0)
                            {
                                char[] chars = new char[len];
                                for (int j = 0; j < len; j++)
                                {
                                    chars[j] = (char) Bytes.Unpack2(body, offs);
                                    offs += 2;
                                }
                                str = new string(chars);
                            }
                            else if (len < -1)
                            {
                                if (encoding != null)
                                {
                                    string tempStr;
                                    //UPGRADE_TODO: The differences in the Format of parameters for constructor 'java.lang.String.String' may cause compilation errors.
                                    tempStr = System.Text.Encoding.GetEncoding(encoding).GetString(body);
                                    str = new string(tempStr.ToCharArray(), offs, -2 - len);
                                }
                                else
                                {
                                    str = new string(SupportClass.ToCharArray(body), offs, -2 - len);
                                }
                                offs -= (2 + len);
                            }
                            provider.Set(f, obj, str);
                            continue;
                        }

                        case ClassDescriptor.tpDate:
                        {
                            long msec = Bytes.Unpack8(body, offs);
                            offs += 8;
                            //UPGRADE_TODO: The 'System.DateTime' structure does not have an equivalent to NULL.
                            DateTime date; // = null;
                            if (msec >= 0)
                            {
                                //UPGRADE_TODO: Constructor 'java.util.Date.Date' was converted to 'DateTime.DateTime' which has a different behavior.
                                date = new DateTime(msec);
                            }
                            else
                                date = new DateTime();
                            provider.Set(f, obj, date);
                            continue;
                        }

                        case ClassDescriptor.tpObject:
                        {
                            provider.Set(f, obj, Unswizzle(Bytes.Unpack4(body, offs), f.FieldType, recursiveLoading));
                            offs += 4;
                            continue;
                        }

                        case ClassDescriptor.tpValue:
                        {
                            object val = fd.valueDesc.NewInstance();
                            offs = UnpackObject(val, fd.valueDesc, recursiveLoading, body, offs, po);
                            provider.Set(f, obj, val);
                            continue;
                        }

                        case ClassDescriptor.tpRaw:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len >= 0)
                            {
                                System.IO.MemoryStream streamIn = new System.IO.MemoryStream(body, offs, len);
                                BinaryFormatter formatter = new BinaryFormatter();
                                object val = formatter.Deserialize(streamIn);
                                provider.Set(f, obj, val);
                                streamIn.Close();
                                offs += len;
                            }
                            else if (len < 0)
                            {
                                object val = null;
                                switch (-2 - len)
                                {
                                    case ClassDescriptor.tpBoolean:
                                        val = Convert.ToBoolean(body[offs++]);
                                        break;

                                    case ClassDescriptor.tpByte:
                                        val = (byte) body[offs++];
                                        break;

                                    case ClassDescriptor.tpChar:
                                        val = (char) Bytes.Unpack2(body, offs);
                                        offs += 2;
                                        break;

                                    case ClassDescriptor.tpShort:
                                        val = (short) Bytes.Unpack2(body, offs);
                                        offs += 2;
                                        break;

                                    case ClassDescriptor.tpInt:
                                        val = (Int32) Bytes.Unpack4(body, offs);
                                        offs += 4;
                                        break;

                                    case ClassDescriptor.tpLong:
                                        val = (long) Bytes.Unpack8(body, offs);
                                        offs += 8;
                                        break;

                                    case ClassDescriptor.tpFloat:
                                        val = Bytes.UnpackF4(body, offs);
                                        break;

                                    case ClassDescriptor.tpDouble:
                                        val = Bytes.UnpackF8(body, offs);
                                        offs += 8;
                                        break;

                                    case ClassDescriptor.tpDate:
                                        //UPGRADE_TODO: Constructor 'java.util.Date.Date' was converted to 'DateTime.DateTime' which has a different behavior.
                                        val = new DateTime(Bytes.Unpack8(body, offs));
                                        offs += 8;
                                        break;

                                    case ClassDescriptor.tpObject:
                                        val = Unswizzle(Bytes.Unpack4(body, offs), typeof(Persistent), recursiveLoading);
                                        offs += 4;
                                        break;
                                    }
                                provider.Set(f, obj, val);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfByte:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                byte[] arr = new byte[len];
                                Array.Copy(body, offs, arr, 0, len);
                                offs += len;
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfBoolean:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                bool[] arr = new bool[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = body[offs++] != 0;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfShort:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                short[] arr = new short[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Bytes.Unpack2(body, offs);
                                    offs += 2;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfChar:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                char[] arr = new char[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = (char) Bytes.Unpack2(body, offs);
                                    offs += 2;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfInt:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                int[] arr = new int[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfLong:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                long[] arr = new long[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Bytes.Unpack8(body, offs);
                                    offs += 8;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfFloat:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                float[] arr = new float[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Bytes.UnpackF4(body, offs);
                                    offs += 4;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfDouble:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                double[] arr = new double[len];
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Bytes.UnpackF8(body, offs);
                                    offs += 8;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfDate:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                DateTime[] arr = new DateTime[len];
                                for (int j = 0; j < len; j++)
                                {
                                    long msec = Bytes.Unpack8(body, offs);
                                    offs += 8;
                                    if (msec >= 0)
                                    {
                                        //UPGRADE_TODO: Constructor 'java.util.Date.Date' was converted to 'DateTime.DateTime' which has a different behavior.
                                        arr[j] = new DateTime(msec);
                                    }
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfString:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                string[] arr = new string[len];
                                for (int j = 0; j < len; j++)
                                {
                                    int strlen = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                    if (strlen >= 0)
                                    {
                                        char[] chars = new char[strlen];
                                        for (int k = 0; k < strlen; k++)
                                        {
                                            chars[k] = (char) Bytes.Unpack2(body, offs);
                                            offs += 2;
                                        }
                                        arr[j] = new string(chars);
                                    }
                                    else if (strlen < -1)
                                    {
                                        if (encoding != null)
                                        {
                                            string tempStr2;
                                            //UPGRADE_TODO: The differences in the Format of parameters for constructor 'java.lang.String.String' may cause compilation errors.
                                            tempStr2 = System.Text.Encoding.GetEncoding(encoding).GetString(body);
                                            arr[j] = new string(tempStr2.ToCharArray(), offs, -2 - strlen);
                                        }
                                        else
                                        {
                                            arr[j] = new string(SupportClass.ToCharArray(body), offs, -2 - strlen);
                                        }
                                        offs -= (2 + strlen);
                                    }
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfObject:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                Type elemType = f.FieldType.GetElementType();
                                IPersistent[] arr = (IPersistent[]) System.Array.CreateInstance(elemType, len);
                                for (int j = 0; j < len; j++)
                                {
                                    arr[j] = Unswizzle(Bytes.Unpack4(body, offs), elemType, recursiveLoading);
                                    offs += 4;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfValue:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                Type elemType = f.FieldType.GetElementType();
                                object[] arr = (object[]) System.Array.CreateInstance(elemType, len);
                                ClassDescriptor valueDesc = fd.valueDesc;
                                for (int j = 0; j < len; j++)
                                {
                                    object val = valueDesc.NewInstance();
                                    offs = UnpackObject(val, valueDesc, recursiveLoading, body, offs, po);
                                    arr[j] = val;
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpArrayOfRaw:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                Type elemType = f.FieldType.GetElementType();
                                object[] arr = (object[]) System.Array.CreateInstance(elemType, len);
                                for (int j = 0; j < len; j++)
                                {
                                    int rawlen = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                    if (rawlen >= 0)
                                    {
                                        // TODOPORT:
                                        System.IO.MemoryStream streamIn = new System.IO.MemoryStream(body, offs, rawlen);
                                        //UPGRADE_TODO: Class 'java.io.ObjectInputStream' was converted to 'System.IO.BinaryReader' which has a different behavior.
                                        //System.IO.BinaryReader streamIn = new PersistentObjectInputStream(this, bin);
                                        //UPGRADE_WARNING: Method 'java.io.ObjectInputStream.readObject' was converted to 'SupportClass.Deserialize' which may throw an exception.
                                        BinaryFormatter formatter = new BinaryFormatter();
                                        object val = formatter.Deserialize(streamIn);
                                        arr[j] = val;
                                        streamIn.Close();
                                        offs += rawlen;
                                    }
                                    else
                                    {
                                        object val = null;
                                        switch (-2 - rawlen)
                                        {
                                            case ClassDescriptor.tpBoolean:
                                                val = Convert.ToBoolean(body[offs++]);
                                                break;

                                            case ClassDescriptor.tpByte:
                                                val = (byte) body[offs++];
                                                break;

                                            case ClassDescriptor.tpChar:
                                                val = (char) Bytes.Unpack2(body, offs);
                                                offs += 2;
                                                break;

                                            case ClassDescriptor.tpShort:
                                                val = (short) Bytes.Unpack2(body, offs);
                                                offs += 2;
                                                break;

                                            case ClassDescriptor.tpInt:
                                                val = (Int32) Bytes.Unpack4(body, offs);
                                                offs += 4;
                                                break;

                                            case ClassDescriptor.tpLong:
                                                val = (long) Bytes.Unpack8(body, offs);
                                                offs += 8;
                                                break;

                                            case ClassDescriptor.tpFloat:
                                                val = Bytes.UnpackF4(body, offs);
                                                offs += 4;
                                                break;

                                            case ClassDescriptor.tpDouble:
                                                val = Bytes.UnpackF8(body, offs);
                                                offs += 8;
                                                break;

                                            case ClassDescriptor.tpDate:
                                                //UPGRADE_TODO: Constructor 'java.util.Date.Date' was converted to 'DateTime.DateTime' which has a different behavior.
                                                val = new DateTime(Bytes.Unpack8(body, offs));
                                                offs += 8;
                                                break;

                                            case ClassDescriptor.tpObject:
                                                val = Unswizzle(Bytes.Unpack4(body, offs), typeof(Persistent), recursiveLoading);
                                                offs += 4;
                                                break;
                                            }
                                        arr[j] = val;
                                    }
                                }
                                provider.Set(f, obj, arr);
                            }
                            continue;

                        case ClassDescriptor.tpLink:
                            len = Bytes.Unpack4(body, offs);
                            offs += 4;
                            if (len < 0)
                            {
                                provider.Set(f, obj, (object) null);
                            }
                            else
                            {
                                IPersistent[] arr = new IPersistent[len];
                                for (int j = 0; j < len; j++)
                                {
                                    int elemOid = Bytes.Unpack4(body, offs);
                                    offs += 4;
                                    if (elemOid != 0)
                                    {
                                        arr[j] = new PersistentStub(this, elemOid);
                                    }
                                }
                                provider.Set(f, obj, new LinkImpl(arr, po));
                            }
                            break;
                        }
                }
            }
            return offs;
        }