22#include <tqdatetime.h>
23#include <tqdatastream.h>
26#include <tqstringlist.h>
31DBase::DBase(): m_recordCount( 0 )
33 fields.setAutoDelete(
true );
54bool DBase::load(
const TQString& filename )
57 m_file.setName( filename );
58 if( !m_file.open(IO_ReadOnly) )
61 m_stream.setDevice( &m_file );
62 m_stream.setByteOrder( TQDataStream::LittleEndian );
64 unsigned filesize = m_file.size();
69 m_version = ver & 0x7f;
77 m_stream >> y >> m >> d;
79 m_lastUpdate.setYMD( y+1900, m, d );
82 if( !m_lastUpdate.isValid() )
return false;
87 m_recordCount = norec;
90 TQ_UINT16 header_length;
91 m_stream >> header_length;
92 m_headerLength = header_length;
95 TQ_UINT16 record_length;
96 m_stream >> record_length;
97 m_recordLength = record_length;
101 for (
int foo = 0; foo < 20; ++foo)
105 if( filesize < m_headerLength + m_recordLength * m_recordCount )
120 for(
unsigned i = 1; i < m_headerLength/32; ++i )
122 DBaseField* field =
new DBaseField;
125 TQ_UINT8 colname[12];
126 for (
int j = 0; j < 11; ++j)
127 m_stream >> colname[j];
129 field->name = TQString( (
const char*) &colname[0] );
136 case 'C': field->type = DBaseField::Character;
break;
137 case 'N': field->type = DBaseField::Numeric;
break;
138 case 'D': field->type = DBaseField::Date;
break;
139 case 'M': field->type = DBaseField::Memo;
break;
140 case 'L': field->type = DBaseField::Logical;
break;
141 default: field->type = DBaseField::Unknown;
break;
151 field->length = colsize;
155 m_stream >> decimals;
156 field->decimals = decimals;
160 for (
int foo = 0; foo < 14; ++foo )
164 fields.append( field );
168 m_stream.device()->at( m_headerLength );
173TQStringList DBase::readRecord(
unsigned recno )
178 if( recno >= m_recordCount )
180 for(
unsigned i=0; i<fields.count(); i++)
186 unsigned filepos = m_headerLength + recno * m_recordLength;
187 m_stream.device()->at( filepos );
192 m_stream >> delmarker;
193 if( delmarker == 0x2a )
197 for(
unsigned i=0; i<fields.count(); i++ )
198 switch( fields.at(i)->type )
201 case DBaseField::Numeric:
202 case DBaseField::Character:
206 for(
unsigned j=0; j<fields.at(i)->length; j++ )
207 { m_stream >> ch; str += TQChar(ch); }
208 result.append( str );
212 case DBaseField::Logical:
218 case 'Y':
case 'y':
case 'T':
case 't': result.append(
"True" );
break;
219 case 'N':
case 'n':
case 'F':
case 'f': result.append(
"False" );
break;
220 default: result.append(
"" );
break;
226 case DBaseField::Date:
230 for(
unsigned j=0; j<fields.at(i)->length; j++ )
231 { m_stream >> ch; str += TQChar(ch); }
232 str.insert( 6,
'-' );
233 str.insert( 4,
'-' );
234 result.append( str );
238 case DBaseField::Unknown:
239 case DBaseField::Memo:
250 if( m_file.isOpen() ) m_file.close();