public override string ToString() { DBFTable up = _parent.Parent; Encoding encoding = Encoding.GetEncoding(up.Options.dwCodePage); switch (_descriptor.bFieldType) { case (byte)'C': return(encoding.GetString(_value).Trim()); case (byte)'D': string ds = encoding.GetString(_value).Trim(); return(ds.Substring(0, 4) + "/" + ds.Substring(4, 2) + "/" + ds.Substring(6, 2)); case (byte)'N': return(encoding.GetString(_value).Trim()); case (byte)'F': return(encoding.GetString(_value).Trim()); case (byte)'L': byte c = _value[0]; if ((c == (byte)'t') || (c == (byte)'T') || (c == (byte)'y') || (c == (byte)'Y')) { return("true"); } if ((c == (byte)'f') || (c == (byte)'F') || (c == (byte)'n') || (c == (byte)'N')) { return("false"); } return("undefined"); } return(string.Empty); }
public double ToDouble() { DBFTable up = _parent.Parent; if ((_descriptor.bFieldType != (byte)'N') && (_descriptor.bFieldType != (byte)'F')) { return(double.NaN); } Encoding encoding = Encoding.GetEncoding(up.Options.dwCodePage); string s = encoding.GetString(_value).Trim(); return(Convert.ToDouble(s)); }
public bool Set(String strValue) { DBFTable up = _parent.Parent; Encoding encoding = Encoding.GetEncoding(up.Options.dwCodePage); var unicodeEncoding = new UnicodeEncoding(); if (_descriptor.bFieldType != (byte)'C') { return(false); } string s = strValue.Substring(0, _descriptor.bFieldSize); byte[] charArray = unicodeEncoding.GetBytes(s); Value = Encoding.Convert(unicodeEncoding, encoding, charArray); return(true); }
public DBFDate ToDate() { DBFDate date; DBFTable up = _parent.Parent; if (_descriptor.bFieldType != (byte)'D') { return(new DBFDate(0, 0, 0)); } Encoding encoding = Encoding.GetEncoding(up.Options.dwCodePage); string s = encoding.GetString(_value); date.Year = Convert.ToUInt16(s.Substring(0, 4)); date.Month = Convert.ToUInt16(s.Substring(4, 2)); date.Day = Convert.ToUInt16(s.Substring(6, 2)); return(date); }
// ReSharper restore InconsistentNaming //Конструктор public DBFHeader(DBFTable parent) { Parent = parent; bFlags = 0; bYear = 0; bMonth = 0; bDay = 0; dwRecordsCount = 0; wHeaderSize = 0; wRecordSize = 0; wReserved = 0; bTransactionFlags = 0; bEncryption = 0; baUseUserEnvironment = new byte[12]; bUseIndex = 0; bCodePage = 0; wReserved2 = 0; Field = new DBFFieldDescriptor[0];// (this); }
//Статический метод, сливающий несколько таблиц в одну и возвращающий на нее указатель //Рекомендуется поле его вызова сделать сборку мусора public static DBFTable Merge(DBFTable[] tables) { int j, k; //j - номер текущей таблице //k - номер текущей записи в текущей таблице //Проверка на наличие таблиц для слияния if (tables.Length == 0) { return(null); } //проверка на совпадение форматов таблиц //... можно вставить потом //... НУЖНО вставить int recCountSummary = tables.Sum(dbfTable => dbfTable.Record.Length); //Создадим новую таблицу var dbf = new DBFTable("") { //и зададим её заголовок Header = tables[0].Header }; dbf.Header.dwRecordsCount = (uint)recCountSummary; dbf.Header.Parent = dbf; //и прочие параметры dbf.Options = tables[0].Options; dbf.Record = new DBFRecord[recCountSummary]; //Зададим индекс dbf.Index = new DBFIndex(dbf); //Заполняем записи результирующей таблицы int i = 0; //i - номер записи в новой таблице for (j = 0; j < tables.Length; j++) { for (k = 0; k < tables[j].Record.Length; k++) { dbf.Record[i] = new DBFRecord(dbf, (ushort)dbf.Header.Field.Length); if (tables[j].Record[k].Deleted) { dbf.Record[i].Delete(); } else { dbf.Record[i].Restore(); } dbf.Record[i].Field = new DBFField[dbf.Header.Field.Length]; int l; //l - номер текущего поля в текущей записи текущей таблицы for (l = 0; l < dbf.Header.Field.Length; l++) { dbf.Record[i].Field[l] = new DBFField(dbf.Header.Field[l], dbf.Record[i]) { Value = tables[j].Record[k].Field[l].Value }; } i++; } } return(dbf); }
public DBFTable Rebuild(String[] fields) { ushort i, j; uint k; String name; if (fields == null) { return(this); } //Проверка на идентичность запрошенной и существующей структуры таблицы #region Проверка на идентичность запрошенной и существующей структуры таблицы Encoding encoding = Encoding.GetEncoding(Options.dwCodePage); bool bAllEqual = true; for (i = 0; i < fields.Length; i++) { name = encoding.GetString(Header.Field[i].strName).ToUpper(); name = name.Substring(0, name.IndexOf('\0')); fields[i] = fields[i].Trim().ToUpper(); if (name.CompareTo(fields[i]) != 0) { bAllEqual = false; break; } } if (bAllEqual) { return(this); } #endregion //Создание индекса столбцов #region Создание индекса столбцов var newColumns = new ushort[fields.Length]; for (i = 0; i < newColumns.Length; i++) { for (j = 0; j < Header.Field.Length; j++) { name = encoding.GetString(Header.Field[j].strName).ToUpper(); if (name.CompareTo(fields[i]) == 0) { newColumns[i] = j; break; } } } #endregion //Генерация новой таблицы var dbf = new DBFTable(""); //Генерация нового заголовка таблицы #region Генерация нового заголовка таблицы dbf.Header = new DBFHeader(dbf) { bFlags = Header.bFlags, bYear = Header.bYear, bMonth = Header.bMonth, bDay = Header.bDay, dwRecordsCount = Header.dwRecordsCount, wHeaderSize = (ushort)(33 + 32 * fields.Length) }; ushort newRecSize = 1; for (i = 0; i < fields.Length; i++) { newRecSize += Header.Field[newColumns[i]].bFieldSize; newRecSize += Header.Field[newColumns[i]].bFractionalSize; } dbf.Header.wRecordSize = newRecSize; //размер записи dbf.Header.wReserved = Header.wReserved; //зарезервировано dbf.Header.bTransactionFlags = Header.bTransactionFlags; //флаги передачи dbf.Header.bEncryption = Header.bEncryption; //шифрование dbf.Header.baUseUserEnvironment = Header.baUseUserEnvironment; //пользовательское окружение dbf.Header.bUseIndex = Header.bUseIndex; //использование индекса dbf.Header.bCodePage = Header.bCodePage; //кодировка dbf.Header.wReserved2 = Header.wReserved2; //зарезервировано dbf.Header.Field = new DBFFieldDescriptor[fields.Length]; for (i = 0; i < dbf.Header.Field.Length; i++) { dbf.Header.Field[i] = new DBFFieldDescriptor(dbf.Header, i) { strName = Header.Field[newColumns[i]].strName, bFieldType = Header.Field[newColumns[i]].bFieldType, dwAddress = Header.Field[newColumns[i]].dwAddress, bFieldSize = Header.Field[newColumns[i]].bFieldSize, bFractionalSize = Header.Field[newColumns[i]].bFractionalSize, wReserved = Header.Field[newColumns[i]].wReserved, bWorkAreaID = Header.Field[newColumns[i]].bWorkAreaID, wMutiUser = Header.Field[newColumns[i]].wMutiUser, bSetFields = Header.Field[newColumns[i]].bSetFields, baReserved = Header.Field[newColumns[i]].baReserved, bMDXIDIncluded = Header.Field[newColumns[i]].bMDXIDIncluded }; } #endregion //Заполнение записей новой таблицы #region Заполнение записей новой таблицы dbf.Record = new DBFRecord[dbf.Header.dwRecordsCount]; for (k = 0; k < dbf.Header.dwRecordsCount; k++) { dbf.Record[k] = new DBFRecord(dbf, (ushort)dbf.Header.Field.Length); if (Record[k].Deleted) { dbf.Record[k].Delete(); } else { dbf.Record[k].Restore(); } dbf.Record[k].Field = new DBFField[dbf.Header.Field.Length]; for (i = 0; i < dbf.Header.Field.Length; i++) { dbf.Record[k].Field[i] = new DBFField(dbf.Header.Field[i], dbf.Record[k]) { Value = Record[k].Field[newColumns[i]].Value }; } } #endregion //Создание нового индекса таблицы dbf.Index = new DBFIndex(this); //Задание управляющих флагов dbf.Options = Options; return(dbf); }
public bool Create(ushort[] fields) { uint i; if (fields == null) { return(false); } DBFTable parent = _parent; if (fields.Any(m => m > parent.Header.Field.Length)) { return(false); } Clear(); _indexFields = fields; _items = new DBFIndexItem[_parent.Record.Length]; var tempIndex = new DBFIndexItem[_parent.Record.Length]; for (i = 0; i < _parent.Record.Length; i++) { _items[i].RecNum = i; string sKey = string.Empty; // ReSharper disable LoopCanBeConvertedToQuery foreach (int m in fields) { sKey = sKey + _parent.Record[i].Field[m]; } // ReSharper restore LoopCanBeConvertedToQuery // ReSharper disable ConvertIfStatementToConditionalTernaryExpression if (DBFIndexItem.ItemHandler == null) { _items[i].Key = sKey; } // ReSharper restore ConvertIfStatementToConditionalTernaryExpression else { _items[i].Key = DBFIndexItem.ItemHandler(sKey); //""; } } //первичная сортировка for (i = 0; i < _items.Length - 1; i += 2) { if (_items[i].Key == _items[i + 1].Key) { tempIndex[i] = _items[i]; tempIndex[i + 1] = _items[i + 1]; } else { tempIndex[i] = _items[i + 1]; tempIndex[i + 1] = _items[i]; } } if (i < _items.Length) { tempIndex[i] = _items[i]; } //инициализация DBFIndexItem[] pa = tempIndex; DBFIndexItem[] pb = _items; uint blockSize = 2; //основная сортировка while (blockSize < _items.Length) //perform while block size are less then array size { i = 0; //setting base itemses for left block uint k = 0; while (i < _items.Length) { uint j; if ((i + blockSize) >= _items.Length) { for (j = 0; j < (_items.Length - i); j++) { pb[k + j] = pa[i + j]; } k += (uint)(_items.Length - i); break; } uint lSize = blockSize; uint rSize; if ((i + blockSize + blockSize) < _items.Length) { rSize = blockSize; } else { rSize = (uint)(_items.Length - i - blockSize); //set length of right block } j = i + lSize; //set base items for right block while ((lSize > 0) && (rSize > 0)) //starting merging of blocks { if (pa[i].Key.CompareTo(pa[j].Key) <= 0) { pb[k] = pa[i]; i++; lSize--; } else { pb[k] = pa[j]; j++; rSize--; } k++; } if (rSize == 0) { for (uint t = 0; t < lSize; t++) { pb[k + t] = pa[i + t]; } i += lSize; k += lSize; } if (lSize == 0) { for (uint t = 0; t < rSize; t++) { pb[k + t] = pa[j + t]; } j += rSize; k += rSize; } i += blockSize; } blockSize *= 2; //double size of block var cb = pb; pb = pa; pa = cb; //switch input and output arrays } //if( _items != pa ) _items = pa; return(true); }
//Конструктор public DBFIndex(DBFTable parentTable) { _items = null; _parent = parentTable; _indexFields = null; }
public DBFRecord(DBFTable prnt, ushort fieldsCount) { _parent = prnt; Field = new DBFField[fieldsCount]; _bDeletionFlag = 0x22; //" " }
//Статический метод, сливающий несколько таблиц в одну и возвращающий на нее указатель //Рекомендуется поле его вызова сделать сборку мусора public static DBFTable Merge( DBFTable[] tables ) { int j, k; //j - номер текущей таблице //k - номер текущей записи в текущей таблице //Проверка на наличие таблиц для слияния if( tables.Length == 0 ) return null; //проверка на совпадение форматов таблиц //... можно вставить потом //... НУЖНО вставить int recCountSummary = tables.Sum(dbfTable => dbfTable.Record.Length); //Создадим новую таблицу var dbf = new DBFTable("") { //и зададим её заголовок Header = tables[0].Header }; dbf.Header.dwRecordsCount = (uint)recCountSummary; dbf.Header.Parent = dbf; //и прочие параметры dbf.Options = tables[0].Options; dbf.Record = new DBFRecord[recCountSummary]; //Зададим индекс dbf.Index = new DBFIndex(dbf); //Заполняем записи результирующей таблицы int i = 0; //i - номер записи в новой таблице for( j = 0; j < tables.Length; j++ ) for( k = 0; k < tables[j].Record.Length; k++ ) { dbf.Record[i] = new DBFRecord(dbf, (ushort)dbf.Header.Field.Length); if( tables[j].Record[k].Deleted ) dbf.Record[i].Delete(); else dbf.Record[i].Restore(); dbf.Record[i].Field = new DBFField[dbf.Header.Field.Length]; int l; //l - номер текущего поля в текущей записи текущей таблицы for( l = 0; l < dbf.Header.Field.Length; l++ ) { dbf.Record[i].Field[l] = new DBFField(dbf.Header.Field[l], dbf.Record[i]) {Value = tables[j].Record[k].Field[l].Value}; } i++; } return dbf; }
public DBFTable Rebuild( String[] fields ) { ushort i, j; uint k; String name; if( fields == null ) return this; //Проверка на идентичность запрошенной и существующей структуры таблицы #region Проверка на идентичность запрошенной и существующей структуры таблицы Encoding encoding = Encoding.GetEncoding(Options.dwCodePage); bool bAllEqual = true; for( i = 0; i < fields.Length; i++ ) { name = encoding.GetString(Header.Field[i].strName).ToUpper(); name = name.Substring(0, name.IndexOf('\0')); fields[i] = fields[i].Trim().ToUpper(); if( name.CompareTo(fields[i]) != 0 ) { bAllEqual = false; break; } } if( bAllEqual ) return this; #endregion //Создание индекса столбцов #region Создание индекса столбцов var newColumns = new ushort[fields.Length]; for( i = 0; i < newColumns.Length; i++ ) for( j = 0; j < Header.Field.Length; j++ ) { name = encoding.GetString(Header.Field[j].strName).ToUpper(); if( name.CompareTo(fields[i]) == 0 ) { newColumns[i] = j; break; } } #endregion //Генерация новой таблицы var dbf = new DBFTable(""); //Генерация нового заголовка таблицы #region Генерация нового заголовка таблицы dbf.Header = new DBFHeader(dbf) { bFlags = Header.bFlags, bYear = Header.bYear, bMonth = Header.bMonth, bDay = Header.bDay, dwRecordsCount = Header.dwRecordsCount, wHeaderSize = (ushort) (33 + 32*fields.Length) }; ushort newRecSize = 1; for( i = 0; i < fields.Length; i++ ) { newRecSize += Header.Field[newColumns[i]].bFieldSize; newRecSize += Header.Field[newColumns[i]].bFractionalSize; } dbf.Header.wRecordSize = newRecSize; //размер записи dbf.Header.wReserved = Header.wReserved; //зарезервировано dbf.Header.bTransactionFlags = Header.bTransactionFlags; //флаги передачи dbf.Header.bEncryption = Header.bEncryption; //шифрование dbf.Header.baUseUserEnvironment = Header.baUseUserEnvironment; //пользовательское окружение dbf.Header.bUseIndex = Header.bUseIndex; //использование индекса dbf.Header.bCodePage = Header.bCodePage; //кодировка dbf.Header.wReserved2 = Header.wReserved2; //зарезервировано dbf.Header.Field = new DBFFieldDescriptor[fields.Length]; for( i = 0; i < dbf.Header.Field.Length; i++ ) { dbf.Header.Field[i] = new DBFFieldDescriptor(dbf.Header, i) { strName = Header.Field[newColumns[i]].strName, bFieldType = Header.Field[newColumns[i]].bFieldType, dwAddress = Header.Field[newColumns[i]].dwAddress, bFieldSize = Header.Field[newColumns[i]].bFieldSize, bFractionalSize = Header.Field[newColumns[i]].bFractionalSize, wReserved = Header.Field[newColumns[i]].wReserved, bWorkAreaID = Header.Field[newColumns[i]].bWorkAreaID, wMutiUser = Header.Field[newColumns[i]].wMutiUser, bSetFields = Header.Field[newColumns[i]].bSetFields, baReserved = Header.Field[newColumns[i]].baReserved, bMDXIDIncluded = Header.Field[newColumns[i]].bMDXIDIncluded }; } #endregion //Заполнение записей новой таблицы #region Заполнение записей новой таблицы dbf.Record = new DBFRecord[dbf.Header.dwRecordsCount]; for (k = 0; k < dbf.Header.dwRecordsCount; k++) { dbf.Record[k] = new DBFRecord(dbf, (ushort)dbf.Header.Field.Length); if( Record[k].Deleted ) dbf.Record[k].Delete(); else dbf.Record[k].Restore(); dbf.Record[k].Field = new DBFField[dbf.Header.Field.Length]; for (i = 0; i < dbf.Header.Field.Length; i++) { dbf.Record[k].Field[i] = new DBFField(dbf.Header.Field[i], dbf.Record[k]) {Value = Record[k].Field[newColumns[i]].Value}; } } #endregion //Создание нового индекса таблицы dbf.Index = new DBFIndex(this); //Задание управляющих флагов dbf.Options = Options; return dbf; }
//Конструктор public DBFIndex( DBFTable parentTable ) { _items = null; _parent = parentTable; _indexFields = null; }
public DBFRecord( DBFTable prnt, ushort fieldsCount ) { _parent = prnt; Field = new DBFField[fieldsCount]; _bDeletionFlag = 0x22; //" " }
// ReSharper restore InconsistentNaming //Конструктор public DBFHeader( DBFTable parent ) { Parent = parent; bFlags = 0; bYear = 0; bMonth = 0; bDay = 0; dwRecordsCount = 0; wHeaderSize = 0; wRecordSize = 0; wReserved = 0; bTransactionFlags = 0; bEncryption = 0; baUseUserEnvironment = new byte[12]; bUseIndex = 0; bCodePage = 0; wReserved2 = 0; Field = new DBFFieldDescriptor[0];// (this); }