Exemple #1
0
        /// <summary>
        ///   Read the class info header with the specific oid
        /// </summary>
        /// <returns> The read class info object @ </returns>
        public ClassInfo ReadClassInfoHeader(OID classInfoOid)
        {
            if (OdbConfiguration.IsLoggingEnabled())
            {
                DLogger.Debug("FileSystemReader: Reading new Class info Header with oid " + classInfoOid);
            }
            var classInfoPosition = GetObjectPositionFromItsOid(classInfoOid, true, true);

            _fsi.SetReadPosition(classInfoPosition);
            var blockSize = _fsi.ReadInt();
            var blockType = _fsi.ReadByte();

            if (!BlockTypes.IsClassHeader(blockType))
            {
                throw new OdbRuntimeException(
                          NDatabaseError.WrongTypeForBlockType.AddParameter("Class Header").AddParameter(blockType).
                          AddParameter(classInfoPosition));
            }
            //class info category, to remove
            _fsi.ReadByte();

            var classInfoId                  = OIDFactory.BuildClassOID(_fsi.ReadLong());
            var previousClassOID             = ReadOid();
            var nextClassOID                 = ReadOid();
            var nbObjects                    = _fsi.ReadLong();
            var originalZoneInfoFirst        = ReadOid();
            var originalZoneInfoLast         = ReadOid();
            var fullClassName                = _fsi.ReadString();
            var maxAttributeId               = _fsi.ReadInt();
            var attributesDefinitionPosition = _fsi.ReadLong();

            var classInfo = new ClassInfo(fullClassName)
            {
                Position                     = classInfoPosition,
                ClassInfoId                  = classInfoId,
                PreviousClassOID             = previousClassOID,
                NextClassOID                 = nextClassOID,
                MaxAttributeId               = maxAttributeId,
                AttributesDefinitionPosition = attributesDefinitionPosition
            };

            classInfo.OriginalZoneInfo.SetNbObjects(nbObjects);
            classInfo.OriginalZoneInfo.First = originalZoneInfoFirst;
            classInfo.OriginalZoneInfo.Last  = originalZoneInfoLast;
            classInfo.CommitedZoneInfo.SetBasedOn(classInfo.OriginalZoneInfo);

            // FIXME Convert block size to long ??
            var realBlockSize = (int)(_fsi.GetPosition() - classInfoPosition);

            if (blockSize != realBlockSize)
            {
                throw new OdbRuntimeException(
                          NDatabaseError.WrongBlockSize.AddParameter(blockSize).AddParameter(realBlockSize).AddParameter(
                              classInfoPosition));
            }
            return(classInfo);
        }