Example #1
0
        public override void WriteHeader(BinaryWriter bw, DBEntry entry)
        {
            Tuple <int, int> minmax = entry.MinMax();

            bw.BaseStream.Position = 0;

            WriteBaseHeader(bw, entry);

            bw.Write((int)TableHash);
            bw.Write(LayoutHash);
            bw.Write(minmax.Item1);  //MinId
            bw.Write(minmax.Item2);  //MaxId
            bw.Write(Locale);
            bw.Write(0);             //CopyTableSize
            bw.Write((ushort)Flags); //Flags
            bw.Write(IdIndex);       //IdColumn
            bw.Write(TotalFieldSize);
            bw.Write(0);             //CommonDataTableSize

            //Write the field_structure bits
            for (int i = 0; i < FieldStructure.Count; i++)
            {
                if (HasIndexTable && i == 0)
                {
                    continue;
                }
                if (FieldStructure[i].CommonDataColumn)
                {
                    continue;
                }

                bw.Write(FieldStructure[i].Bits);
                bw.Write(HasIndexTable ? (ushort)(FieldStructure[i].Offset - 4) : FieldStructure[i].Offset);
            }
        }
Example #2
0
        public override void WriteOffsetMap(BinaryWriter bw, DBEntry entry, List <Tuple <int, short> > OffsetMap, int record_offset = 0)
        {
            var minmax     = entry.MinMax();
            var ids        = new HashSet <int>(entry.GetPrimaryKeys());
            var duplicates = entry.Header.OffsetDuplicates;

            int m = 0;

            for (int x = minmax.Item1; x <= minmax.Item2; x++)
            {
                if (ids.Contains(x)) //Insert the offset map
                {
                    var kvp = OffsetMap[m];
                    bw.Write(kvp.Item1 + record_offset);
                    bw.Write(kvp.Item2);
                    m++;
                }
                else if (duplicates.ContainsKey(x)) //Reinsert our duplicates
                {
                    var hiddenkvp = OffsetMap[duplicates[x]];
                    bw.Write(hiddenkvp.Item1 + record_offset);
                    bw.Write(hiddenkvp.Item2);
                }
                else
                {
                    bw.BaseStream.Position += sizeof(int) + sizeof(short); //0 fill
                }
            }

            ids.Clear();
        }
Example #3
0
        public override void WriteHeader(BinaryWriter bw, DBEntry entry)
        {
            base.WriteHeader(bw, entry);

            Tuple <int, int> minmax = entry.MinMax();

            if (MaxId == 0) //Irrelevant if header doesn't use this
            {
                minmax = new Tuple <int, int>(0, 0);
            }

            bw.Write(TableHash);
            bw.Write(Build);
            bw.Write(TimeStamp);

            bw.Write(minmax.Item1);
            bw.Write(minmax.Item2);

            bw.Write(Locale);
            bw.Write(CopyTableSize);

            if (MaxId != 0 && Build > 12880)
            {
                List <int>   IndiciesTable     = new List <int>();
                List <short> StringLengthTable = new List <short>();

                Dictionary <int, short> stringlengths = entry.GetStringLengths();
                int x = 0;
                for (int i = minmax.Item1; i <= minmax.Item2; i++)
                {
                    if (stringlengths.ContainsKey(i))
                    {
                        StringLengthTable.Add(stringlengths[i]);
                        IndiciesTable.Add(++x);
                    }
                    else
                    {
                        IndiciesTable.Add(0);
                        StringLengthTable.Add(0);
                    }
                }

                //Write the data
                bw.WriteArray(IndiciesTable.ToArray());
                bw.WriteArray(StringLengthTable.ToArray());
            }
        }
Example #4
0
        public override void WriteHeader <T>(BinaryWriter bw, DBEntry <T> entry)
        {
            Tuple <int, int> minmax = entry.MinMax();

            bw.BaseStream.Position = 0;

            base.WriteHeader(bw, entry);

            bw.Write(TableHash);
            bw.Write(LayoutHash);
            bw.Write(Build);
            bw.Write(TimeStamp);
            bw.Write(minmax.Item1); //MinId
            bw.Write(minmax.Item2); //MaxId
            bw.Write(Locale);

            //WCH5 has the offsetmap BEFORE the data, create placeholder data
            if (HasOffsetTable)
            {
                OffsetMapOffset         = (int)bw.BaseStream.Position;
                bw.BaseStream.Position += entry.GetPrimaryKeys().Count() * (sizeof(int) + sizeof(int) + sizeof(short));
            }
        }