Exemple #1
0
        //Поиск информации о стране по 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);
        }
Exemple #2
0
        //Поиск информации о стране по 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);
        }
Exemple #4
0
        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);
        }