//Поиск информации о стране по ID в памяти private Dictionary <string, object> GetCountryMem(byte CountryID) { uint Readed = 0; uint NextRead = Header.CountrySize; SxGeoUnpack Unpacker = new SxGeoUnpack(Header.pack_country, Header.DBEncoding); while (Readed < Header.CountrySize - 1) { //читаем запись byte[] buf = bSubstr(cities_db, Readed, NextRead); //распаковываем запись int RealLength = 0; Dictionary <string, object> Record = Unpacker.Unpack(buf, out RealLength); //проверяем, не нашли ли запись if ((byte)Record["id"] == CountryID) { return(Record); } //Сохраняем количество фактических байт записи Readed += (uint)RealLength; } return(null); }
//Поиск информации о стране по ID на диске private Dictionary <string, object> GetCountryDisk(byte CountryID) { //становимся на начало таблицы со странами long TableStart = Header.countries_begin; Seek(TableStart, SeekOrigin.Begin); long Readed = 0; int NextRead = (int)Header.CountrySize; SxGeoUnpack Unpacker = new SxGeoUnpack(Header.pack_country, Header.DBEncoding); while (Readed < Header.CountrySize - 1) { //читаем запись byte[] buf = ReadBytes(NextRead); if (buf == null) { return(null); } //распаковываем запись int RealLength = 0; Dictionary <string, object> Record = Unpacker.Unpack(buf, out RealLength); //проверяем, не нашли ли запись if ((byte)Record["id"] == CountryID) { return(Record); } //Сохраняем количество фактических байт записи Readed += RealLength; //Отступаем в потоке назад long backstep = 0; if (TableStart + Readed + Header.MaxCountry > FileSize) { //если на чтение последних записей файла не хватило //максимальной длины записи backstep = -NextRead + RealLength; NextRead = (int)(FileSize - TableStart - Readed); //break; } else { backstep = -NextRead + RealLength; } Seek(backstep, SeekOrigin.Current); } return(null); }
public bool FillTable() { //становимся на начало таблицы if (!Database.Seek(TableStart, SeekOrigin.Begin)) { ErrorMessage = Database.ErrorMessage; return(false); } long Readed = 0; int NextRead = MaxRecordSize; while (Readed < TableSize - 1) { //читаем запись byte[] buf = Database.ReadBytes(NextRead); if (buf == null) { ErrorMessage = Database.ErrorMessage; return(false); } //распаковываем запись int RealLength = 0; Dictionary <string, object> Record = Unpacker.Unpack(buf, out RealLength); //кладем ее в таблицу DataSet DataRow dr = SxDS.Tables[TableName].NewRow(); foreach (string FieldName in Record.Keys) { dr[FieldName] = Record[FieldName]; } SxDS.Tables[TableName].Rows.Add(dr); //Сохраняем количество фактических байт записи Readed += RealLength; //Отступаем в потоке назад long backstep = 0; if (TableStart + Readed + MaxRecordSize > Database.FileSize) { //если на чтение последних записей файла не хватило //максимальной длины записи backstep = -NextRead + RealLength; NextRead = (int)(Database.FileSize - TableStart - Readed); //break; } else { backstep = -NextRead + RealLength; } Database.Seek(backstep, SeekOrigin.Current); //добавляем счетчик записей RecordsCount++; } return(true); }
public Dictionary <string, object> GetIPInfo(string IP, SxGeoInfoType InfoType) { Dictionary <string, object> data_city = new Dictionary <string, object>(); Dictionary <string, object> data_country = new Dictionary <string, object>(); Dictionary <string, object> data_region = new Dictionary <string, object>(); if (!IsOpen) { ErrorMessage = "Database not open."; return(null); } if (!IPConverter.IsIP(IP)) //проверяем IP ли это) { ErrorMessage = IP + " is not valid IP address."; return(null); } //получаем ID IP-адреса uint ID = SearchID(IP); if (ID == 0) //не нашли { ErrorMessage = "Not found."; return(null); } //создаем переменные для хранения ответа IPInfo = new Dictionary <string, object>(); IPInfoTypes = new Dictionary <string, Type>(); //добавляем сам адрес IPInfo.Add("ip", IP); IPInfoTypes.Add("ip", typeof(string)); if (Header.IdLen == 1) //БД SxGeo, ничего кроме ISO-кода вывести не сможем { IPInfo.Add("country_iso", IdToIso(ID)); IPInfoTypes.Add("country_iso", typeof(string)); return(IPInfo); } //БД SxGeoCountry, можем вывести много чего SxGeoUnpack Unpacker = null; byte[] buf = null; //если найденный 'ID' < размера справочника городов //город не найден - только страна if (ID < Header.CountrySize) { Unpacker = new SxGeoUnpack(Header.pack_country, Header.DBEncoding); buf = ReadDBDirs(Header.countries_begin, ID, Header.MaxCountry, cities_db); data_country = Unpacker.Unpack(buf); AddData(data_country, Unpacker.GetRecordTypes(), "country_"); return(IPInfo); } //город найден, находим и распаковываем информацию о городе Unpacker = new SxGeoUnpack(Header.pack_city, Header.DBEncoding); buf = ReadDBDirs(Header.countries_begin, ID, Header.MaxCity, cities_db); data_city = Unpacker.Unpack(buf); //о стране по ID страны data_country = GetCountry((byte)data_city["country_id"]); switch (InfoType) { case SxGeoInfoType.OnlyCountry: //только информация о стране { AddData(data_country, SxGeoUnpack.GetRecordTypes(Header.pack_country), "country_"); }; break; case SxGeoInfoType.CountryCity: //страна+город { AddData(data_country, SxGeoUnpack.GetRecordTypes(Header.pack_country), "country_"); AddData(data_city, Unpacker.GetRecordTypes(), "city_"); }; break; default: //полная информация с регионом (если есть) { Unpacker = new SxGeoUnpack(Header.pack_region, Header.DBEncoding); buf = ReadDBDirs(Header.regions_begin, (uint)data_city["region_seek"], Header.MaxRegion, regions_db); data_region = Unpacker.Unpack(buf); AddData(data_country, SxGeoUnpack.GetRecordTypes(Header.pack_country), "country_"); AddData(data_city, SxGeoUnpack.GetRecordTypes(Header.pack_city), "city_"); AddData(data_region, Unpacker.GetRecordTypes(), "region_"); }; break; } return(IPInfo); }