Example #1
0
        private const uint WDB2FmtSig = 0x32424457; // WDB2

        public WDB2Writer(WDB2Reader reader, IDictionary <int, T> storage, Stream stream) : base(reader)
        {
            WDB2RowSerializer <T> serializer = new WDB2RowSerializer <T>(this);

            serializer.Serialize(storage);

            RecordsCount = storage.Count;

            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(WDB2FmtSig);
                writer.Write(RecordsCount);
                writer.Write(FieldsCount);
                writer.Write(RecordSize);
                writer.Write(StringTableSize);
                writer.Write(reader.TableHash);
                writer.Write(reader.Build);
                writer.Write((uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds());

                if (storage.Count == 0)
                {
                    return;
                }

                // Extended header
                if (reader.Build > 12880)
                {
                    if (reader.MaxIndex == 0)
                    {
                        writer.Write(0);
                        writer.Write(0);
                        writer.Write(reader.LayoutHash);
                        writer.Write(0); // CopyTableSize
                    }
                    else
                    {
                        WriteIndices(writer, serializer, reader.LayoutHash);
                    }
                }

                foreach (var record in serializer.Records)
                {
                    record.Value.CopyTo(writer.BaseStream);
                }

                foreach (var str in StringTable)
                {
                    writer.WriteCString(str.Key);
                }
            }
        }