Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
// 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);
        }
Example #6
0
        //Статический метод, сливающий несколько таблиц в одну и возвращающий на нее указатель
        //Рекомендуется поле его вызова сделать сборку мусора
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
 //Конструктор
 public DBFIndex(DBFTable parentTable)
 {
     _items       = null;
     _parent      = parentTable;
     _indexFields = null;
 }
Example #10
0
 public DBFRecord(DBFTable prnt, ushort fieldsCount)
 {
     _parent        = prnt;
     Field          = new DBFField[fieldsCount];
     _bDeletionFlag = 0x22; //" "
 }
Example #11
0
		//Статический метод, сливающий несколько таблиц в одну и возвращающий на нее указатель
		//Рекомендуется поле его вызова сделать сборку мусора
		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;
		}
Example #12
0
		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;
		}
Example #13
0
		//Конструктор
		public DBFIndex( DBFTable parentTable )
		{
			_items = null;
			_parent = parentTable;
			_indexFields = null;
		}
Example #14
0
 public DBFRecord( DBFTable prnt, ushort fieldsCount )
 {
     _parent = prnt;
     Field = new DBFField[fieldsCount];
     _bDeletionFlag = 0x22; //" "
 }
Example #15
0
// 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);
		}