/// <summary> /// Инициализирует структуры данных информацией из файла БД /// </summary> /// <param name="fileName">Путь к файлу БД</param> /// <param name="holder">Хранилище структур данных БД</param> public void Load(string fileName, DataHolder holder) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None, 64 * 1024, FileOptions.SequentialScan)) { Reader reader = new Reader(fs, 64 * 1024); if (!ReadFile(reader, holder)) { throw new Exception(); } } }
/// <summary> /// Инициализирует структуры данных информацией из файла БД /// </summary> /// <param name="fileName">Путь к файлу БД</param> /// <param name="holder">Хранилище структур данных БД</param> public void Load(string fileName, DataHolder holder) { using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "a", 0, MemoryMappedFileAccess.Read)) { using (MemoryMappedViewAccessor mmfa = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read)) { mmfa.Read(0, out holder.Header); holder.IpTable = new IpRecord[holder.Header.records]; holder.LocationTable = new LocationRecord[holder.Header.records]; holder.LocationByNameIndex = new int[holder.Header.records]; mmfa.ReadArray(holder.Header.offset_ranges, holder.IpTable, 0, holder.Header.records); mmfa.ReadArray(holder.Header.offset_locations, holder.LocationTable, 0, holder.Header.records); mmfa.ReadArray(holder.Header.offset_cities, holder.LocationByNameIndex, 0, holder.Header.records); } } }
/// <summary> /// Диагностический метод /// </summary> internal static unsafe void WriteDbFiles(DataHolder holder, int ipTableSize) { using (StreamWriter sw = new StreamWriter("ip.txt", false, Encoding.UTF8)) { for (int i = 0; i < ipTableSize; i++) { IpRecord rec = holder.IpTable[i]; LocationRecord lrec = holder.GetLocationRecordById((int)rec.location_index); string str = Utils.ConvertUintToIp(rec.ip_from).PadRight(20) + Utils.ConvertUintToIp(rec.ip_to).PadRight(20) + new string(lrec.city).PadRight(24); sw.WriteLine(str); } } using (StreamWriter sw = new StreamWriter("location.txt", false, Encoding.UTF8)) { for (int i = 0; i < holder.RecordCount; i++) { LocationRecord rec = holder.GetLocationRecordByNameIndex(i); string city = new string(rec.city); string country = new string(rec.country); string region = new string(rec.region); string postal = new string(rec.postal); string organization = new string(rec.organization); if (city.Length > 23 || country.Length > 7 || region.Length > 11 || postal.Length > 23 || organization.Length > 31) { throw new Exception(); } string str = city.PadRight(24) + country.PadRight(8) + region.PadRight(12) + postal.PadRight(12) + organization.PadRight(32) + rec.latitude.ToString().PadRight(20) + rec.longitude.ToString().PadRight(20); sw.WriteLine(str); } } }
private static unsafe bool ReadFile(Reader reader, DataHolder holder) { int blockSize = sizeof(DatabaseFileHeader); fixed (DatabaseFileHeader* headerPtr = &holder.Header) { if (!reader.ReadBytes((byte*)headerPtr, blockSize)) { return false; } } holder.IpTable = new IpRecord[holder.Header.records]; holder.LocationTable = new LocationRecord[holder.Header.records]; holder.LocationByNameIndex = new int[holder.Header.records]; blockSize = sizeof(IpRecord) * holder.Header.records; fixed (IpRecord* ipPtr = &holder.IpTable[0]) { if (!reader.ReadBytes((byte*)ipPtr, blockSize)) { return false; } } blockSize = sizeof(LocationRecord) * holder.Header.records; fixed (LocationRecord* locationPtr = &holder.LocationTable[0]) { if (!reader.ReadBytes((byte*)locationPtr, blockSize)) { return false; } } blockSize = sizeof(int) * holder.Header.records; fixed (int* indexPtr = &holder.LocationByNameIndex[0]) { return reader.ReadBytes((byte*)indexPtr, blockSize); } }