#ident "$URL: svn://elmer/devel/SVN/SDDAS/trunk/libdB/dbf.h $ %D% SwRI" #include #include /* used for the flags sent to OpenDbf */ #include "SDDAS_types.h" #ifndef __DB_H__ #define __DB_H__ #define DB2File 2 #define DB3File 3 #define DB3WithMemo 4 /* | field types */ #define CHARACTER 'C' #define NUMERIC 'N' #define DATE 'D' #define MEMO 'M' #define LOGICAL 'L' /* * Set Commands */ enum SetCommands { /* | dbSet() commands */ DATE_ }; /* * Set Values */ enum DateValues { /* | date formats */ AMERICAN=0, MDY=0, /* mm/dd/yy */ ANSI = 1, /* yy.mm.dd */ BRITISH = 2, FRENCH = 2, DMY = 2, /* dd/mm/yy */ GERMAN = 3, /* dd.mm.yy */ ITALIAN = 4, /* dd-mm-yy */ JAPAN = 5, YMD = 5, /* yy/mm/dd */ USA = 6, /* mm-dd-yy */ RAW = 7 /* yyyymmdd as it is stored in the file */ }; /* | return values from dbFind() routine */ /* #define EXACT_MATCH 10 #define NO_MATCH 11 #define MATCH_LESS 12 #define MATCH_GREATER 13 #define FIND_ERROR 14 */ typedef enum { FAIL, EXACT_MATCH, NO_MATCH, MATCH_LESS, MATCH_GREATER, FIND_ERROR } dbFindRet_t; /* * dbf_code values. Since errno values range from 1 to 151 for safety sake * we'll start db error numbers at 500. */ #define FULL 500 /* allocated database records full */ #define NOT_DB_FILE 501 /* first byte was not a $3 or $83 or a $2 (dBASE II)*/ #define REC_TOO_HIGH 502 /* tried to read a record beyond the correct range */ #define REC_TOO_LOW 503 /* tried to read a record beyond the correct range */ #define PARTIAL_READ_ 504 /* only a partial record was read */ #define LSEEK_ERROR 505 #define READ_ERROR 506 #define WRITE_ERROR 507 #define OPEN_ERROR 508 /* * field related errors */ #define UNKNOWN_FIELD_TYPE 520 #define UNKNOWN_FIELD 521 #define FIELD_VALUE_ERR 522 #define FIELD_ERROR 523 #define NO_SUCH_HANDLE 530 #define EMPTY_HANDLE 531 #define NO_AVAIL_HANDLES 532 #define UNKNOWN_HANDLE 533 #define INVALID_SET_CMD 540 #define INVALID_SET_VALUE 541 #define ALIGNMENT 4 #define DB_ALIGN(a) ((a % ALIGNMENT) ? (ALIGNMENT - (a % ALIGNMENT)) : 0) #define FIELD_NAME_LEN 10 #define FILE_NAME_LEN 256 #define MAX_HEADER 4129 #define MAX_BYTES_IN_RECORD 4000 #define MAX_FIELDS_IN_RECORD 128 #define BYTES_IN_MEMO_RECORD 512 #define MAX_INDEX_FIELDS 5 #define INDEX_LENGTH 25 typedef char Header_t[MAX_HEADER]; typedef char HeaderProlog_t[32]; typedef char FieldDesc_t[32]; typedef char DataRecord_t[MAX_BYTES_IN_RECORD]; typedef struct FieldRecord_s { char Name[FIELD_NAME_LEN+1]; char Typ; char Len; char Dec; char *Parm; } FieldRecord_t; typedef FieldRecord_t FieldArray_t[MAX_FIELDS_IN_RECORD]; typedef char MemoRecord_t[BYTES_IN_MEMO_RECORD]; typedef enum {NotOpen=0, NotUpdated, Updated} Status_t; typedef enum {FAILURE, SUCCESS} dbRet_t; typedef struct ndxRecord_s { SDDAS_INT handle; /* *index information */ char IndexName[FILE_NAME_LEN]; /* index file name */ SDDAS_INT IndexRec; /* current index record */ SDDAS_INT NextFreeIndexRec; SDDAS_INT MAXIndexRecs; /* maximum number of index records */ Status_t iStatus; /* index status */ SDDAS_INT NumIndexFields; /* number of index fields */ FieldRecord_t *IndexFields; /* pointer to the index fields */ SDDAS_INT KeyLen; /* index key length in bytes */ char *Index; /* pointer to index */ struct ndxRecord_s *next; } ndxRecord_t; typedef struct dbfRecord_s { SDDAS_INT handle; /* * File Information */ char FileName[FILE_NAME_LEN]; /* database file name */ int dFile; /* file descriptor */ /* * Header Information */ HeaderProlog_t HeadProlog; Status_t hStatus; /* header status */ char WithMemo; char DateOfUpdate[8]; /* current date of modififed database */ SDDAS_LONG NumRecs; /* number of record in database */ SDDAS_INT HeadLen; /* header (prolog) length in bytes */ SDDAS_INT RecLen; SDDAS_INT NumFields; /* number of fields */ FieldRecord_t *Fields; /* pointer to fields */ /* * Current record */ SDDAS_INT CurRec; /* current record number */ Status_t rStatus; /* record status */ DataRecord_t *CurRecord; /* pointer to currnect record */ ndxRecord_t *ndxRecords; /* pointer to index structure */ struct dbfRecord_s *next; } dbfRecord_t; typedef struct SetValues_s { enum DateValues Date; } SetValues_t; #ifdef __cplusplus extern "C" { #endif /* * prototypes */ char *dbf_msg(); dbRet_t AppendBlank(SDDAS_INT dbf); dbRet_t AppendDbf(SDDAS_INT dbf); dbRet_t CloseDbf(SDDAS_INT dbf); dbRet_t CloseNdx(SDDAS_INT dbf, SDDAS_INT ndx); dbRet_t CreateDbf(SDDAS_INT *dbf, char *FileName, SDDAS_INT NbrFields, FieldRecord_t *Fields); dbRet_t CreateNdx(SDDAS_INT dbf, char *fn, FieldRecord_t *FieldNames[], SDDAS_INT NumFields, SDDAS_INT *ndx, int silent); dbFindRet_t dbFind(SDDAS_INT dbf, SDDAS_INT ndx, char *arg, SDDAS_BOOL mode); dbRet_t FieldGet(SDDAS_INT dbf, SDDAS_INT FieldNbr, void *data); dbRet_t FieldGetN(SDDAS_INT dbf, const char *FieldName, void *data); SDDAS_INT FieldNo(SDDAS_INT dbf, const char *FieldName); dbRet_t FieldPut(SDDAS_INT dbf, SDDAS_INT FieldNbr, void *data); dbRet_t FieldPutN(SDDAS_INT dbf, char *FieldName, void *data); dbRet_t GetDbfRecord(SDDAS_INT dbf, SDDAS_INT RecNum); dbRet_t GoTo(SDDAS_INT dbf, SDDAS_INT rec); dbRet_t GoToBottom(SDDAS_INT dbf, SDDAS_INT ndx); dbRet_t GoToTop(SDDAS_INT dbf, SDDAS_INT ndx); dbRet_t InitHandle(SDDAS_INT handle); dbRet_t InitDbfHandle(dbfRecord_t *D); dbRet_t InitNdxHandle(ndxRecord_t *N); SDDAS_INT ItoR(ndxRecord_t *N, SDDAS_INT i); dbRet_t OpenDbf(SDDAS_INT *dbf, char *FileName, int mode); dbRet_t OpenNdx(SDDAS_INT dbf, char *FileName, SDDAS_INT *ndx); void PercentDone (int n, int t); dbRet_t PutDbfRecord(SDDAS_INT dbf, SDDAS_INT RecNum); void QSORT (void *A, size_t n, size_t es, int (*cmp)(const void *, const void *)); void db_Qsort(char *ndx, SDDAS_INT NumRecs, SDDAS_INT size, SDDAS_INT KeyLen); dbRet_t ReIndex(SDDAS_INT dbf, SDDAS_INT ndx); dbRet_t Replace(SDDAS_INT dbf, char *FieldName, void *data); dbRet_t ReplaceFn(SDDAS_INT dbf, SDDAS_INT FieldNbr, void *data); dbRet_t Skip(SDDAS_INT dbf, SDDAS_INT ndx, SDDAS_INT rec); dbRet_t dbSet(enum SetCommands Cmd, int Value); dbRet_t DeleteRec(SDDAS_INT dbf, SDDAS_INT ndx, SDDAS_INT rec); dbRet_t DeleteNdxRec(ndxRecord_t *N, SDDAS_INT rec); dbRet_t UnDeleteRec(SDDAS_INT dbf, SDDAS_INT ndx, SDDAS_INT rec); dbRet_t AddIndexRec(dbfRecord_t *D, ndxRecord_t *N); SDDAS_INT RecNo(SDDAS_INT Dbf); void DateFormat(char *data, char *date); dbfRecord_t *GetOldDbfHandle(SDDAS_INT dbf); dbfRecord_t *GetNewDbfHandle(SDDAS_INT *dbf); dbfRecord_t *dbfHandle(SDDAS_INT dbf); ndxRecord_t *GetOldNdxHandle(SDDAS_INT dbf, SDDAS_INT ndx); ndxRecord_t *GetNewNdxHandle(SDDAS_INT dbf, SDDAS_INT *ndx); ndxRecord_t *ndxHandle(SDDAS_INT dbf, SDDAS_INT ndx); FieldRecord_t *dbField(SDDAS_INT dbf, char *FieldName); char *rtrim(char *str); char *ltrim(char *str); char *to_upper(char *str); #ifdef __cplusplus } #endif /* >>>>> Macros <<<<< */ #define mDbfFileName(a) (dbfHandle(a))->FileName #define mNumRecs(a) (dbfHandle(a))->NumRecs #define mDateOfUpdate(a) (dbfHandle(a))->DateOfUpdate #define mNumFields(a) (dbfHandle(a))->NumFields #define mRecLen(a) (dbfHandle(a))->RecLen #define mCurRec(a) (dbfHandle(a))->CurRec #define mRecord(a) (dbfHandle(a))->CurRecord #define mDelFlag(a) (dbfHandle(a))->CurRecord[0][0] #define mField(a,b) (dbfHandle(a))->Fields+b #define mFieldName(a,b) (mField(a,b))->Name #define mFieldType(a,b) (mField(a,b))->Typ #define mFieldLen(a,b) (mField(a,b))->Len #define mFieldDec(a,b) (mField(a,b))->Dec #define mFieldParm(a,b) (mField(a,b))->Parm #define mIndexRec(a, b) ((ndxHandle(a,b))->IndexRec) #define dbf_msg_clr memset(msg,0,128) #ifdef _INIT_ dbfRecord_t *dbfRecords = NULL; SetValues_t SET = { AMERICAN }; char msg[128]; SDDAS_INT dbf_code = 0; #else extern dbfRecord_t *dbfRecords; extern SetValues_t SET; extern char msg[]; extern SDDAS_INT dbf_code; #endif #endif