Advertisement
tolikpunkoff

CypexGeo initialisading an header reading function

Sep 12th, 2018
564
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.02 KB | None | 0 0
  1. public bool OpenDB()
  2. {
  3.     ErrorMessage = string.Empty;
  4.  
  5.     try
  6.     {
  7.         FileInfo fi = new FileInfo(FileName);
  8.         FileSize = fi.Length;
  9.         if ( FileSize < 40)
  10.         {
  11.             ErrorMessage = "Bad SxGeo file";
  12.             return false;
  13.         }
  14.  
  15.         SxStream = new FileStream(FileName, FileMode.Open, FileAccess.Read,
  16.             FileShare.Read);
  17.     }
  18.     catch (Exception ex)
  19.     {
  20.         ErrorMessage = ex.Message;
  21.         CloseDB();
  22.         return false;
  23.     }
  24.    
  25.     //проверка сигнатуры ('SxG')
  26.     string sgn = BytesToString(ReadBytes(SxStream, 3));
  27.     if (sgn != "SxG")
  28.     {
  29.         ErrorMessage = "Bad signature";
  30.         CloseDB();
  31.         return false;
  32.     }            
  33.    
  34.     //версия файла            
  35.     Header.Version = GetVersion((byte)SxStream.ReadByte());
  36.  
  37.     //чтение timestamp
  38.     uint tstamp = ReadUInt(SxStream, RevBO);
  39.     Header.Timestamp = UnixTimeToDateTime(tstamp);
  40.  
  41.     //тип базы
  42.     Header.DBType = (SxGeoType)SxStream.ReadByte();
  43.  
  44.     //кодировка
  45.     Header.DBEncoding = (SxGeoEncoding)SxStream.ReadByte();
  46.  
  47.     //чтение всего остального заголовка
  48.     Header.fbIndexLen = (byte)SxStream.ReadByte(); ////элементов в индексе первых байт (b_idx_len/byte)
  49.     Header.mIndexLen = ReadUShort(SxStream,RevBO); //элементов в основном индексе (m_idx_len/ushort)
  50.     Header.Range = ReadUShort(SxStream,RevBO); //Блоков в одном элементе индекса (range/ushort)
  51.     Header.DiapCount = ReadUInt(SxStream,RevBO); //Количество диапазонов (db_items)
  52.     Header.IdLen = (byte)SxStream.ReadByte(); //Размер ID-блока в байтах (1 для стран, 3 для городов) (id_len)
  53.     Header.MaxRegion = ReadUShort(SxStream,RevBO); //Максимальный размер записи региона - до 64 кб (max_region)
  54.     Header.MaxCity = ReadUShort(SxStream, RevBO); // Максимальный размер записи города - до 64 кб (max_city)
  55.     Header.RegionSize = ReadUInt(SxStream,RevBO); //Размер справочника регионов (region_size)
  56.     Header.CitySize = ReadUInt(SxStream,RevBO); //Размер справочника городов (city_size)
  57.     Header.MaxCountry = ReadUShort(SxStream, RevBO); //Максимальный размер записи страны - до 64 кб (max_country)
  58.     Header.CountrySize = ReadUInt(SxStream,RevBO); //Размер справочника стран (country_size)
  59.     Header.PackSize = ReadUShort(SxStream, RevBO); //Размер описания формата упаковки города/региона/страны (pack_size)*/
  60.    
  61.     //проверка заголовка
  62.     if (!string.IsNullOrEmpty(ErrorMessage))
  63.     {
  64.         CloseDB();
  65.         return false;
  66.     }
  67.     if (Header.fbIndexLen * Header.mIndexLen * Header.Range *
  68.         Header.DiapCount * tstamp * Header.IdLen == 0)
  69.     {
  70.         ErrorMessage = "Wrong file format";
  71.         CloseDB();
  72.         return false;
  73.     }
  74.  
  75.     //вытаскиваем описание формата упаковки
  76.     if (Header.PackSize != 0)
  77.     {
  78.         byte[] packformat = ReadBytes(SxStream, Header.PackSize);
  79.         Header.PackFormat = BytesToString(packformat);
  80.         //разбираем формат упаковки на составляющие структуры
  81.         string[] pack = Header.PackFormat.Split('\0');
  82.         if (pack.Length > 0) Header.pack_country = pack[0];
  83.         if (pack.Length > 1) Header.pack_region = pack[1];
  84.         if (pack.Length > 2) Header.pack_city = pack[2];
  85.     }
  86.     Header.block_len = 3+(uint)Header.IdLen; //длина 1 блока диапазонов
  87.  
  88.     //вытаскиваем индекс первых байт
  89.     fb_idx_arr = new uint[Header.fbIndexLen];
  90.     for (int i = 0; i < Header.fbIndexLen;i++)
  91.     {
  92.         fb_idx_arr[i] = ReadUInt(SxStream, RevBO);
  93.     }
  94.     //вытаскиваем основной индекс
  95.     m_idx_arr = new uint[Header.mIndexLen];
  96.     for (int i = 0; i < Header.mIndexLen; i++)
  97.     {
  98.         m_idx_arr[i] = ReadUInt(SxStream, RevBO);
  99.     }
  100.    
  101.     //читаем базу диапазонов IP,
  102.     //если не установлен режим чтения из файла
  103.     if (DatabaseMode != SxGeoMode.FileMode)
  104.     {
  105.         db_b = new byte[Header.DiapCount * Header.block_len];
  106.         db_b = ReadBytes(SxStream, (int)(Header.DiapCount * Header.block_len));                
  107.     }
  108.  
  109.     //загружаем справочники в память
  110.     if (DatabaseMode == SxGeoMode.MemoryAllMode)
  111.     {
  112.         //регионы
  113.         if (Header.RegionSize > 0)
  114.         {
  115.             regions_db = new byte[Header.RegionSize];
  116.             regions_db = ReadBytes(SxStream, (int)Header.RegionSize);
  117.         }
  118.  
  119.         //города (справочник стран совмещен со справочником городов)
  120.         if (Header.CitySize > 0)
  121.         {
  122.             cities_db = new byte[Header.CitySize];
  123.             cities_db = ReadBytes(SxStream, (int)Header.CitySize);
  124.         }
  125.  
  126.     }
  127.  
  128.     //Начало индекса первых байт
  129.     Header.fb_begin = 40 + (uint)Header.PackSize;
  130.     //начало основного индекса
  131.     Header.midx_begin = Header.fb_begin + (uint)Header.fbIndexLen * 4;
  132.     //начало диапазонов
  133.     Header.db_begin = Header.midx_begin + (uint)Header.mIndexLen * 4;            
  134.     //начало справочника регионов
  135.     Header.regions_begin = Header.db_begin + Header.DiapCount *
  136.         Header.block_len;
  137.     //начало справочника стран
  138.     Header.countries_begin = Header.regions_begin + Header.RegionSize;
  139.     //начало справочника городов
  140.     Header.cites_begin = Header.countries_begin + Header.CountrySize;
  141.    
  142.     IsOpen = true;
  143.     return true;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement