00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __XB_DBF_H__
00042 #define __XB_DBF_H__
00043
00044 #ifdef __GNU LesserG__
00045 #pragma interface
00046 #endif
00047
00048 #ifdef __WIN32__
00049 #include <xbase64/xbwincfg.h>
00050 #else
00051 #include <xbase64/xbconfig.h>
00052 #endif
00053
00054 #include <xbase64/xbtypes.h>
00055 #include <xbase64/xbdate.h>
00056 #include <xbase64/xbfile.h>
00057
00058 #include <iostream>
00059 #include <stdio.h>
00060
00064 #if defined(XB_INDEX_ANY)
00065 class XBDLLEXPORT xbIndex;
00066 class XBDLLEXPORT xbNdx;
00067 class XBDLLEXPORT xbNtx;
00068 #endif
00069
00070
00071
00072
00073 #define XB_CHAR_FLD 'C'
00074 #define XB_LOGICAL_FLD 'L'
00075 #define XB_NUMERIC_FLD 'N'
00076 #define XB_DATE_FLD 'D'
00077 #define XB_MEMO_FLD 'M'
00078 #define XB_FLOAT_FLD 'F'
00079
00080
00081
00082
00083 #define XB_CLOSED 0
00084 #define XB_OPEN 1
00085 #define XB_UPDATED 2
00086
00087
00088
00089
00090 #define XB_OVERLAY 1
00091 #define XB_DONTOVERLAY 0
00092
00093 #define XB_CHAREOF '\x1A'
00094 #define XB_CHARHDR '\x0D'
00095
00097
00130 struct XBDLLEXPORT xbSchema {
00131 char FieldName[11];
00132 char Type;
00133
00134
00135 unsigned char FieldLen;
00136 unsigned char NoOfDecs;
00137 };
00138
00140
00143 struct XBDLLEXPORT xbSchemaRec {
00144 char FieldName[11];
00145 char Type;
00146 char *Address;
00147
00148
00149 unsigned char FieldLen;
00150 unsigned char NoOfDecs;
00151 char *Address2;
00152 char *fp;
00153
00154 xbShort LongFieldLen;
00155 };
00156
00158
00161 struct XBDLLEXPORT xbIxList {
00162 xbIxList * NextIx;
00163 xbString IxName;
00164 #if defined(XB_INDEX_ANY)
00165 xbIndex * index;
00166 xbShort Unique;
00167 xbShort KeyUpdated;
00168 #endif
00169 };
00170
00172
00176 #ifdef XB_MEMO_FIELDS
00177 struct XBDLLEXPORT xbMH{
00178 xbLong NextBlock;
00179 char FileName[8];
00180 char Version;
00181 xbShort BlockSize;
00182 };
00183 #endif
00184
00186
00190 class XBDLLEXPORT xbDbf : protected xbFile{
00191
00192 public:
00193 xbDbf( xbXBase * );
00194 virtual ~xbDbf();
00195
00196 xbXBase *xbase;
00197
00198
00199 #if defined(XB_INDEX_ANY)
00200 xbShort AddIndexToIxList(xbIndex *, const char *IndexName);
00201 xbShort RemoveIndexFromIxList( xbIndex * );
00202 #endif
00203 xbShort AppendRecord();
00204 xbShort BlankRecord();
00205 xbShort CloseDatabase( xbBool deleteIndexes = 0 );
00206 xbShort CopyDbfStructure( const char *, xbShort );
00207 xbShort CreateDatabase( const char * Name, xbSchema *, xbShort Overlay );
00209
00211 xbShort DeleteAllRecords() { return DeleteAll(0); }
00212 xbShort DeleteRecord();
00213 #ifdef XBASE_DEBUG
00214 xbShort DumpHeader( xbShort );
00215 #endif
00216 xbShort DumpRecord( xbULong );
00218
00220 xbLong FieldCount() { return NoOfFields; }
00222
00224 const xbString& GetDbfName() { return GetFileName(); }
00226
00228 xbShort GetDbfStatus() { return DbfStatus; }
00229 xbShort GetFirstRecord();
00230 xbShort GetLastRecord();
00231 xbShort GetNextRecord();
00232 xbShort GetPrevRecord();
00234
00236 xbLong GetCurRecNo() { return CurRec; }
00237 xbShort GetRecord( xbULong );
00239
00241 char * GetRecordBuf() { return RecBuf; }
00243
00245 xbShort GetRecordLen() { return RecordLen; }
00246 xbShort NameSuffixMissing( xbShort, const char * );
00247 xbLong GetRecCnt() { return NoOfRecords(); }
00248 xbLong NoOfRecords();
00249 xbLong PhysicalNoOfRecords();
00250 xbShort OpenDatabase( const char * );
00251 xbShort PackDatabase(xbShort LockWaitOption,
00252 void (*packStatusFunc)(xbLong itemNum, xbLong numItems) = 0,
00253 void (*indexStatusFunc)(xbLong itemNum, xbLong numItems) = 0);
00254 xbShort PutRecord();
00255 xbShort PutRecord(xbULong);
00256 xbShort RebuildAllIndices(
00257 void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0);
00258 xbShort RecordDeleted();
00260
00262 void ResetNoOfRecs() { NoOfRecs = 0L; }
00263 xbShort SetVersion( xbShort );
00265
00267 xbShort UndeleteAllRecords() { return DeleteAll(1); }
00268 xbShort UndeleteRecord();
00269 xbShort Zap( xbShort );
00270
00271
00272 const char *GetField(xbShort FieldNo) const;
00273 const char *GetField(const char *Name) const;
00274 xbShort GetField( xbShort FieldNo, char *Buf) const;
00275 xbShort GetRawField( xbShort FieldNo, char *Buf) const;
00276 xbShort GetField( xbShort FieldNo, char *Buf, xbShort RecBufSw) const;
00277 xbShort GetField( const char *Name, char *Buf) const;
00278 xbShort GetRawField(const char *Name, char *Buf) const;
00279 xbShort GetField( const char *Name, char *Buf, xbShort RecBufSw) const;
00280 xbShort GetField(xbShort FieldNo, xbString&, xbShort RecBufSw ) const;
00281 xbShort GetFieldDecimal( xbShort );
00282 xbShort GetFieldLen( xbShort );
00283 char * GetFieldName( xbShort );
00284 xbShort GetFieldNo( const char * FieldName ) const;
00285 char GetFieldType( xbShort FieldNo ) const;
00286 xbShort GetLogicalField( xbShort FieldNo );
00287 xbShort GetLogicalField( const char * FieldName );
00288 char * GetStringField( xbShort FieldNo );
00289 char * GetStringField( const char * FieldName );
00290 xbShort PutField( xbShort, const char * );
00291 xbShort PutRawField( xbShort FieldNo, const char *buf );
00292 xbShort PutField( const char *Name, const char *buf);
00293 xbShort PutRawField( const char *Name, const char *buf );
00294 xbShort ValidLogicalData( const char * );
00295 xbShort ValidNumericData( const char * );
00296
00297 xbLong GetLongField( const char *FieldName) const;
00298 xbLong GetLongField( const xbShort FieldNo) const;
00299 xbShort PutLongField( const xbShort, const xbLong );
00300 xbShort PutLongField( const char *, const xbLong);
00301
00302 xbFloat GetFloatField( const char * FieldName );
00303 xbFloat GetFloatField( xbShort FieldNo );
00304 xbShort PutFloatField( const char *, const xbFloat);
00305 xbShort PutFloatField( const xbShort, const xbFloat);
00306
00307 xbDouble GetDoubleField( const char *);
00308 xbDouble GetDoubleField( xbShort, xbShort RecBufSw = 0);
00309 xbShort PutDoubleField( const char *, xbDouble);
00310 xbShort PutDoubleField( const xbShort, xbDouble);
00311
00312 #ifdef XB_LOCKING_ON
00313 xbShort GetLockMode() { return LockMode; }
00314 xbShort SetLockMode( xbShort );
00315
00316
00317
00318 int GetDbfFileNo() { return fileno( fp ); }
00319 int GetMemoFileNo() { return fileno( mfp ); }
00320
00321 #ifdef XB_MEMO_FIELDS
00322
00323 #endif
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 #ifndef HAVE_FCNTL
00346 xbShort UnixToDosLockCommand( xbShort WaitOption,
00347 xbShort LockType ) const;
00348 #endif
00349
00350 #else
00351 xbShort LockDatabase( xbShort, xbShort, xbLong )
00352 { return XB_NO_ERROR; }
00353 xbShort ExclusiveLock( xbShort ) { return XB_NO_ERROR; };
00354 xbShort ExclusiveUnlock() { return XB_NO_ERROR; };
00355 #endif
00356
00358
00360 void AutoLockOn() { AutoLock = 1; }
00362
00364 void AutoLockOff() { AutoLock = 0; }
00366
00368 xbShort GetAutoLock() { return AutoLock; }
00369
00370 #ifdef XB_MEMO_FIELDS
00371 xbShort GetMemoField( xbShort FieldNo, xbLong len,
00372 char * Buf, xbShort LockOption );
00373 xbLong GetMemoFieldLen( xbShort FieldNo );
00374 xbShort GetFPTField( xbShort FieldNo, xbLong len,
00375 char * Buf, xbShort LockOption );
00376 xbLong GetFPTFieldLen( xbShort FieldNo );
00377 xbShort UpdateMemoData( xbShort FieldNo, xbLong len,
00378 const char * Buf, xbShort LockOption );
00379 xbShort MemoFieldExists( xbShort FieldNo ) const;
00380 xbShort LockMemoFile( xbShort WaitOption, xbShort LockType );
00381
00382 xbShort MemoFieldsPresent() const;
00383 xbLong CalcLastDataBlock();
00384 xbShort FindBlockSetInChain( xbLong BlocksNeeded, xbLong
00385 LastDataBlock, xbLong & Location, xbLong &PreviousNode );
00386 xbShort GetBlockSetFromChain( xbLong BlocksNeeded, xbLong
00387 Location, xbLong PreviousNode );
00388 xbString & GetDbtName() { return MemofileName; }
00389
00390 #ifdef XBASE_DEBUG
00391 xbShort DumpMemoFreeChain();
00392 void DumpMemoHeader() const;
00393 void DumpMemoBlock() const;
00394 #endif
00395 #endif
00396
00398
00406 void RealDeleteOn() { RealDelete = 1; if(fp) ReadHeader(1); }
00409 void RealDeleteOff() { RealDelete = 0; if(fp) ReadHeader(1); }
00411
00415 xbShort GetRealDelete() { return RealDelete; }
00416
00417 #if defined(XB_INDEX_ANY)
00418 xbShort IndexCount();
00419 xbIndex *GetIndex(xbShort indexNum);
00420 #endif
00421
00422 void Flush();
00423 virtual const char* GetExtWithDot( bool lower );
00424
00425 private:
00426
00427 xbShort DeleteAll( xbShort );
00428 void InitVars();
00429 xbShort PackDatafiles(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0);
00430 xbShort ReadHeader( xbShort );
00431 xbShort WriteHeader( xbShort );
00432
00433 #ifdef XB_MEMO_FIELDS
00434 xbShort AddMemoData( xbShort FieldNo, xbLong Len, const char * Buf );
00435 xbShort CreateMemoFile();
00436 xbShort DeleteMemoField( xbShort FieldNo );
00437 xbShort GetDbtHeader( xbShort Option );
00438 xbShort GetMemoBlockSize() { return MemoHeader.BlockSize; }
00439 xbShort OpenMemoFile();
00440 xbShort OpenFPTFile();
00441 xbShort PutMemoData( xbLong StartBlock, xbLong BlocksNeeded,
00442 xbLong Len, const char * Buf );
00443 xbShort ReadMemoBlock( xbLong BlockNo, xbShort Option);
00444 xbShort SetMemoBlockSize( xbShort );
00445 xbShort UpdateHeadNextNode() const;
00446 xbShort WriteMemoBlock( xbLong BlockNo, xbShort Option );
00447 xbShort IsType3Dbt() const { return( Version==(char)0x83 ? 1:0 ); }
00448 xbShort IsType4Dbt() const
00449 {return (( Version==(char)0x8B || Version==(char)0x8E ) ? 1:0 );}
00450 xbShort CreateUniqueDbfName( xbString &, xbString & );
00451 #endif
00452
00453
00454
00455 xbShort XFV;
00456 xbShort NoOfFields;
00457 char DbfStatus;
00458
00459
00460 FILE *fp;
00461 xbSchemaRec *SchemaPtr;
00462 char *RecBuf;
00463 char *RecBuf2;
00464
00465 #ifdef XB_MEMO_FIELDS
00466 xbString MemofileName;
00467 FILE *mfp;
00468 void *mbb;
00469 xbMH MemoHeader;
00470 xbShort mfield1;
00471 xbShort MStartPos;
00472 xbLong MFieldLen;
00473 xbLong NextFreeBlock;
00474 xbLong FreeBlockCnt;
00475 xbLong MNextBlockNo;
00476 xbLong MNoOfFreeBlocks;
00477 xbLong CurMemoBlockNo;
00478 #endif
00479
00480
00481
00482 char Version;
00483 char UpdateYY;
00484 char UpdateMM;
00485 char UpdateDD;
00486
00487
00488
00489
00490 xbULong NoOfRecs;
00491 xbUShort HeaderLen;
00492 xbUShort RecordLen;
00493
00494
00495 xbULong FirstFreeRec;
00496 xbULong RealNumRecs;
00497
00498
00499
00500 xbIxList * NdxList;
00501 xbIxList * FreeIxList;
00502 xbULong CurRec;
00503 xbShort AutoLock;
00504
00505
00506 xbShort RealDelete;
00507
00508
00509 #ifdef XB_LOCKING_ON
00510 FILE *xblfh;
00511 xbShort LockMode;
00512 xbString lfn;
00513 xbShort TableLockCnt;
00514 xbShort IndexLockCnt;
00515
00516 #ifdef XB_MEMO_FIELDS
00517 xbShort MemoLockCnt;
00518 #endif
00519
00520
00521 xbShort CurLockType;
00522 xbShort CurLockCount;
00523 xbULong CurLockedRecNo;
00524 xbShort CurRecLockType;
00525 xbShort CurRecLockCount;
00526 xbShort CurMemoLockType;
00527 xbShort CurMemoLockCount;
00528 #endif
00529
00530 };
00531 #endif // __XB_DBF_H__
00532
00533