tolikpunkoff

SxToDataSet (debug class)

Sep 30th, 2018
256
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data;
  5. using System.IO;
  6.  
  7. namespace SxGeoReader
  8. {
  9.     public class SxGToDataSet
  10.     {
  11.         public string ErrorMessage { get; private set; }
  12.         public int RecordsCount { get; private set; } //количество записей в таблице
  13.         //public bool RevBO { get; set; }
  14.  
  15.         private DataSet SxDS = null;
  16.         private string TableName = null;
  17.         private string RecordFormat = null;
  18.         private SxGeoDirType TableType;
  19.         private SxGeoUnpack Unpacker = null;
  20.         private SxGeoDB Database = null; //проинициализированная и открытая база данных
  21.  
  22.         private long TableStart = 0; //начало таблицы (в байтах)
  23.         private uint TableSize = 0; //размер таблицы (RegionSize и т.д.)
  24.         private ushort MaxRecordSize = 0; //максимальный размер записи в байтах (MaxRegion и т.д.)
  25.  
  26.  
  27.         public SxGToDataSet(DataSet ds, SxGeoDB db)
  28.         {
  29.             SxDS = ds;
  30.             Database = db;
  31.         }
  32.  
  33.         public void CreateTable(string Table, string Format, SxGeoDirType tabletype)
  34.         {
  35.             TableName = Table;
  36.             RecordFormat = Format;
  37.             TableType = tabletype;
  38.             SxGeoHeader Header = Database.GetHeader();
  39.             Unpacker = new SxGeoUnpack(RecordFormat,
  40.                 Header.DBEncoding);            
  41.  
  42.             //добавляем табличку
  43.             SxDS.Tables.Add(TableName);
  44.  
  45.             Dictionary<string, Type> RecordTypes = Unpacker.GetRecordTypes();
  46.  
  47.             //добавляем колонки
  48.             foreach (string FieldName in RecordTypes.Keys)
  49.             {
  50.                 SxDS.Tables[TableName].Columns.Add(FieldName,
  51.                     RecordTypes[FieldName]);
  52.             }
  53.  
  54.             switch (TableType)
  55.             {
  56.                 case SxGeoDirType.Cites:
  57.                     {
  58.                         TableStart = Header.cites_begin;
  59.                         TableSize = Header.CitySize;
  60.                         MaxRecordSize = Header.MaxCity;
  61.                     }; break;
  62.                 case SxGeoDirType.Countries:
  63.                     {
  64.                         TableStart = Header.countries_begin + 1;//вот хз почему +1, иначе не работает
  65.                         TableSize = Header.CountrySize;
  66.                         MaxRecordSize = Header.MaxCountry;
  67.                     }; break;
  68.                 case SxGeoDirType.Regions:
  69.                     {
  70.                         TableStart = Header.regions_begin+1;//вот хз почему +1, иначе не работает
  71.                         TableSize = Header.RegionSize;
  72.                         MaxRecordSize = Header.MaxRegion;
  73.                     }; break;
  74.             }
  75.         }
  76.  
  77.         public bool FillTable()
  78.         {            
  79.             //становимся на начало таблицы
  80.             if (!Database.Seek(TableStart, SeekOrigin.Begin))
  81.             {
  82.                 ErrorMessage = Database.ErrorMessage;
  83.                 return false;
  84.             }
  85.  
  86.             long Readed = 0;
  87.             int NextRead = MaxRecordSize;
  88.  
  89.             while (Readed < TableSize-1)
  90.             {
  91.                 //читаем запись
  92.                 byte[] buf = Database.ReadBytes(NextRead);
  93.                 if (buf == null)
  94.                 {
  95.                     ErrorMessage = Database.ErrorMessage;
  96.                     return false;
  97.                 }
  98.  
  99.                 //распаковываем запись
  100.                 int RealLength = 0;
  101.                 Dictionary<string, object> Record = Unpacker.Unpack(buf,
  102.                     out RealLength);
  103.  
  104.                 //кладем ее в таблицу DataSet
  105.                 DataRow dr = SxDS.Tables[TableName].NewRow();
  106.  
  107.                 foreach (string FieldName in Record.Keys)
  108.                 {
  109.                     dr[FieldName] = Record[FieldName];
  110.                 }
  111.  
  112.                 SxDS.Tables[TableName].Rows.Add(dr);
  113.  
  114.                 //Сохраняем количество фактических байт записи
  115.                 Readed += RealLength;
  116.                 //Отступаем в потоке назад
  117.                 long backstep = 0;
  118.                 if (TableStart + Readed + MaxRecordSize > Database.FileSize)
  119.                 {
  120.                     //если на чтение последних записей файла не хватило
  121.                     //максимальной длины записи                    
  122.                     backstep = -NextRead + RealLength;
  123.                     NextRead = (int)(Database.FileSize - TableStart - Readed);                    
  124.                     //break;
  125.                 }
  126.                 else
  127.                 {
  128.                     backstep = -NextRead + RealLength;
  129.                 }
  130.                
  131.                 Database.Seek(backstep, SeekOrigin.Current);
  132.                
  133.                 //добавляем счетчик записей
  134.                 RecordsCount++;
  135.             }
  136.             return true;
  137.         }
  138.  
  139.     }
  140. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×