/// <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(); } }