1847 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1847 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /* d4data.h   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | |
| 
 | |
| extern char v4buffer[257] ;
 | |
| 
 | |
| typedef int S4CALL S4CMP_FUNCTION( S4CMP_PARM, S4CMP_PARM, size_t) ;
 | |
| 
 | |
| /* typedef required to work around VC++ 1.50 bug in definition of Sort4.assignCmp() */
 | |
| typedef int (S4CALL *S4CMP_FUNCTION_PTR)( S4CMP_PARM, S4CMP_PARM, size_t ) ;
 | |
| 
 | |
| #ifdef __SC__
 | |
|    typedef void _cdecl C4DTOK( char S4PTR *, const double ) ;
 | |
|    typedef void _cdecl C4STOK( char S4PTR *, const char S4PTR *, const int ) ;
 | |
| #else
 | |
|    typedef void C4DTOK( char S4PTR *, const double ) ;
 | |
|    typedef void C4STOK( char S4PTR *, const char S4PTR *, const int ) ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4FOX
 | |
|    typedef unsigned char translatedChars[256] ;
 | |
|    typedef unsigned char compressedChars[2] ;
 | |
| #endif
 | |
| 
 | |
| struct DATA4St ;
 | |
| struct FIELD4St ;
 | |
| struct DATA4FILESt ;
 | |
| #ifdef S4COMPILE_TEST
 | |
|    #ifndef S4OFF_MEMO
 | |
|       struct F4MEMOSt ;
 | |
|    #endif
 | |
|    #ifndef S4OFF_INDEX
 | |
|       struct INDEX4St ;
 | |
|       struct TAG4St ;
 | |
|       struct TAG4FILESt ;
 | |
|       #ifndef N4OTHER
 | |
|          struct INDEX4FILESt ;
 | |
|       #endif
 | |
|       #ifdef S4FOX
 | |
|          struct T4VFPSt ;
 | |
|       #endif
 | |
|    #endif
 | |
|    #ifndef S4OFF_TRAN
 | |
|       struct S4CLASS TRAN4FILESt ;
 | |
|       struct S4CLASS CODE4TRANSSt ;
 | |
|    #endif
 | |
| #else
 | |
|    struct F4MEMOSt ;
 | |
|    struct INDEX4St ;
 | |
|    struct TAG4St ;
 | |
|    struct TAG4FILESt ;
 | |
|    struct S4CLASS TRAN4FILESt ;
 | |
|    struct S4CLASS CODE4TRANSSt ;
 | |
|    #ifndef N4OTHER
 | |
|       struct INDEX4FILESt ;
 | |
|    #endif
 | |
|    #ifdef S4FOX
 | |
|       struct T4VFPSt ;
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CBPP
 | |
|    class S4CLASS FILE4 ;
 | |
| #else
 | |
|    struct FILE4St ;
 | |
| #endif
 | |
| #ifdef S4CBPP
 | |
|    class S4CLASS CODE4 ;
 | |
| #else
 | |
|    struct CODE4St ;
 | |
| #endif
 | |
| #ifdef S4SERVER
 | |
|    struct SERVER4CLIENTSt ;
 | |
| #endif
 | |
| #ifndef S4OFF_COMMUNICATIONS
 | |
|    struct SOCKET4St ;
 | |
|    #ifdef S4CLIENT
 | |
|       struct CONNECTION4St ;
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CBPP
 | |
|    class S4CLASS Code4 ;
 | |
|    typedef int ERROR4FUNCTION( Code4 S4PTR *, short int, long ) ;
 | |
|    typedef int ERROR4DESCRIBE_FUNCTION( Code4 S4PTR *, short int, long, const char S4PTR *, const char S4PTR *, const char S4PTR * ) ;
 | |
|    typedef int ERROR4STACK( Code4 S4PTR *, short int, long ) ;
 | |
|    typedef int ERROR4SET( Code4 S4PTR *, short int ) ;
 | |
| #else
 | |
|    typedef int ERROR4FUNCTION( struct CODE4St S4PTR *, short int, long ) ;
 | |
|    typedef int ERROR4DESCRIBE_FUNCTION( struct CODE4St S4PTR *, short int, long, const char S4PTR *, const char S4PTR *, const char S4PTR * ) ;
 | |
|    typedef int ERROR4STACK( struct CODE4St S4PTR *, short int, long ) ;
 | |
|    typedef int ERROR4SET( struct CODE4St S4PTR *, short int ) ;
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
|    #ifdef S4WINDOWS
 | |
|       #ifdef S4WIN32
 | |
|          #ifdef _MSC_VER
 | |
|             typedef struct _declspec(dllexport) l4linkSt
 | |
|          #else
 | |
|             typedef struct _export l4linkSt
 | |
|          #endif
 | |
|       #else
 | |
|          typedef struct _export l4linkSt
 | |
|       #endif
 | |
|    #else
 | |
|       typedef struct l4linkSt
 | |
|    #endif
 | |
| #else
 | |
| typedef struct l4linkSt
 | |
| #endif
 | |
| {
 | |
|    struct l4linkSt S4PTR *n, S4PTR *p ;
 | |
| } LINK4 ;
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| class S4CLASS LIST4
 | |
| {
 | |
| public:
 | |
| #else
 | |
| typedef struct
 | |
| {
 | |
| #endif
 | |
|    S4CONV( LINK4 S4PTR *lastNode, LINK4 S4PTR *last_node ) ; /* the last Link */
 | |
|    LINK4 S4PTR *selected ;
 | |
|    S4CONV( unsigned short int nLink, unsigned short int n_link ) ; /* The number of links in the list */
 | |
| #ifdef S4CBPP
 | |
| } ;
 | |
| #else
 | |
| } LIST4 ;
 | |
| #endif
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    double  data ;  /* Make sure it is on a boundry good for at least a double  */
 | |
| } Y4CHUNK ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
| 
 | |
|    LIST4 chunks ;      /* Chunks of pieces */
 | |
|    LIST4 pieces ;      /* A list of available memory pieces */
 | |
| 
 | |
|    int unitStart;    /* The starting # of entries for the Memory Type */
 | |
|    unsigned   unitSize ;   /* The size of each allocated piece */
 | |
|    int unitExpand ; /* The expansion # of entries for the Memory Type */
 | |
|    int nRepeat ;    /* The number of times entry returned for 'new' */
 | |
|                     /* If nRepeat is '-1', it is a temporary entry. */
 | |
|    int nUsed ;      /* The number of entries used */
 | |
|    #ifdef S4DOS    /* no memory sharing under DOS, so can use a CODE4 for limited memory */
 | |
|       #ifdef S4CBPP
 | |
|          CODE4 S4PTR    *codeBase ;
 | |
|       #else
 | |
|          struct CODE4St *codeBase ;
 | |
|       #endif
 | |
|    #endif
 | |
| }  MEM4 ;
 | |
| 
 | |
| #ifndef S4OFF_OPTIMIZE
 | |
| typedef struct
 | |
| {
 | |
|    LIST4 list ;
 | |
| 
 | |
|    unsigned short int minLink ;
 | |
|    unsigned long maxTime ;
 | |
|    unsigned long minTime ;
 | |
|    char currentPrioCount ;    /* should this list be scanned for avail blocks? */
 | |
| } OPT4LIST ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    LINK4 lruLink ;
 | |
|    char changed ;
 | |
|    unsigned len ;
 | |
|    void S4PTR *data ;
 | |
|    unsigned long readTime ;
 | |
|    unsigned long accessTime ;
 | |
|    double hitCount ;
 | |
|    OPT4LIST *optList ;       /* the optimization list the file resides on */
 | |
| 
 | |
|    /* these next 2 elements must match the OPT4CMP structure in o4opt.h */
 | |
|    #ifdef S4CBPP
 | |
|       FILE4 S4PTR *file ;
 | |
|    #else
 | |
|       struct FILE4St *file ;
 | |
|    #endif
 | |
|    long pos ;
 | |
| } OPT4BLOCK ;
 | |
| 
 | |
| #ifdef S4CBPP
 | |
|    typedef struct S4CLASS
 | |
| #else
 | |
|    typedef struct
 | |
| #endif
 | |
| {
 | |
|    char blockPower ;
 | |
|    char forceCurrent ;    /* switch forces a read of current contents */
 | |
|    char numShift ;
 | |
| 
 | |
|    unsigned char oldMode ;
 | |
|    unsigned char doUpdate ;
 | |
|    unsigned char checkCount ;
 | |
|    unsigned char dummyChar ;
 | |
| 
 | |
|    unsigned int minLink ;
 | |
|    int numBuffers ;
 | |
| 
 | |
|    unsigned maxBlocks ;
 | |
|    unsigned writeBlockCount ; /* is the buffer full? */
 | |
| 
 | |
|    unsigned long blockSize ;
 | |
|    unsigned long bufferSize ;
 | |
|    unsigned long hashTrail ;       /* where last optimized file ended */
 | |
|    unsigned long mask ;
 | |
|    unsigned long numBlocks ;
 | |
|    unsigned long numLists ;
 | |
|    unsigned long readStartPos ;
 | |
|    unsigned long writeStartPos ;
 | |
|    unsigned long writeCurPos ;
 | |
| 
 | |
|    unsigned long readTimeCount ;
 | |
|    unsigned long accessTimeCount ;
 | |
|    unsigned int minAccessTimeVariation ;  /* access times of less than this value will not be updated == 1% of blocks */
 | |
| 
 | |
|    char S4PTR *readBuffer ;
 | |
|    char S4PTR *writeBuffer ;
 | |
|    char S4PTR *writeBufferActual ;  /* writeBuffer just points to the actual buffer */
 | |
| 
 | |
|    void S4PTR* S4PTR* buffers ;
 | |
| 
 | |
|    OPT4BLOCK S4PTR *blocks ;
 | |
| 
 | |
|    LIST4 S4PTR *lists ;
 | |
|    OPT4LIST S4PTR *prio[OPT4NUM_LISTS] ;
 | |
| 
 | |
|    LIST4 avail ;
 | |
|    OPT4LIST dbfLo ;
 | |
|    OPT4LIST dbfHi ;
 | |
|    OPT4LIST indexLo ;
 | |
|    OPT4LIST indexHi ;
 | |
|    OPT4LIST other ;
 | |
| 
 | |
|    LIST4 optFiles ;
 | |
| 
 | |
|    #ifdef S4WRITE_DELAY
 | |
|       LIST4 delayAvail ;   /* extra blocks to allow efficient delay-writing */
 | |
|       char S4PTR *delayWriteBuffer ;
 | |
|       char S4PTR *delayLargeBuffer ;
 | |
|       CRITICAL_SECTION critical4optWrite ;
 | |
|       int delayLargeBufferAvail ;
 | |
|       int writeBufferActualAvail ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4ADVANCE_READ
 | |
|       char S4PTR *advanceLargeBuffer ;
 | |
|       CRITICAL_SECTION critical4optRead ;
 | |
|       #ifdef S4CBPP
 | |
|          FILE4 S4PTR *advanceReadFile ;
 | |
|       #else
 | |
|          struct FILE4St S4PTR *advanceReadFile ;
 | |
|       #endif
 | |
|       int advanceLargeBufferAvail ;
 | |
|       long advanceLargePos ;
 | |
|       unsigned int advanceLargeLen ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4CBPP
 | |
|       FILE4 S4PTR    *writeFile ;
 | |
|       FILE4 S4PTR    *readFile ;
 | |
|    #else
 | |
|       struct FILE4St S4PTR *writeFile ;        /* which file has the write buffer? */
 | |
|       struct FILE4St S4PTR *readFile ;        /* which file has the write buffer? */
 | |
|    #endif
 | |
| } OPT4 ;
 | |
| 
 | |
| #endif /* S4OFF_OPTIMIZE */
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| class S4CLASS FILE4
 | |
| {
 | |
| public:
 | |
| #else
 | |
| typedef struct FILE4St
 | |
| {
 | |
| #endif
 | |
|    #ifndef S4OFF_OPTIMIZE
 | |
|       LINK4 link ;           /* set to 0 if file not optimized */
 | |
|    #else
 | |
|       LINK4 space2 ;
 | |
|    #endif
 | |
|    /* accessMode and isReadOnly both on indicate 'r' attribute on file */
 | |
|    /* isReadOnly only on indicates user access is limited to read only */
 | |
|    /* if accessMode, will do full bufferring, if isReadOnly, will avoid */
 | |
|    /* performing any disk writes */
 | |
| 
 | |
|    char doAllocFree ;
 | |
|    char isTemp ;             /* True if it is a temporary file */
 | |
| 
 | |
|    int hand ;
 | |
|    int isReadOnly ;          /* True if file is read only */
 | |
| 
 | |
|    char S4PTR *nameBuf ;
 | |
| 
 | |
|    S4CONST char S4PTR *name ;
 | |
| 
 | |
|    #ifdef S4CBPP
 | |
|       CODE4 S4PTR *codeBase ;
 | |
|    #else
 | |
|       S4CONV( struct CODE4St *codeBase, struct CODE4St *code_base ) ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_MULTI
 | |
|       int lowAccessMode ;       /* open access level */
 | |
|    #else
 | |
|       int space25 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_OPTIMIZE
 | |
|       char fileCreated ;     /* false if the file has not been created yet - i.e. if a memory-only file */
 | |
|       char  writeBuffer ;    /* buffer writes where possible */
 | |
|       long  hashInit ;
 | |
|       long  len ;            /* internal if optimized */
 | |
|       char  type ;           /* dbf, index, other */
 | |
|       char  bufferWrites ;   /* are writes being bufferred? */
 | |
|       int   doBuffer ;       /* is the file bufferring on? */
 | |
|       long  expectedReadSize ;  /* record length */
 | |
|       double hitCountAdd ;
 | |
|       const void *ownerPtr ;        /* points to DATA4/INDEX4 which holds file handle */
 | |
|    #else
 | |
|       char  space1 ;
 | |
|       long  space3 ;
 | |
|       long  space4 ;
 | |
|       char  space5 ;
 | |
|       char  space6 ;
 | |
|       int   space7 ;
 | |
|       long  space11 ;
 | |
|       double space12 ;
 | |
|       const void *space13 ;
 | |
|    #endif
 | |
| 
 | |
| 
 | |
|    #ifdef S4MULTI_THREAD
 | |
|       CRITICAL_SECTION critical4file ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4WRITE_DELAY
 | |
|       LIST4 delayWriteFileList ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4READ_ADVANCE
 | |
|       LIST4 advanceReadFileList ;
 | |
|       char *advanceReadBuf ;        /* a buffer for advanced-reading */
 | |
|       int advanceReadBufStatus ;    /* the status of the advance-read buffer */
 | |
|                                     /* AR4EMPTY, AR4IN_USE, AR4FULL */
 | |
|       long advanceReadBufPos ;
 | |
|       unsigned advanceReadBufLen ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef E4ANALYZE_ALL
 | |
|       char dupName[L_tmpnam] ;
 | |
|       int hasDup ;
 | |
|       int inUse ;
 | |
|    #else
 | |
|       char *space8 ;
 | |
|       int space9 ;
 | |
|       int space10 ;
 | |
|    #endif
 | |
| #ifdef S4CBPP
 | |
| } ;
 | |
| #else
 | |
| } FILE4 ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4WRITE_DELAY
 | |
| typedef void S4PTR * S4DELAY_PARM ;
 | |
| typedef void S4CALL S4DELAY_FUNCTION( S4DELAY_PARM ) ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    LINK4 fileLink ;    /* for the given file, all links on delay-chain */
 | |
|    FILE4 *file ;
 | |
|    const char *data ;
 | |
|    long pos ;
 | |
|    unsigned int len ;
 | |
|    int usageFlag ;
 | |
|    int status ;
 | |
| 
 | |
|    S4DELAY_FUNCTION *completionRoutine ;
 | |
|    void *completionData ;   /* routine-specific data for use in completion routine */
 | |
| } FILE4WRITE_DELAY ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4READ_ADVANCE
 | |
| typedef void S4PTR * S4ADVANCE_PARM ;
 | |
| typedef void S4CALL S4ADVANCE_FUNCTION( S4ADVANCE_PARM ) ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    LINK4 fileLink ;    /* for the given file, all links on delay-chain */
 | |
|    FILE4 *file ;
 | |
|    char *data ;
 | |
|    long pos ;
 | |
|    unsigned int len ;
 | |
|    int usageFlag ;
 | |
|    unsigned int status ;
 | |
| 
 | |
|    S4ADVANCE_FUNCTION *completionRoutine ;
 | |
|    void *completionData ;   /* routine-specific data for use in completion routine */
 | |
| } FILE4ADVANCE_READ ;
 | |
| #endif
 | |
| 
 | |
| typedef struct S4CLASS
 | |
| {
 | |
|    /* structure must remain fixed positions */
 | |
|    long transId ;
 | |
|    long clientId ;
 | |
|    long clientDataId ;
 | |
|    long serverDataId ;
 | |
|    short int type ;
 | |
|    unsigned long dataLen ;
 | |
|    time_t    time ;
 | |
| } LOG4HEADER ;
 | |
| 
 | |
| typedef struct S4CLASS TRAN4St
 | |
| {
 | |
|    /* transaction capabilities for a client */
 | |
|    struct CODE4TRANSSt *c4trans ;
 | |
|    LIST4 *dataList ;        /* A list of open data files. */
 | |
|    LIST4 localDataList ;
 | |
|    char dateFormat[LEN4DATE_FORMAT];          /* Longest is September 15, 1990 */
 | |
| 
 | |
|    #ifndef S4OFF_WRITE
 | |
|       int currentTranStatus ;  /* is there a current transaction? */
 | |
|    #else
 | |
|       int space1 ;
 | |
|    #endif
 | |
|    #ifndef S4OFF_MULTI
 | |
|       int unlockAuto ;        /* automatic unlocking on or off? */
 | |
|       int savedUnlockAuto ;
 | |
|       LIST4 locks ;           /* list of Lock4's */
 | |
|    #else
 | |
|       int space2 ;
 | |
|       int space3 ;
 | |
|       LIST4 space4 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_WRITE
 | |
|       /* given transaction details */
 | |
|       long       transId ;
 | |
|       long       pos ;       /* used during examination processing */
 | |
|       LOG4HEADER header ;
 | |
|       unsigned   dataPos ;
 | |
| /*      char      *charId ;*/
 | |
|    #else
 | |
|       long       space6 ;
 | |
|       long       space7 ;    /* used during examination processing */
 | |
|       LOG4HEADER space8 ;
 | |
|       char      *space9 ;    /* used during transaction writing and examination processing */
 | |
|       unsigned   space10 ;
 | |
|       unsigned   space11 ;
 | |
|       char      *space12 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4STAND_ALONE
 | |
|       int userIdNo ;    /* used to determine the id of user */
 | |
|    #endif
 | |
| 
 | |
|    LIST4 closedDataFiles ;  /* during a transaction */
 | |
|    #ifdef S4CLIENT
 | |
|       int dataIdCount ;    /* client keeps an id on each data4 */
 | |
|    #else
 | |
|       char userId[LEN4USERID+1] ;
 | |
|       char netId[LEN4NETID+1] ;
 | |
|    #endif
 | |
| } TRAN4 ;
 | |
| 
 | |
| typedef struct S4CLASS CODE4TRANSSt
 | |
| {
 | |
|    #ifdef S4CBPP
 | |
|       CODE4 S4PTR *c4 ;
 | |
|    #else
 | |
|       struct CODE4St *c4 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_TRAN
 | |
|       int enabled ;
 | |
|       #ifndef S4OFF_WRITE
 | |
|          #ifndef S4CLIENT
 | |
|             struct TRAN4FILESt *transFile ;
 | |
|          #else
 | |
|             struct TRAN4FILESt *space1 ;
 | |
|          #endif
 | |
|       #else
 | |
|          struct TRAN4FILESt *space1 ;
 | |
|       #endif
 | |
|    #else
 | |
|       int space2 ;
 | |
|       struct TRAN4FILESt *space1 ;
 | |
|    #endif
 | |
|    #ifndef S4SERVER
 | |
|       TRAN4 trans ;
 | |
|    #else
 | |
|       TRAN4 space3 ;
 | |
|    #endif
 | |
| } CODE4TRANS ;
 | |
| 
 | |
| typedef struct TRAN4FILESt
 | |
| {
 | |
|    long   transId ;
 | |
|    long   validState ;    /* true/false switch */
 | |
|    unsigned long fileLocks ;   /* bit encoded, bit i == byte TRAN4LOCK_BASE+i locked */
 | |
|    FILE4  file ;
 | |
|    int status ;
 | |
| 
 | |
|    CODE4TRANS *c4trans ;
 | |
| } TRAN4FILE ;
 | |
| 
 | |
| #ifndef S4OFF_CATALOG
 | |
| typedef struct CATALOG4St
 | |
| {
 | |
|    struct DATA4St *data ;
 | |
|    int valid ;
 | |
|    int catalogAdd ;
 | |
|    int catalogStatus ;
 | |
|    struct FIELD4St *ownerFld, *aliasFld, *pathNameFld, *typeFld, *readOnlyFld,
 | |
|                     *indexOpenFld, *createFld, *openModeFld, *logFld ;
 | |
|    struct TAG4St *aliasTag, *pathTag ;
 | |
| } CATALOG4 ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| class S4CLASS CODE4
 | |
| {
 | |
| public:
 | |
| #else
 | |
| typedef struct CODE4St
 | |
| {
 | |
| #endif
 | |
|    /* documented members... (except ifdef'ed ones) */
 | |
| 
 | |
|    S4CONV( int autoOpen, int auto_open ) ;               /* Automatic production index file opening */
 | |
|    int createTemp ;                                      /* create files as temporary ? */
 | |
|    S4CONV( int errCreate, int create_error ) ;           /* Do 'file4create' error ? */
 | |
|    S4CONV( int errDefaultUnique, int default_unique_error ) ; /* e4unique, r4unique, r4uniqueContinue */
 | |
|    S4CONV( int errExpr, int expr_error ) ;
 | |
|    S4CONV( int errFieldName, int field_name_error ) ;
 | |
|    S4CONV( int errOff, int off_error ) ;                 /* Show error messages? */
 | |
|    S4CONV( int errOpen, int open_error ) ;               /* Do 'file4open' error ? */
 | |
|    S4CONV( int errorCode, int error_code ) ;
 | |
|    #ifdef S4WIN32 /* documented member */
 | |
|       void S4PTR *hWnd;            /* For use under Microsoft Windows */
 | |
|    #else
 | |
|       unsigned hWnd ;              /* For use under Microsoft Windows */
 | |
|    #endif
 | |
|    int log ;
 | |
|    S4CONV( int memExpandData, int mem_expand_data ) ;          /* Expanding data allocation */
 | |
|    S4CONV( unsigned memSizeBuffer, unsigned mem_size_buffer ) ;/* Pack, Zap */
 | |
|    S4CONV( unsigned memSizeSortBuffer, unsigned mem_size_sort_buffer ) ; /* The default file buffer size when sorting */
 | |
|    S4CONV( unsigned memSizeSortPool, unsigned mem_size_sort_pool ) ;   /* The default pool size for sorting */
 | |
|    S4CONV( unsigned memStartData, unsigned mem_start_data ) ;      /* Initial data allocation */
 | |
|    S4CONV( int readOnly, int read_only ) ;
 | |
|    int safety ;                                          /* File create with safety ? */
 | |
|    long timeout ;
 | |
|    short int compatibility ;                                   /* FoxPro compatibility with... 25, 26, 30 */
 | |
| 
 | |
|    /* undocumented members... */
 | |
| 
 | |
|    int s4cr2 ;                                            /* used by CodeReporter */
 | |
| 
 | |
|    int initialized ;                                      /* only allow a single initUndo */
 | |
|    long errorCode2 ;
 | |
|    int numericStrLen ;                                    /* the default length for clipper index files */
 | |
|    int decimals ;                                         /* the default # decimals for clipper index files */
 | |
| 
 | |
|    int memExpandDataFile ;
 | |
|    unsigned memStartDataFile ;
 | |
| 
 | |
|    unsigned exprBufLen ;        /* for exprWorkBuf */
 | |
|    unsigned storedKeyLen ;      /* for storedKeu */
 | |
|    unsigned bufLen ;            /* for fieldBuffer */
 | |
| 
 | |
|    char S4PTR *exprWorkBuf ;    /* used by expression parsing */
 | |
|    char S4PTR *storedKey ;      /* used by the expr4key() function */
 | |
|    char S4PTR *fieldBuffer ;
 | |
|    char S4PTR *version ;
 | |
| 
 | |
|    char indexExtension[4] ;
 | |
| 
 | |
|    MEM4 S4PTR *bitmapMemory ;
 | |
|    MEM4 S4PTR *dataMemory ;
 | |
|    S4CONV( MEM4 S4PTR *calcMemory, MEM4 S4PTR *calc_memory ) ;
 | |
|    MEM4 S4PTR *data4fileMemory ;
 | |
|    MEM4 S4PTR *relateDataListMemory ;  /* for R4DATA_LIST */
 | |
|    MEM4 S4PTR *relateListMemory ;  /* for RELATE4LIST */
 | |
|    MEM4 S4PTR *relateMemory ;
 | |
|    MEM4 S4PTR *relationMemory ;
 | |
|    MEM4 S4PTR *dataListMemory ;  /* for DATA4LIST */
 | |
| 
 | |
|    LIST4 availMessages ;        /* list of available message buffers */
 | |
|    LIST4 dataFileList ;         /* A list of open data files. */
 | |
| 
 | |
|    FILE4 *errorLog ;             /* log file for error messages */
 | |
| 
 | |
|    int collatingSequence ;   /* the collating sequence to use when creating a VFP tag */
 | |
|    int codePage ;            /* the codepage to use when creating a database file */
 | |
| 
 | |
|    #ifdef S4COMPILE_TEST
 | |
|       #ifndef S4OFF_MULTI
 | |
|          S4CONV( int accessMode, int exclusive ) ;             /* how should files be opened? */
 | |
|          int memExpandLock ;       /* Expanding lock memory allocation */
 | |
|          unsigned memStartLock ;   /* Initial lock memory allocation record locks */
 | |
|          int lockAttemptsSingle ;                               /* How many times to attempt each lock in a group lock */
 | |
|          unsigned int lockDelay ;
 | |
|          int fileFlush ;  /* force hard file flush during write */
 | |
|          S4CONV( int readLock, int read_lock ) ;               /* Do lock when reading database ? */
 | |
|          S4CONV( int lockAttempts, int lock_attempts ) ;        /* How many times to attempt locks. */
 | |
|          MEM4 S4PTR *lockMemory ;
 | |
|          MEM4 S4PTR *lockLinkMemory ;
 | |
|       #endif
 | |
|       #ifndef S4OFF_OPTIMIZE
 | |
|          S4CONV( int optimizeWrite, int optimize_write ) ;
 | |
|          S4CONV( unsigned memSizeBlock, unsigned mem_size_block ) ;  /* Block size (bytes) for memo and index files */
 | |
|          int optimize ;            /* should files be automatically bufferred? */
 | |
|          int memMaxPercent ;
 | |
|          S4CONV( long memStartMax, long mem_start_max ) ;
 | |
|       #endif
 | |
|       #ifndef S4OFF_INDEX
 | |
|          #ifdef S4OFF_OPTIMIZE
 | |
|             S4CONV( unsigned memSizeBlock, unsigned mem_size_block ) ;  /* Block size (bytes) for memo and index files */
 | |
|          #endif
 | |
|          S4CONV( int errTagName, int tag_name_error ) ;
 | |
|          S4CONV( int memExpandBlock, int mem_expand_block ) ;        /* Expanding block memory allocation */
 | |
|          S4CONV( int memExpandIndex, int mem_expand_index ) ;        /* Expanding index allocation */
 | |
|          S4CONV( int memExpandTag, int mem_expand_tag ) ;            /* Expanding tag allocation */
 | |
|          S4CONV( unsigned memStartBlock, unsigned mem_start_block ) ;     /* Initial block memory allocation for index files */
 | |
|          S4CONV( unsigned memStartIndex, unsigned mem_start_index ) ;     /* Initial index file allocation */
 | |
|          S4CONV( unsigned memStartTag, unsigned mem_start_tag ) ;       /* Initial tag allocation */
 | |
|          int memExpandTagFile ;
 | |
|          unsigned memStartTagFile ;
 | |
|          MEM4 S4PTR *indexMemory ;
 | |
|          MEM4 S4PTR *index4fileMemory ;
 | |
|          MEM4 S4PTR *tagMemory ;
 | |
|          MEM4 S4PTR *tagFileMemory ;
 | |
|       #endif
 | |
|       #ifndef S4OFF_MEMO
 | |
|          S4CONV( unsigned memSizeMemo, unsigned mem_size_memo ) ;
 | |
|          S4CONV( unsigned memSizeMemoExpr, unsigned mem_size_memo_expr ) ;
 | |
|       #endif
 | |
|       #ifndef S4OFF_TRAN
 | |
|          int doTrans ;                                         /* Maintain a transaction file? */
 | |
|       #endif
 | |
|    #else
 | |
|       S4CONV( int accessMode, int exclusive ) ;             /* how should files be opened? */
 | |
|       int memExpandLock ;       /* Expanding lock memory allocation */
 | |
|       unsigned memStartLock ;   /* Initial lock memory allocation record locks */
 | |
|       int lockAttemptsSingle ;                               /* How many times to attempt each lock in a group lock */
 | |
|       unsigned int lockDelay ;
 | |
|       int fileFlush ;  /* force hard file flush during write */
 | |
|       S4CONV( int readLock, int read_lock ) ;               /* Do lock when reading database ? */
 | |
|       S4CONV( int lockAttempts, int lock_attempts ) ;        /* How many times to attempt locks. */
 | |
|       MEM4 S4PTR *lockMemory ;
 | |
|       MEM4 S4PTR *lockLinkMemory ;
 | |
|       S4CONV( int optimizeWrite, int optimize_write ) ;
 | |
|       int optimize ;            /* should files be automatically bufferred? */
 | |
|       int memMaxPercent ;
 | |
|       S4CONV( long memStartMax, long mem_start_max ) ;
 | |
|       S4CONV( unsigned memSizeBlock, unsigned mem_size_block ) ;  /* Block size (bytes) for memo and index files */
 | |
|       S4CONV( int errTagName, int tag_name_error ) ;
 | |
|       S4CONV( int memExpandBlock, int mem_expand_block ) ;        /* Expanding block memory allocation */
 | |
|       S4CONV( int memExpandIndex, int mem_expand_index ) ;        /* Expanding index allocation */
 | |
|       S4CONV( int memExpandTag, int mem_expand_tag ) ;            /* Expanding tag allocation */
 | |
|       S4CONV( unsigned memStartBlock, unsigned mem_start_block ) ;     /* Initial block memory allocation for index files */
 | |
|       S4CONV( unsigned memStartIndex, unsigned mem_start_index ) ;     /* Initial index file allocation */
 | |
|       S4CONV( unsigned memStartTag, unsigned mem_start_tag ) ;       /* Initial tag allocation */
 | |
|       int memExpandTagFile ;
 | |
|       unsigned memStartTagFile ;
 | |
|       MEM4 S4PTR *indexMemory ;
 | |
|       MEM4 S4PTR *index4fileMemory ;
 | |
|       MEM4 S4PTR *tagMemory ;
 | |
|       MEM4 S4PTR *tagFileMemory ;
 | |
|       S4CONV( unsigned memSizeMemo, unsigned mem_size_memo ) ;
 | |
|       S4CONV( unsigned memSizeMemoExpr, unsigned mem_size_memo_expr ) ;
 | |
|       int doTrans ;                                         /* Maintain a transaction file? */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef E4ANALYZE
 | |
|       int debugInt ;               /* used to check structure integrity (set to 0x5281) */
 | |
|    #else
 | |
|       #ifdef S4VBASIC
 | |
|          int debugInt ;
 | |
|       #else
 | |
|          int space1 ;
 | |
|       #endif
 | |
|    #endif
 | |
|    #ifndef N4OTHER
 | |
|       unsigned memStartIndexFile ; /* Initial index file allocation */
 | |
|       int memExpandIndexFile ;  /* Expanding index file allocation */
 | |
|    #else
 | |
|       unsigned space4 ;
 | |
|       int space5 ;
 | |
|    #endif
 | |
|    #ifndef S4DOS
 | |
|       #ifdef S4WIN32
 | |
|          void S4PTR *hInst ;
 | |
|          void S4PTR *hInstLocal ;
 | |
|       #else
 | |
|          unsigned hInst ;
 | |
|          unsigned hInstLocal ;
 | |
|       #endif
 | |
|       char protocol[LEN4PROTOCOL+1] ;
 | |
|    #else
 | |
|       #ifdef S4WIN32
 | |
|          void S4PTR *space6 ;
 | |
|          void S4PTR *space7 ;
 | |
|       #else
 | |
|          unsigned space6 ;
 | |
|          unsigned space7 ;
 | |
|       #endif
 | |
|       char space8[LEN4PROTOCOL+1] ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_WRITE
 | |
|       char *transFileName ;
 | |
|    #else
 | |
|       char *space47 ;
 | |
|    #endif
 | |
|    #ifndef S4OFF_CATALOG
 | |
|       #ifndef S4CLIENT
 | |
|          CATALOG4 S4PTR *catalog ;
 | |
|       #else
 | |
|          void S4PTR *space48 ;
 | |
|          int space49 ;
 | |
|          int space50 ;
 | |
|       #endif  /* S4CLIENT */
 | |
|    #else
 | |
|       void S4PTR *space48 ;
 | |
|       int space49 ;
 | |
|       int space50 ;
 | |
|    #endif  /* S4OFF_CATALOG */
 | |
| 
 | |
|    #ifndef S4OFF_COMMUNICATIONS
 | |
|       MEM4 S4PTR *messageLinkMemory ;
 | |
|       MEM4 S4PTR *connectionMemory ;
 | |
|       MEM4 S4PTR *connectionNetMemory ;
 | |
|       LIST4 availDataMessages ;
 | |
|       #ifdef S4DISTRIBUTED
 | |
|          LIST4 servers ;       /* list of connected servers */
 | |
|       #else
 | |
|          LIST4 space51 ;
 | |
|       #endif
 | |
|       struct SOCKET4St S4PTR *defaultServer ;
 | |
|       /* LIST4 passwordList ; */
 | |
|    #else
 | |
|       MEM4 S4PTR *space52 ;
 | |
|       MEM4 S4PTR *space52b ;
 | |
|       MEM4 S4PTR *space52c ;
 | |
|       LIST4 space53 ;
 | |
|       LIST4 space55 ;
 | |
|       void S4PTR *space56 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_TRAN
 | |
|       char *tranData ;   /* buffer used to hold transaction entries */
 | |
|       unsigned int tranDataLen ;  /* length of transaction entry buffer */
 | |
|    #else
 | |
|       char *space57 ;
 | |
|       unsigned int space58 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4MNDX
 | |
|       char *memoUseBuffer ;
 | |
|    #else
 | |
|       char S4PTR *space16a ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_OPTIMIZE
 | |
|       OPT4 opt ;
 | |
|       int hasOpt, doOpt, hadOpt ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4STAND_ALONE
 | |
|       #ifndef S4OFF_TRAN
 | |
|          #ifndef S4OFF_WRITE
 | |
|             TRAN4FILE transFile ;
 | |
|             int logOpen ;
 | |
|          #endif
 | |
|       #endif
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4WRITE_DELAY
 | |
|       int delayWritesEnabled ;
 | |
|       CRITICAL_SECTION critical4delayWriteList ;
 | |
|       LIST4 delayWriteList ;
 | |
|       MEM4 S4PTR *delayWriteMemory ;
 | |
|       long uninitializeDelayWrite ;   /* request to uninitialize delay-writes */
 | |
|       HANDLE initUndoDelayWrite ;    /* event for delay-write thread to notify main
 | |
|                                        thread that uninitialization is complete */
 | |
|       HANDLE pendingWriteEvent ;    /* event to notify delay-write thread that
 | |
|                                        there is an action to perform */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4READ_ADVANCE
 | |
|       int advanceReadsEnabled ;
 | |
|       CRITICAL_SECTION critical4advanceReadList ;
 | |
|       LIST4 advanceReadList ;
 | |
|       MEM4 S4PTR *advanceReadMemory ;
 | |
|       HANDLE initUndoAdvanceRead ;
 | |
|       long uninitializeAdvanceRead ;
 | |
|       HANDLE pendingReadEvent ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4SERVER
 | |
|       int singleClient ;
 | |
|       int displayErrors ;
 | |
|       int readOnlyRequest ;
 | |
|       unsigned memStartClient ;
 | |
|       unsigned memExpandClient ;
 | |
|       struct SERVER4CLIENTSt S4PTR *catalogClient ;
 | |
|       MEM4 S4PTR *clientMemory ;
 | |
|       struct SERVER4St S4PTR *server ;
 | |
|       struct SERVER4CLIENTSt S4PTR *currentClient ;
 | |
| 
 | |
|       #ifdef N4OTHER
 | |
|          int doRemove ;
 | |
|       #else
 | |
|          int doRemoveSpace ;
 | |
|       #endif
 | |
| 
 | |
|       #ifdef S4DEBUG_LOG
 | |
|          char S4PTR *logFileName ;
 | |
|          FILE4 logFile ;
 | |
|          int log ;
 | |
|       #endif
 | |
|       #ifndef S4OFF_SECURITY
 | |
|          int idhandling ;
 | |
|       #endif
 | |
|    #else
 | |
|       /* singleOpen can take 0,1, or 2, but only 0 and 1 are documented -OPEN4 modes */
 | |
|       int singleOpen ;      /* only one instance of a DATA4 allowed (as opposed to exclusive which is access for client) */
 | |
|       S4CONV( int errGo, int go_error ) ;                   /* Do 'd4go' error ? */
 | |
|       S4CONV( int errRelate, int relate_error ) ;         /* do relate4terminate error when no match and relate4terminate selected */
 | |
|       S4CONV( int errSkip, int skip_error ) ;           /* Do 'DataIndex::skip' error ? */
 | |
|       int lockEnforce ;         /* are pre-locks required for record modifications? */
 | |
| 
 | |
|       int doRemove ;
 | |
|       const char *lockedNetId ;
 | |
|       const char *lockedUserId ;
 | |
|       const char *lockedFileName ;
 | |
|       long lockedLockItem ;
 | |
| 
 | |
|       CODE4TRANS c4trans ;
 | |
|       S4CONV( MEM4 S4PTR *totalMemory, MEM4 S4PTR *total_memory ) ;
 | |
|       S4CONV( LIST4 calcList, LIST4 calc_list ) ;
 | |
|       S4CONV( LIST4 totalList, LIST4 total_list ) ;
 | |
|       S4CONV( int numReports, int num_reports ) ;
 | |
|       short pageno ;
 | |
|       long clientDataCount ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4CLIENT
 | |
|       int indexFormat ;
 | |
|       int openForCreate ;
 | |
|    #else
 | |
|       int doIndexVerify ;       /* for internal purposes only at this point */
 | |
|       struct RELATION4St S4PTR *currentRelation ;
 | |
|       char savedKey[I4MAX_KEY_SIZE + 2 * sizeof(long)] ;       /* used by i4remove.c, i4tag.c and i4addtag.c, i4versionCheck, t4versionCheck */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4OPTIMIZE_STATS
 | |
|       struct DATA4St *statusDbf ;
 | |
|       struct FIELD4St *typeFld, *fileNameFld, *offsetFld, *lengthFld ;
 | |
|    #endif
 | |
| #ifdef S4CBPP
 | |
| } ;
 | |
| #else
 | |
| } CODE4 ;
 | |
| #endif
 | |
| 
 | |
| #ifndef S4OFF_MEMO
 | |
| typedef struct
 | |
| {
 | |
|    FILE4     file ;
 | |
|    short      blockSize ;               /* Bytes */
 | |
|    struct DATA4FILESt  S4PTR *data ;
 | |
|    #ifndef S4OFF_MULTI
 | |
|       int fileLock ;                  /* True if file is locked */
 | |
|    #else
 | |
|       int space1 ;
 | |
|    #endif
 | |
| } MEMO4FILE ;
 | |
| #endif /* S4OFF_MEMO */
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| class S4CLASS FILE4SEQ_READ
 | |
| {
 | |
| public:
 | |
| #else
 | |
| typedef struct
 | |
| {
 | |
| #endif
 | |
|    FILE4 S4PTR *file ;
 | |
| 
 | |
|    long  pos ;          /* The next position to read from */
 | |
|    char S4PTR *buffer ;
 | |
|    unsigned nextReadLen ;
 | |
|    unsigned total ;     /* Total buffer length */
 | |
|    unsigned working ;   /* Temporary working buffer length (to help align write) */
 | |
|    unsigned avail ;     /* # of bytes currently available */
 | |
|    #ifdef S4ADVANCE_READ
 | |
|       int doAdvance ;
 | |
|       char S4PTR *buf1 ;
 | |
|       char S4PTR *buf2 ;
 | |
|       unsigned int buf1status, buf2status ;
 | |
|       int buf1avail ;
 | |
|       int buf2avail ;
 | |
|    #endif
 | |
| #ifdef S4CBPP
 | |
| } ;
 | |
| #else
 | |
| } FILE4SEQ_READ ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| class S4CLASS FILE4SEQ_WRITE
 | |
| {
 | |
| public:
 | |
| #else
 | |
| typedef struct
 | |
| {
 | |
| #endif
 | |
|    FILE4 S4PTR *file ;
 | |
| 
 | |
|    long  pos ;          /* The next position to read from */
 | |
|    char S4PTR *buffer ;
 | |
|    unsigned total ;     /* Total buffer length */
 | |
|    unsigned working ;   /* Temporary working buffer length (to help align write) */
 | |
|    unsigned avail ;     /* # of bytes left in working buffer */
 | |
|    #ifdef S4WRITE_DELAY
 | |
|       char S4PTR *buf1 ;
 | |
|       char S4PTR *buf2 ;
 | |
|       unsigned buf1len ;
 | |
|       unsigned buf2len ;
 | |
|       int buf1avail ;
 | |
|       int buf2avail ;
 | |
|    #endif
 | |
| #ifdef S4CBPP
 | |
| } ;
 | |
| #else
 | |
| } FILE4SEQ_WRITE ;
 | |
| #endif
 | |
| 
 | |
| typedef struct  /* Data File Format */
 | |
| {
 | |
|    char name[11] ;
 | |
|    char type ;
 | |
|    S4LONG offset ;    /* field's offset into record buffer (for vfp 3.0) */
 | |
|    unsigned char len ;
 | |
|    unsigned char dec ;
 | |
|    #ifdef S4CLIENT_OR_FOX
 | |
|       char nullBinary ;    /* for FOX 3.0 0x02 == allows null fields, 0x04 == binary field */
 | |
|       char filler2[12] ;
 | |
|    #else
 | |
|       char filler2[13] ;
 | |
|    #endif
 | |
|    char hasTag ;
 | |
| } FIELD4IMAGE ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    unsigned short int lo[4] ;
 | |
| /*   signed short int hi ;     significant bit in this field */
 | |
| } CURRENCY4 ;
 | |
| 
 | |
| typedef struct FIELD4St /* Internal Structure and Field Routines. */
 | |
| {
 | |
|    char name[11] ;
 | |
|    unsigned short int len ;
 | |
|    unsigned short int dec ;
 | |
|    short int type ;
 | |
|    short int offset ;
 | |
|    struct DATA4St S4PTR *data ;
 | |
| 
 | |
|    #ifdef S4CLIENT_OR_FOX
 | |
|       char null ;
 | |
|       unsigned short int nullBit ;   /* bit which indicates whether field contents currently are null */
 | |
|       char binary ;
 | |
|    #endif
 | |
|    #ifndef S4OFF_MEMO
 | |
|       struct F4MEMOSt S4PTR *memo ;
 | |
|    #endif
 | |
|    #ifdef S4VBASIC
 | |
|       short int debugInt ;         /* used to check structure integrity (set to 0x5281) */
 | |
|    #else
 | |
|       short int space1 ;
 | |
|    #endif
 | |
| } FIELD4 ;
 | |
| 
 | |
| #ifndef S4OFF_MEMO
 | |
| typedef struct F4MEMOSt
 | |
| {
 | |
|    S4CONV( int isChanged, int is_changed ) ;
 | |
|    int status ;           /* 0 - Current contents, 1 - Unknown */
 | |
|    char  S4PTR *contents ;
 | |
|    unsigned int len ;
 | |
|    S4CONV( unsigned int lenMax, unsigned int len_max ) ;
 | |
|    FIELD4  S4PTR *field ;
 | |
| } F4MEMO ;
 | |
| #endif
 | |
| 
 | |
| typedef struct  /* Creating Data File */
 | |
| {
 | |
|    char S4PTR *name ;
 | |
|    short int type ;
 | |
|    unsigned short int len ;
 | |
|    unsigned short int dec ;
 | |
|    unsigned short int nulls ;  /* are nulls allowed? */
 | |
| } FIELD4INFO ;
 | |
| 
 | |
| #ifdef S4SERVER
 | |
| typedef struct
 | |
| {
 | |
|    char append ;
 | |
|    char delet ;
 | |
|    char update ;
 | |
|    char index ;
 | |
|    char alter ;
 | |
|    char refer ;
 | |
|    char compress ;
 | |
|    char read ;
 | |
|    char open ;    /* virtual field */
 | |
| } AUTHORIZE4 ;
 | |
| #endif
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    /* Database Header Information */
 | |
|    char     version ;
 | |
|    char     yy ;             /* Last Update */
 | |
|    char     mm ;
 | |
|    char     dd ;
 | |
|    S4LONG   numRecs ;
 | |
|    unsigned short headerLen; /* Header Length, Indicates start of data */
 | |
|    unsigned short recordLen;
 | |
|    char     zero[16] ;
 | |
|    char     hasMdxMemo ;    /* 0x01 for has mdx, in fox 0x02 for has memo */
 | |
|    char     codePage ;
 | |
|    char     zero2[2] ;
 | |
| } DATA4HEADER_FULL ;
 | |
| 
 | |
| typedef struct DATA4FILESt
 | |
| {
 | |
|    LINK4 link ;
 | |
| 
 | |
|    S4CONV( unsigned int recWidth, unsigned int record_width ) ;
 | |
| 
 | |
|    unsigned short int infoLen ;
 | |
| 
 | |
|    int nFields ;         /* The number of data fields in the database */
 | |
|    int nFieldsMemo ;     /* The number of memo fields in the database */
 | |
| 
 | |
|    long minCount ;
 | |
|    long userCount ;      /* number of DATA4's that are using this DATA4FILE */
 | |
| 
 | |
|    CODE4 S4PTR *c4 ;
 | |
|    char S4PTR *info ;
 | |
| 
 | |
|    #ifndef S4CLIENT
 | |
|       char S4PTR *record ;
 | |
|    #else
 | |
|       char S4PTR *space1 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_WRITE
 | |
|       int doDate ;    /* does the date need to be updated on unlock/close? */
 | |
|    #endif
 | |
| 
 | |
|    /**** the next set of lines must remain in order as they are a file view ****/
 | |
|    /* Database Header Information */
 | |
|    char version ;
 | |
|    #ifndef S4CLIENT
 | |
|       char     yy ;             /* Last Update */
 | |
|       char     mm ;
 | |
|       char     dd ;
 | |
|    #else
 | |
|       char space3 ;
 | |
|       char space4 ;
 | |
|       char space5 ;
 | |
|    #endif
 | |
|    S4LONG   numRecs ;
 | |
|    unsigned short headerLen ; /* Header Length, Indicates start of data */
 | |
|    /**** the previous set of lines must remain in order as they are a file view ****/
 | |
| 
 | |
|    #ifdef S4SERVER
 | |
|       struct SERVER4CLIENTSt S4PTR *singleClient ;   /* only one client has access to the file */
 | |
|       time_t    nullTime ;   /* The last time the datafile had 0 handles, if any */
 | |
|    #else
 | |
|       void S4PTR *space6 ;
 | |
|       time_t space7 ;
 | |
|    #endif
 | |
|    #ifdef S4CLIENT
 | |
|       struct DATA4St S4PTR *fileLock ;
 | |
|       struct DATA4St S4PTR *appendLock ;
 | |
|       struct DATA4St S4PTR *lockTest ;
 | |
|    #else
 | |
|       struct DATA4St S4PTR *space9 ;
 | |
|       struct DATA4St S4PTR *space10 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4CLIENT
 | |
|       char accessName[LEN4PATH+1] ;
 | |
|       LIST4 lockedRecords ;
 | |
|       struct CONNECTION4St S4PTR *connection ;
 | |
|       long serverId ;
 | |
|       int accessMode ;
 | |
|    #endif
 | |
|    #ifndef S4CLIENT
 | |
|       FILE4    file ;
 | |
|       char hasMdxMemo ;        /* Has an MDX and/or a memo file attached to it */
 | |
| 
 | |
|       int fileChanged ;   /* True if the file has been changed since */
 | |
|                                 /* the header has been updated. */
 | |
|       short    blockSize ;
 | |
|       #ifndef S4OFF_MEMO
 | |
|          MEMO4FILE   memoFile ;   /* Memo file handle */
 | |
|       #endif
 | |
| 
 | |
|       int tranStatus ;   /* is this data4file using transactions? */
 | |
|       char valid ;    /* if valid, a close on a datafile will not low-close it */
 | |
|       #ifndef S4OFF_MULTI
 | |
|          #ifdef S4SERVER
 | |
|             struct DATA4St *exclusiveOpen ;
 | |
|          #endif
 | |
|          LIST4    lockedRecords ; /* list of LOCK4's */
 | |
|          long fileServerLock ;    /* which data holds file lock */
 | |
|          long fileClientLock ;    /* which data holds file lock */
 | |
|          long appendClientLock ;  /* True if the file is locked for appending */
 | |
|          long appendServerLock ;  /* True if the file is locked for appending */
 | |
| 
 | |
|          long tempServerLock ;    /* for lock registering */
 | |
|          long tempClientLock ;    /* for lock registering */
 | |
|       #endif
 | |
|    #endif  /* S4CLIENT */
 | |
| 
 | |
|    #ifndef S4OFF_OPTIMIZE
 | |
|       int hiPrio ;   /* used to determine which priority lru list to put block data on and advance group-reads */
 | |
|                      /* '1' if d4seek, -1 if d4skip */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4STAND_ALONE
 | |
|       char openMdx ;       /* does the datafile have an open production file attatched to it */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef N4OTHER
 | |
|       LIST4 tagfiles ;
 | |
|       unsigned long indexLocked ;
 | |
|    #else
 | |
|       LIST4    indexes ;        /* list of INDEX4FILE;s */
 | |
|       unsigned long space99 ;
 | |
|    #endif
 | |
| } DATA4FILE ;
 | |
| 
 | |
| typedef struct DATA4St
 | |
| {
 | |
|    LINK4 link ;
 | |
| 
 | |
|    #ifdef S4SERVER
 | |
|       int accessMode ;              /* in what mode did the client open the data file */
 | |
|    #endif
 | |
|    int bofFlag ;
 | |
|    int eofFlag ;
 | |
|    int readOnly ;
 | |
|    S4CONV( int recordChanged, int record_changed ) ; /* T/F */
 | |
|    S4LONG count ;                /* a fairly current record count on the database */
 | |
|    S4CONV( S4LONG recNum, S4LONG rec_num ) ;               /* Record number; -1 unknown; 0 for append */
 | |
|    S4LONG recNumOld ;            /* Record number, -1 none present; 0 for append */
 | |
| 
 | |
|    char S4PTR *groupRecordAlloc ;   /* if the current and old record allocations
 | |
|                                        allocated at the same time? */
 | |
|    char S4PTR *record ;          /* Data allocated with 'u4alloc' */
 | |
|    char S4PTR *recordOld ;       /* Data allocated with 'u4alloc' */
 | |
|                                  /* Extra byte added for temporary CTRL_Z */
 | |
|    char alias[LEN4DATA_ALIAS+1] ;
 | |
| 
 | |
|    S4CONV( CODE4 S4PTR *codeBase, CODE4 S4PTR *code_base ) ;
 | |
| 
 | |
|    TRAN4 S4PTR *trans ;
 | |
| 
 | |
|    FIELD4  S4PTR *fields ;       /* An array of field pointers */
 | |
| 
 | |
|    LIST4 indexes ;               /* list of INDEX4's */
 | |
| 
 | |
|    struct TAG4St *tagSelected ;
 | |
| 
 | |
|    int    codePage ;
 | |
| 
 | |
|    DATA4FILE *dataFile ;
 | |
| 
 | |
|    #ifndef S4OFF_MEMO
 | |
|       S4CONV( F4MEMO S4PTR *fieldsMemo, F4MEMO S4PTR *fields_memo ) ;    /* A list of fields to be flushed */
 | |
|       #ifndef S4OFF_MULTI
 | |
|          char memoValidated ; /* Can we be sure memo id #'s are up to date. */
 | |
|       #endif
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_TRAN
 | |
|       #ifndef S4CLIENT
 | |
|          int logVal ;
 | |
|       #endif
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4VBASIC
 | |
|       int debugInt ;      /* used to check structure integrity (set to 0x5281) */
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4SERVER
 | |
|       long clientId ;
 | |
|       long serverId ;
 | |
|       #ifndef S4OFF_SECURITY
 | |
|          int owner ;     /* set to true if the DATA4 is owner of the table */
 | |
|          AUTHORIZE4 authorize ;
 | |
|       #endif
 | |
|    #else
 | |
|       long clientId ;
 | |
|    #endif
 | |
| } DATA4 ;
 | |
| 
 | |
| typedef void S4OPERATOR(void) ;
 | |
| 
 | |
| /* NOTE: IT IS CRITICAL THAT THE FOLLOWING STRUCTURE'S MEMBERS ARE NOT
 | |
|    RE-ORDERED. */
 | |
| typedef struct E4INFOSt
 | |
| {
 | |
|    short int fieldNo ;   /* field no in data structure -- since FIELD4 may be transient */
 | |
|    FIELD4 S4PTR *fieldPtr ;
 | |
|    int localData ;       /* true if the fieldPtr points to a local data4 */
 | |
|    char S4PTR *p1 ;
 | |
|    int len ;         /* Length */
 | |
|    int numEntries ; /* Number of entries in sub-expression */
 | |
|    int numParms ;
 | |
|    int resultPos ;  /* The position in the result array for result. */
 | |
|    int i1 ;          /* Could be constant position. 'i1' and 'resultPos'
 | |
|                        and 'functionI' and 'function'
 | |
|                        must be at last position due to memcmp() in e4isTag() */
 | |
|    int functionI ;
 | |
|    S4OPERATOR S4PTR *function ;
 | |
| } E4INFO ;
 | |
| 
 | |
| typedef struct e4exprSt
 | |
| {
 | |
|    E4INFO S4PTR *info ;
 | |
|    int infoN ;
 | |
|    S4CONST char S4PTR *source ;
 | |
|    char S4PTR *constants ;
 | |
|    int len, type ;
 | |
|    struct TAG4FILESt S4PTR *tagPtr ;
 | |
|    #ifdef S4FOX
 | |
|       struct T4VFPSt S4PTR *vfpInfo ;
 | |
|    #else
 | |
|       void S4PTR *space1 ;
 | |
|    #endif
 | |
|    DATA4 S4PTR *data ;
 | |
|    DATA4FILE S4PTR *dataFile ;
 | |
|    S4CONV( CODE4 S4PTR *codeBase, CODE4 S4PTR *code_base ) ;
 | |
| 
 | |
|    unsigned int lenEval ;     /* This is the length of the buffer needed for evaluation. */
 | |
|    int numParms ;    /* This is the # of parameter positions used in evaluation. */
 | |
|    char hasTrim ;    /* special case for key evaluation */
 | |
|    #ifdef S4CLIPPER
 | |
|       int keyDec, keyLen ;   /* used for CLIPPER version */
 | |
|    #endif
 | |
| } EXPR4 ;
 | |
| 
 | |
| #ifndef S4CLIENT
 | |
| 
 | |
| #ifdef N4OTHER
 | |
|    typedef struct
 | |
|    {
 | |
|       long  pointer ;    /* =0L if record, not pointer */
 | |
|       long  num ;
 | |
|       unsigned char  value[1] ;  /* The key size is variable */
 | |
|    } B4KEY_DATA ;
 | |
| #else
 | |
|    typedef struct
 | |
|    {
 | |
|       S4LONG num ;
 | |
|       unsigned char  value[1] ;  /* The key size is variable */
 | |
|    } B4KEY_DATA ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4FOX
 | |
| /* the following structure is used only on the leaf nodes of the tree structure */
 | |
| typedef struct
 | |
| {
 | |
|    short            freeSpace ;        /* # bytes available in node */
 | |
|    unsigned char    recNumMask[4] ;      /* record number mask */
 | |
|    unsigned char    dupByteCnt ;      /* duplicate byte mask count */
 | |
|    unsigned char    trailByteCnt ;    /* Trailing byte mask count */
 | |
|    unsigned char    recNumLen ;       /* # bits used for record number */
 | |
|    unsigned char    dupCntLen ;       /* # bits used for duplicate count */
 | |
|    unsigned char    trailCntLen ;     /* # bits used for trail count */
 | |
|    unsigned char    infoLen ;          /* # bytes for holding record number, */
 | |
| } B4NODE_HEADER ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    short      nodeAttribute ;    /* 0=index, 1=root, 2=leaf */
 | |
|    short      nKeys ;            /* Block Image starts here */
 | |
|    S4LONG     leftNode ;         /* -1 if not present */
 | |
|    S4LONG     rightNode ;        /* -1 if not present */
 | |
| } B4STD_HEADER ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    struct TAG4FILESt  S4PTR *tag ;
 | |
| 
 | |
|    int changed ;
 | |
|    S4LONG  fileBlock ;     /* Identifies block within index file */
 | |
|    int keyOn ;         /* The current key within the block */
 | |
|    int curTrailCnt ;  /* current value used for seeking */
 | |
|    int curDupCnt ;    /* current value used for seeking */
 | |
|    int dupPos ;        /* bit offset into the info for the duplicate data */
 | |
|    int trailPos ;      /* bit offset into the info for the trail data */
 | |
|    int recPos ;        /* bit offset into the info for the record # data */
 | |
|    char  *curPos ;       /* current position into the data (starts at end) */
 | |
| 
 | |
|    int builtOn ;       /* the 'current' key value (i.e. key really 'on') */
 | |
|    char  S4PTR *builtPos ;     /* position where built on */
 | |
|    B4KEY_DATA S4PTR *builtKey ;
 | |
| 
 | |
|    B4STD_HEADER header ;
 | |
|    B4NODE_HEADER nodeHdr ;    /* only if the block is a leaf */
 | |
|    char  data[1] ;        /* the remaining data */
 | |
| } B4BLOCK ;
 | |
| 
 | |
| #endif  /* ifdef S4FOX  */
 | |
| 
 | |
| #ifndef S4FOX
 | |
| 
 | |
| #ifdef S4NDX
 | |
|    typedef struct
 | |
|    {
 | |
|       long     root ;
 | |
|       long     eof ;
 | |
|       char     n1dummy ;
 | |
|       char     type ;
 | |
|       char     n2dummy[2] ;
 | |
|       short    keyLen  ;
 | |
|       short    keysMax ;           /* Maximum # of keys per block;  <= 100 */
 | |
|       short    intOrDate ;        /* TRUE (1) if Numeric or Date Key */
 | |
|       short    groupLen ;          /* keyLen plus 8 increased to a multiple of 2 */
 | |
|       short    dummy ;
 | |
|       short    unique ;             /* TRUE if Unique */
 | |
| 
 | |
|  /*   char     expression[256] ; */
 | |
|  /*   long     version ; */
 | |
|    } I4IND_HEAD_WRITE;
 | |
| #else
 | |
|    #ifdef S4CLIPPER
 | |
|       typedef struct
 | |
|       {
 | |
|          short          sign ;
 | |
|          short          version ;
 | |
|          long           root ;          /* Root Block */
 | |
|          long           eof ;           /* First Free Block Pointer */
 | |
|          short          groupLen ;     /* Key Length + 2*sizeof(long) */
 | |
|          short          keyLen ;       /* Key Length */
 | |
|          short          keyDec ;       /* Number of Decimals in Key */
 | |
|          short          keysMax ;      /* Maximum # of keys per block;  <= 100 */
 | |
|          short          keysHalf ;     /* Maximum # of keys per half block */
 | |
| 
 | |
|     /*   char           expression[256];   The index expression corresponding to the database. */
 | |
|     /*   short          unique   ;         TRUE if Unique */
 | |
|       } I4IND_HEAD_WRITE;
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4NDX
 | |
| typedef struct
 | |
| {
 | |
|    S4LONG   oldVersion ;
 | |
|    int headerOffset ;
 | |
| 
 | |
|    S4LONG   root ;
 | |
|    S4LONG     eof ;
 | |
|    char     n1dummy ;
 | |
|    char     type ;
 | |
|    char     n2dummy[2] ;
 | |
|    short    keyLen  ;
 | |
|    short    keysMax ;           /* Maximum # of keys per block;  <= 100 */
 | |
|    short    intOrDate ;        /* TRUE (1) if Numeric or Date Key */
 | |
|    short    groupLen ;          /* keyLen plus 8 increased to a multiple of 2 */
 | |
|    short    dummy ;
 | |
|    short    unique ;             /* TRUE if Unique */
 | |
| /* char     expression[256] ; */
 | |
|    S4LONG   version ;
 | |
| }  T4HEADER ;
 | |
| #else
 | |
|    #ifdef S4CLIPPER
 | |
|       typedef struct
 | |
|       {
 | |
|          short      oldVersion ;
 | |
|          int headerOffset ;
 | |
|          S4LONG     virtualEof ;   /* The next available file block */
 | |
|          short      sign ;
 | |
|          short      version ;
 | |
|          S4LONG     root ;          /* Root Block */
 | |
|          S4LONG     eof ;           /* First Free Block Pointer */
 | |
|          short      groupLen ;     /* Key Length + 2*sizeof(long) */
 | |
|          short      keyLen ;       /* Key Length */
 | |
|          short      keyDec ;       /* Number of Decimals in Key */
 | |
|          short      keysMax ;      /* Maximum # of keys per block;  <= 100 */
 | |
|          short      keysHalf ;     /* Maximum # of keys per half block */
 | |
|       /* char       expression[256] ;   The index expression corresponding to the database. */
 | |
|          short      unique   ;      /* TRUE if Unique */
 | |
|          short      descending ;     /* The descending flag corresponding to the index file */
 | |
|       /* char       filter[256] ;   The filter(for) expression corresponding to the database. */
 | |
|       }  T4HEADER ;
 | |
|    #else
 | |
|       typedef struct
 | |
|       {
 | |
|          char   two ;                /* Version number (currently 2) */
 | |
|          char   yymmdd[3] ;          /* Date of last reindex */
 | |
|          char   dataName[12] ;      /* Name of associated data file */
 | |
|          char   dummy1[4] ;          /* extra 4 bytes for data-names-not used in DOS */
 | |
|          short  blockChunks ;       /* Block Size 1 to 32 (512 byte chunks) */
 | |
|          short  blockRw ;           /* Block Read/Write Size in bytes */
 | |
|          char   isProduction ;      /* 1 if production index, else 0 */
 | |
|          char   numSlots ;          /* number possible tags (48) */
 | |
|          short  slotSize ;          /* number bytes/tag slot (32) */
 | |
|          short  numTags ;
 | |
|          short  dummy2 ;
 | |
|          S4LONG eof ;
 | |
|          S4LONG freeList ;          /* start of the free list */
 | |
|          char   zero[4] ;
 | |
|          char   createDate[3];      /* not used by CodeBase */
 | |
|          char   blank ;
 | |
|       }  I4HEADER ;
 | |
|    #endif     /*   ifdef S4CLIPPER  */
 | |
| #endif     /*   ifdef S4NDX   */
 | |
| #endif     /*   ifndef S4FOX  */
 | |
| 
 | |
| 
 | |
| #ifndef S4FOX
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    struct TAG4FILESt  S4PTR *tag ;
 | |
| 
 | |
|    S4LONG  fileBlock ;  /* Identifies block within index file */
 | |
|    int changed ;
 | |
|    int keyOn ;      /* The current key within the block */
 | |
| 
 | |
|    short      nKeys ; /* Block Image starts here */
 | |
|    #ifdef S4NDX
 | |
|       char       dummy[2] ;
 | |
|       B4KEY_DATA data ;
 | |
|    #else
 | |
|       #ifdef S4CLIPPER
 | |
|          short pointers[( B4BLOCK_SIZE / 2 - 1 )] ;
 | |
|          B4KEY_DATA S4PTR *data ;
 | |
|       #else
 | |
|          char       dummy[6] ;
 | |
|          B4KEY_DATA info ;
 | |
|       #endif
 | |
|    #endif
 | |
| } B4BLOCK ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    S4LONG headerPos ;          /* Header position (in 512 byte chunks) */
 | |
|    char  tag[10] ;
 | |
|    short x1000 ;               /* used for dBASE/SQL expression type - dBASE only allowed for CBPP 1.0x */
 | |
|    char  leftChld ;
 | |
|    char  rightChld ;
 | |
|    char  parent ;
 | |
|    char  x2 ;
 | |
|    char  indexType ;
 | |
|    char  zeros[11] ;
 | |
| } T4DESC ;
 | |
| #endif     /* ifndef  S4FOX  */
 | |
| 
 | |
| #ifndef N4OTHER
 | |
| typedef struct
 | |
| {
 | |
| #ifdef S4FOX
 | |
|    S4LONG         root ;            /* -1 means unknown */
 | |
|    S4LONG         freeList ;       /* start of the free list (-1 if none) */
 | |
|    unsigned S4LONG version ;        /* used multi-user only */
 | |
|    short          keyLen ;         /* Key Length */
 | |
|    unsigned char  typeCode;        /* 0x01 Uniq; 0x08 For Clause; 0x32 Compact; 0x80 Compound */
 | |
|    unsigned char  signature ;       /* unused */
 | |
| 
 | |
| /* char           dummy2[482] ;        unused */
 | |
| 
 | |
|    char           sortSeq[8] ;    /* collating sequence (ie GENERAL) */
 | |
|    char           dummy3[4] ;
 | |
|    short          descending   ;    /* 1 = descending, 0 = ascending */
 | |
|    short          filterPos ;      /* not used, == to exprLen */
 | |
|    short          filterLen ;      /* length of filter clause */
 | |
|    short          exprPos ;        /* not used, == to 0  */
 | |
|    short          exprLen ;        /* length of expression */
 | |
| /* char           exprPool[512] ;  expression and filter pool */
 | |
| #else
 | |
|    S4LONG         root ;            /* -1 means unknown */
 | |
|    char           dummy1[4] ;
 | |
|    char           typeCode;        /* 0x10 Normal; 0x58 Uniq,Desc; 0x50 Uniq; 0x18 Desc */
 | |
|    char           type ;            /* N,D, or C (F is type N)  */
 | |
|    char           dummy2[2] ;
 | |
|    short          keyLen ;
 | |
|    short          keysMax ;        /* Maximum # of keys per block;  <= 100  */
 | |
|    char           dummy3[2] ;       /* 1 if Numeric or Date Key (NDX only) */
 | |
|    short          groupLen ;       /* keyLen plus 4 (MDX); plus 8 (NDX) */
 | |
|    unsigned char  version ;
 | |
|    char           dummy4 ;
 | |
|    short          unique   ;        /* 0x4000 (TRUE)if Unique */
 | |
| 
 | |
|    /* Note, 'exprKey[220]' comes after 'unique' and */
 | |
|    /*       'exprFilter[220]' comes at position 0x2FA */
 | |
| #endif
 | |
| }  T4HEADER ;
 | |
| 
 | |
| #ifdef S4FOX   /* info on codepage and collating sequence */
 | |
| typedef struct T4VFPSt
 | |
| {
 | |
|    int              codePage ;    /* codepage of database file */
 | |
|    int              sortType ;    /* collating seq of tag in index file */
 | |
|    translatedChars  *tablePtr ;   /* points to translation table */
 | |
|    compressedChars  *compPtr;     /* points to compressed char table */
 | |
|    unsigned char    *cpPtr ;      /* points to codepage table */
 | |
| } T4VFP ;
 | |
| #endif
 | |
| #endif   /*  ifndef N4OTHER  */
 | |
| 
 | |
| #endif   /*  ifdef S4CLIENT */
 | |
| 
 | |
| typedef struct TAG4FILESt
 | |
| {
 | |
|    LINK4   link ;
 | |
|    #ifndef N4OTHER
 | |
|       struct INDEX4FILESt S4PTR *indexFile ;
 | |
|    #else
 | |
|       void S4PTR *space1 ;
 | |
|    #endif
 | |
|    char    alias[LEN4TAG_ALIAS+1] ;
 | |
|    CODE4 S4PTR *codeBase ;
 | |
|    int debugInt ;  /* used to check structure integrity (set to 0x5281) */
 | |
| 
 | |
|    #ifdef N4OTHER
 | |
|       int userCount ;
 | |
|    #else
 | |
|       int space2 ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4CLIENT
 | |
|       char S4PTR *exprPtr ;
 | |
|       char S4PTR *filterPtr ;
 | |
|       short int errUniqueHold ;
 | |
|    #else
 | |
|       EXPR4   S4PTR  *expr ;
 | |
|       EXPR4   S4PTR  *filter ;
 | |
|       S4CMP_FUNCTION *cmp ;
 | |
|       C4STOK S4PTR   *stok ;        /* Conversion for 'seek' */
 | |
|       C4DTOK S4PTR   *dtok ;        /* Conversion for 'seek' */
 | |
|       #ifdef S4MDX
 | |
|          char         hadKeys ;
 | |
|       #else
 | |
|          char         space3 ;
 | |
|       #endif
 | |
|       char            hasKeys ;
 | |
| 
 | |
|       LIST4           blocks ;
 | |
|       LIST4           saved ;
 | |
| 
 | |
|       #ifdef S4FOX
 | |
|          char         pChar ;
 | |
|          T4VFP     vfpInfo ;
 | |
|       #else
 | |
|          char         space4 ;
 | |
|          char         space5 ;     /* modify appropriately when above workaround is combined */
 | |
|       #endif
 | |
| 
 | |
|       #ifdef S4CLIPPER
 | |
|          S4LONG       checkEof ;     /* used for debug purposes to verify eof length */
 | |
|       #else
 | |
|          S4LONG       space6 ;
 | |
|       #endif
 | |
| 
 | |
|       #ifdef N4OTHER
 | |
|          FILE4 file ;
 | |
|          S4LONG fileLocked ;
 | |
|          MEM4 S4PTR *blockMemory ;
 | |
|          #ifndef S4OFF_OPTIMIZE
 | |
|             struct TAG4FILESt *readBlockTag ;    /* used for optimization -- is a block-read request occurring? */
 | |
|          #endif
 | |
|       #else
 | |
|          FILE4        space7 ;
 | |
|          S4LONG       space8 ;
 | |
|          void S4PTR  *space9 ;
 | |
|       #endif
 | |
| 
 | |
|       T4HEADER        header ;
 | |
|       S4LONG          headerOffset ;     /* Offset in file to the tag's header info. */
 | |
|       int rootWrite ;        /* True if 'header.root' needs to be written */
 | |
|       int keyDec ;
 | |
|       #ifdef S4FOX
 | |
|          MEM4 *builtKeyMemory ;
 | |
|       #endif
 | |
|       #ifdef S4MDX
 | |
|          S4LONG       changed ;
 | |
|       #endif
 | |
|       #ifdef S4UNIX
 | |
|          int keyType ;
 | |
|       #endif
 | |
|    #endif
 | |
| } TAG4FILE ;
 | |
| 
 | |
| typedef struct TAG4St
 | |
| {
 | |
|    LINK4   link ;
 | |
|    struct  INDEX4St S4PTR *index ;
 | |
|    TAG4FILE *tagFile ;
 | |
|    /* this uniqueError MUST be 0 if the tag is not unique */
 | |
|    short int errUnique ; /* Is rewriting a unique key an error ? */
 | |
|    #ifndef S4OFF_TRAN
 | |
|       int isValid ;
 | |
|    #endif
 | |
|    #ifndef S4CLIENT
 | |
|       #ifndef S4OFF_TRAN
 | |
|          LIST4 removedKeys ;     /* list of temporarily removed keys for r4unique and e4unique cases */
 | |
|       #endif
 | |
|       int added, removed ;             /* was an entry added, removed */
 | |
|    #endif
 | |
| } TAG4 ;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    char S4PTR  *name ;
 | |
|    S4CONST char S4PTR  *expression ;
 | |
|    S4CONST char S4PTR  *filter ;
 | |
|    short int unique ;
 | |
|    unsigned short int descending ;
 | |
| } TAG4INFO ;
 | |
| 
 | |
| #ifndef N4OTHER
 | |
| typedef struct INDEX4FILESt
 | |
| {
 | |
|    LINK4  link ;
 | |
| 
 | |
|    LIST4  tags ;
 | |
|    int userCount ;
 | |
|    CODE4 S4PTR *codeBase ;
 | |
|    DATA4FILE S4PTR *dataFile ;
 | |
| 
 | |
|    #ifdef S4CLIENT
 | |
|       char accessName[LEN4PATH+1] ;
 | |
|       int autoOpened ;
 | |
|       long clientId, serverId ;
 | |
|       #ifdef S4VBASIC
 | |
|          short int debugInt ;         /* used to check structure integrity (set to 0x5281) */
 | |
|       #else
 | |
|          short int space1 ;
 | |
|       #endif
 | |
|    #else
 | |
|       FILE4  file ;
 | |
|       MEM4 S4PTR *blockMemory ;
 | |
|       long fileLocked ;
 | |
| 
 | |
|       #ifdef S4FOX
 | |
|          TAG4FILE S4PTR *tagIndex ;    /* the tags are a tag in the index file! */
 | |
|          long  eof ;
 | |
|          unsigned long  versionOld ;
 | |
|       #else
 | |
|          TAG4FILE S4PTR *space2 ;
 | |
|          long space3 ;
 | |
|          unsigned long space4 ;
 | |
|       #endif
 | |
| 
 | |
|       #ifdef S4MDX
 | |
|          I4HEADER header ;
 | |
|          long  changed ;
 | |
|       #endif
 | |
| 
 | |
|       #ifndef S4OFF_OPTIMIZE
 | |
|          TAG4FILE *readBlockTag ;    /* used for optimization -- is a block-read request occurring? */
 | |
|       #endif
 | |
|    #endif
 | |
| } INDEX4FILE ;
 | |
| #endif
 | |
| 
 | |
| typedef struct INDEX4St
 | |
| {
 | |
|    LINK4  link ;
 | |
|    LIST4  tags ;
 | |
| 
 | |
|    DATA4 S4PTR *data ;
 | |
|    CODE4 S4PTR *codeBase ;
 | |
| 
 | |
|    #ifndef S4OFF_TRAN
 | |
|       int isValid ;
 | |
|    #endif
 | |
|    #ifndef N4OTHER
 | |
|       INDEX4FILE *indexFile ;
 | |
|    #endif
 | |
|    #ifdef S4CLIENT
 | |
|       char alias[LEN4DATA_ALIAS+1] ;
 | |
|    #else
 | |
|       char accessName[LEN4PATH+1] ;
 | |
|       #ifdef N4OTHER
 | |
|          FILE4 file ;
 | |
| /*         char alias[LEN4TAG_ALIAS+1] ;*/
 | |
|          char S4PTR *path ;
 | |
|          long  versionOld ;
 | |
|       #else
 | |
|          FILE4 space1 ;
 | |
|          char S4PTR *space2 ;
 | |
|          long space3 ;
 | |
|       #endif
 | |
|    #endif
 | |
| } INDEX4 ;
 | |
| 
 | |
| #ifndef S4OFF_TRAN
 | |
| #ifndef S4CLIENT
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    long recno ;
 | |
|    unsigned char key[1] ;   /* of variable length, but marked as '1' for a place holder */
 | |
| } TAG4KEY_REMOVED ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef S4CLIENT
 | |
| 
 | |
| /* Memo File Structures */
 | |
| typedef struct
 | |
| {
 | |
|    #ifdef S4MFOX
 | |
|       S4LONG  nextBlock ;  /* Memo Entry 1,2, ... */
 | |
|       char  usused[2] ;
 | |
|       short blockSize ;  /* Bytes */
 | |
|    #else
 | |
|       #ifdef S4MNDX
 | |
|          S4LONG  nextBlock ;  /* Memo Entry 1,2, ... */
 | |
|       #else
 | |
|          S4LONG  nextBlock ;  /* Memo Entry 1,2, ... */
 | |
|          S4LONG  zero ;
 | |
|          char  fileName[8] ;
 | |
|          short zero2 ;
 | |
|          short x102 ;
 | |
|          short blockSize ;  /* Bytes */
 | |
|          short zero3 ;
 | |
|       #endif
 | |
|    #endif
 | |
| } MEMO4HEADER ;
 | |
| 
 | |
| #ifndef S4MNDX
 | |
| #ifndef S4MFOX
 | |
| typedef struct
 | |
| {
 | |
|    S4LONG  next ;     /* The next free block area */
 | |
|    S4LONG  num ;      /* The number of free blocks in the free block area */
 | |
|    int toDisk ;    /* TRUE if this information needs to be written to disk */
 | |
|    S4LONG  blockNo ; /* The current block number */
 | |
| } MEMO4CHAIN_ENTRY ;
 | |
| #endif /*  ifndef S4MFOX  */
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    #ifdef S4MFOX
 | |
|       S4LONG type ;         /* 0 for picture, 1 for text, 2 for OLE -- picture not supported */
 | |
|       S4LONG numChars ;    /* Including the 'MemoBlock' */
 | |
|    #else
 | |
|       short minusOne ;    /* '-1' for dBASE IV */
 | |
|       short startPos ;
 | |
|       S4LONG  numChars ;    /* Including the 'MemoBlock' */
 | |
|    #endif
 | |
| } MEMO4BLOCK ;
 | |
| #endif  /*  ifndef S4MNDX  */
 | |
| #endif  /*  ifndef S4CLIENT  */
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|    unsigned  char  sigDig ;  /* The number of significant digits; 52 is zero */
 | |
|    unsigned  char  digitInfo ; /* contains one, len and sign */
 | |
|    unsigned  char  bcd[10] ;
 | |
| }  C4BCD ;
 | |
| 
 | |
| #ifndef S4OFF_MULTI
 | |
| /* for a single lock */
 | |
| typedef struct
 | |
| {
 | |
|    short int type ;
 | |
|    long recNum ;    /* if appropriate */
 | |
|    long clientId ;
 | |
|    long serverId ;
 | |
| } LOCK4ID ;
 | |
| 
 | |
| typedef struct LOCK4St
 | |
| {
 | |
|    LINK4 link ;
 | |
|    #ifdef S4CLIENT
 | |
|       DATA4 *data ;
 | |
|    #else
 | |
|       DATA4FILE *data ;
 | |
|    #endif
 | |
| 
 | |
|    LOCK4ID id ;
 | |
| } LOCK4 ;
 | |
| 
 | |
| #ifndef S4SERVER
 | |
| typedef struct
 | |
| {
 | |
|    LINK4 link ;
 | |
|    DATA4 *data ;
 | |
|    long   recNo ;
 | |
| } LOCK4LINK ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4USE_LOW_MEMORY
 | |
| typedef union
 | |
| {
 | |
|    unsigned long block ;
 | |
|    struct
 | |
|    {
 | |
|       unsigned short protect ;
 | |
|       unsigned short real ;
 | |
|    } ptr ;
 | |
| } FIXED4MEM ;
 | |
| #else
 | |
| typedef void * FIXED4MEM ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4TESTING
 | |
| #ifndef S4SERVER
 | |
| typedef struct
 | |
| {
 | |
|    unsigned char T4SUITE[255] ;
 | |
|    unsigned char T4RECNO[100] ;
 | |
| } ATS4RECINFO ;
 | |
| #endif
 | |
| #endif
 |