Beispiel #1
0
        /// <summary>
        /// Loads a <see cref="DatabaseInfo"/> from stream.
        /// </summary>
        /// <param name="stream"></param>
        public DatabaseInfo(BinaryStreamBase stream)
        {
            byte version = stream.ReadUInt8();

            switch (version)
            {
            case 1:
                DatabaseName = stream.ReadString();
                KeyTypeID    = stream.ReadGuid();
                ValueTypeID  = stream.ReadGuid();
                int count = stream.ReadInt32();
                EncodingDefinition[] definitions = new EncodingDefinition[count];
                for (int x = 0; x < count; x++)
                {
                    definitions[x] = new EncodingDefinition(stream);
                }
                SupportedStreamingModes = new ReadOnlyCollection <EncodingDefinition>(definitions);
                KeyType   = Library.GetSortedTreeType(KeyTypeID);
                ValueType = Library.GetSortedTreeType(ValueTypeID);
                break;

            default:
                throw new VersionNotFoundException("Unknown version code.");
            }
        }
        /// <summary>
        /// Reads the header data.
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="treeNodeType"></param>
        /// <param name="blockSize"></param>
        internal static void ReadHeader(BinaryStreamBase stream, out EncodingDefinition treeNodeType, out int blockSize)
        {
            stream.Position = 0;
            byte version = stream.ReadUInt8();

            if (version == 109)
            {
                stream.Position = 0;
                stream.ReadGuid();
                treeNodeType = new EncodingDefinition(stream.ReadGuid());
                blockSize    = stream.ReadInt32();
            }
            else if (version == 1)
            {
                blockSize    = stream.ReadInt32();
                treeNodeType = new EncodingDefinition(stream);
            }
            else
            {
                throw new VersionNotFoundException();
            }
        }
        /// <summary>
        /// Loads a <see cref="EncodingDefinition"/> from a stream
        /// </summary>
        /// <param name="stream">the stream to load from.</param>
        public EncodingDefinition(BinaryStreamBase stream)
        {
            byte code = stream.ReadUInt8();

            if (code == 1)
            {
                m_keyEncodingMethod      = Guid.Empty;
                m_valueEncodingMethod    = Guid.Empty;
                m_keyValueEncodingMethod = stream.ReadGuid();
                IsKeyValueEncoded        = true;
            }
            else if (code == 2)
            {
                m_keyEncodingMethod      = stream.ReadGuid();
                m_valueEncodingMethod    = stream.ReadGuid();
                m_keyValueEncodingMethod = Guid.Empty;
                IsKeyValueEncoded        = false;
            }
            m_hashCode            = ComputeHashCode();
            m_isFixedSizeEncoding = this == FixedSizeCombinedEncoding ||
                                    this == FixedSizeIndividualEncoding;
        }
        /// <summary>
        /// Loads the header.
        /// </summary>
        public void LoadHeader(BinaryStreamBase stream)
        {
            stream.Position = 0;
            byte version = stream.ReadUInt8();

            if (version == 109)
            {
                stream.Position = 0;
                if (EncodingDefinition.FixedSizeCombinedEncoding != new EncodingDefinition(stream.ReadGuid()))
                {
                    throw new Exception("Header Corrupt");
                }
                if (TreeNodeType != new EncodingDefinition(stream.ReadGuid()))
                {
                    throw new Exception("Header Corrupt");
                }
                if (BlockSize != stream.ReadInt32())
                {
                    throw new Exception("Header Corrupt");
                }
                if (stream.ReadUInt8() != 0)
                {
                    throw new Exception("Header Corrupt");
                }
                LastAllocatedBlock   = stream.ReadUInt32();
                RootNodeIndexAddress = stream.ReadUInt32();
                RootNodeLevel        = stream.ReadUInt8();
            }
            else if (version == 1)
            {
                if (BlockSize != stream.ReadInt32())
                {
                    throw new Exception("Header Corrupt");
                }
                if (TreeNodeType != new EncodingDefinition(stream))
                {
                    throw new Exception("Header Corrupt");
                }
                LastAllocatedBlock   = stream.ReadUInt32();
                RootNodeIndexAddress = stream.ReadUInt32();
                RootNodeLevel        = stream.ReadUInt8();
            }
            else
            {
                throw new VersionNotFoundException();
            }
        }