Advertisement
tolikpunkoff

SxToDataSet (debug class)

Sep 30th, 2018
687
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.25 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement