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