コード例 #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();
            }
        }
コード例 #4
0
 public void AddElement(string name, IPersistent child)
 {
     if (child != null)
     {
         element.AppendChild(child.ToXml(name, doc));
     }
 }
コード例 #5
0
ファイル: Persistor.cs プロジェクト: nanexcool/Gearset
 /// <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
ファイル: Projection.cs プロジェクト: kjk/tenderbase
 /// <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
ファイル: LinkImpl.cs プロジェクト: cuongdodinh/timok.rbr
        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
ファイル: Persistor.cs プロジェクト: bartwe/Gearset
 /// <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
ファイル: Persistor.cs プロジェクト: bartwe/Gearset
        /// <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
ファイル: BtreeFieldIndex.cs プロジェクト: kjk/tenderbase
        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
ファイル: BitIndexImpl.cs プロジェクト: kjk/tenderbase
        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
ファイル: StrongHashTable.cs プロジェクト: kjk/volante
        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
ファイル: LinkImpl.cs プロジェクト: cuongdodinh/timok.rbr
 public virtual void Set(int i, IPersistent obj)
 {
     if (i < 0 || i >= used)
     {
         throw new IndexOutOfRangeException();
     }
     arr[i] = obj;
 }
コード例 #17
0
ファイル: BitIndexImpl.cs プロジェクト: kjk/tenderbase
        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
ファイル: GentleList.cs プロジェクト: arangas/MediaPortal-1
		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
ファイル: GentleList.cs プロジェクト: yuzixun/MediaPortal-1
 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));
 }
コード例 #25
0
 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;
 }
コード例 #27
0
 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
ファイル: LinkImpl.cs プロジェクト: cuongdodinh/timok.rbr
 public virtual IPersistent[] ToArray()
 {
     IPersistent[] a = new IPersistent[used];
     for (int i = used; --i >= 0;)
     {
         a[i] = loadElem(i);
     }
     return(a);
 }
コード例 #30
0
ファイル: LinkImpl.cs プロジェクト: cuongdodinh/timok.rbr
 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);
 }
コード例 #34
0
            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
ファイル: LinkImpl.cs プロジェクト: viceroypenguin/volante
        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
ファイル: RtreePage.cs プロジェクト: cuongdodinh/timok.rbr
 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();
     }
 }
コード例 #37
0
        /// <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
ファイル: GentleList.cs プロジェクト: arangas/MediaPortal-1
		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
ファイル: GentleList.cs プロジェクト: yuzixun/MediaPortal-1
 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);
            }
コード例 #42
0
 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
ファイル: RtreeR2Page.cs プロジェクト: kjk/volante
 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
ファイル: RtreePage.cs プロジェクト: kjk/tenderbase
 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
ファイル: RtreePage.cs プロジェクト: kjk/tenderbase
 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
ファイル: Ttree.cs プロジェクト: kjk/tenderbase
 /// <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
ファイル: BitIndexImpl.cs プロジェクト: kjk/tenderbase
        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
ファイル: StrongHashTable.cs プロジェクト: kjk/volante
 internal Entry(int oid, IPersistent oref, Entry chain)
 {
     next = chain;
     this.oid = oid;
     this.oref = oref;
 }
コード例 #51
0
ファイル: LruObjectCache.cs プロジェクト: kjk/tenderbase
 internal virtual void Unpin()
 {
     Unlink();
     lru = mru = null;
     pin = null;
 }
コード例 #52
0
ファイル: LruObjectCache.cs プロジェクト: kjk/tenderbase
 internal virtual void LinkAfter(Entry head, IPersistent obj)
 {
     mru = head.mru;
     mru.lru = this;
     head.mru = this;
     lru = head;
     pin = obj;
 }
コード例 #53
0
ファイル: LruObjectCache.cs プロジェクト: kjk/tenderbase
 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
ファイル: LruObjectCache.cs プロジェクト: kjk/tenderbase
        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
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
 public virtual void LockObject(IPersistent obj)
 {
     if (useSerializableTransactions)
     {
         ThreadTransactionContext ctx = TransactionContext;
         if (ctx.nested != 0)
         {
             // serializable transaction
             ctx.locked.Add(obj);
         }
     }
 }
コード例 #56
0
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
 public virtual void LoadObject(IPersistent obj)
 {
     lock (this)
     {
         if (obj.IsRaw())
         {
             LoadStub(obj.Oid, obj, obj.GetType());
         }
     }
 }
コード例 #57
0
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
 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
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
 public virtual Relation CreateRelation(IPersistent owner)
 {
     return new RelationImpl(owner);
 }
コード例 #59
0
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
        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
ファイル: StorageImpl.cs プロジェクト: kjk/tenderbase
        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;
        }