/************ DAE: OS/2 Database Access Engine *************/ /************ daedef.h: DAE Global Definitions *************/ /***********************************************************/ /******************* fundamental types *********************/ /***********************************************************/ #include "os.h" /***********************************************************/ /****************** global configuration macros ************/ /***********************************************************/ #ifndef WIN16 /* for OS/2 or Win32 */ #define ASYNC_IO_PROC /* asynchronous IO */ #define ASYNC_LOG_FLUSH /* asynchronous LOG FLUSH */ #define ASYNC_BF_CLEANUP /* asynchorouse Buffer clean up */ #define ASYNC_VER_CLEANUP /* asynchronous Bucket clean up */ #define ASYNC_BM_CLEANUP /* asynchorouse Bookmark clean up */ #endif #define CHECKSUM /* check sum for read/write page validation */ //#define PERFCNT /* enable performance counter */ //#define NOLOG /* Log disabled? */ #define REUSEDBID /* Reuse DBID */ //#define RFS2 //#define MEM_CHECK /* Check for resource and memory leakage */ //#define KEYCHANGED #define BULK_INSERT_ITEM #define MOVEABLEDATANODE /***********************************************************/ /******************* declaration macros ********************/ /***********************************************************/ #ifdef JETINTERNAL /* Start of definitions copied from vtapi.h */ #ifndef NJETNT #ifdef WIN32 /* 0:32 Flat Model (Intel 80x86) */ #define VTAPI __cdecl #elif defined(M_MRX000) /* 0:32 Flat Model (MIPS Rx000) */ #define VTAPI #else /* WIN16 */ /* 16:16 Segmented Model */ #define VTAPI __far __pascal #endif #endif #endif /* End of definitions copied from vtapi.h */ #include "daedebug.h" #define LOCAL static #ifdef DEBUG #define INLINE #else #define INLINE __inline #endif /***********************************************************/ /************ global types and associated macros ***********/ /***********************************************************/ typedef struct _res /* resource, defined in sysinit.c and daeutil.h */ { const INT cbSize; INT cblockAlloc; BYTE *pbAlloc; INT cblockAvail; BYTE *pbAvail; INT iblockCommit; INT iblockFail; } RES; typedef struct _pib PIB; typedef struct _ssib SSIB; typedef struct _fucb FUCB; typedef struct _csr CSR; typedef struct _fcb FCB; typedef struct _fdb FDB; typedef struct _idb IDB; typedef struct _dib DIB; typedef struct _scb SCB; typedef struct _rcehead RCEHEAD; typedef struct _rce RCE; typedef struct _bucket BUCKET; typedef struct _dab DAB; typedef struct _rmpage RMPAGE; typedef struct _bmfix BMFIX; typedef unsigned short LANGID; typedef ULONG LRID; #if WIN32 typedef ULONG PROCID; #else typedef TID PROCID; #endif #define pNil ((void *)0) #define pbNil ((BYTE *)0) #define plineNil ((LINE *)0) #define pkeyNil ((KEY *)0) #define ppibNil ((PIB *)0) #define pwaitNil ((WAIT *)0) #define pssibNil ((SSIB *)0) #define pfucbNil ((FUCB *)0) #define pcsrNil ((CSR *)0) #define pfcbNil ((FCB *)0) #define pfdbNil ((FDB *)0) #define pfieldNil ((FIELD *)0) #define pidbNil ((IDB *)0) #define pscbNil ((SCB *)0) #define procidNil ((PROCID) 0xffff) #define pbucketNil ((BUCKET *)0) #define prceheadNil ((RCEHEAD *)0) #define prceNil ((RCE *)0) #define pdabNil ((DAB *)0) #define prmpageNil ((RMPAGE *) 0) typedef unsigned long PGNO; typedef unsigned long PGDISCONT; typedef unsigned long PN; #define pnNull ((PN) 0) #define pgnoNull ((PGNO) 0) /* UNDONE: should be in storage.h */ #define FVersionPage(pbf) (pbf->ppage->pghdr.cVersion) #define CPG LONG /* count of pages */ typedef BYTE LEVEL; /* transaction levels */ #define levelNil ((LEVEL)0xff) /* flag for inactive PIB */ typedef WORD DBID; typedef WORD FID; typedef SHORT IDXSEG; /* Standard Record IDs */ typedef ULONG SRID; /* standard record id */ typedef ULONG LINK; #define PgnoOfSrid(srid) ((srid)>>8) #define ItagOfSrid(srid) ((BYTE)((srid) & 0x000000FF)) #define SridOfPgnoItag(pgno, itag) ((pgno)<<8 | (LONG)(itag)) #define itagNil ((INT)0x0fff) #define sridNull SridOfPgnoItag(pgnoNull, ((BYTE)itagNil)) #define sridNullLink 0 /* position within current series * note order of field is of the essence as log position used by * storage as timestamp, must in ib, isec, usGen order so that we can * use long value compare. */ typedef struct { USHORT ib; /* must be the last so that lgpos can */ USHORT isec; /* index of disksec starting logsec */ USHORT usGeneration; /* generation of logsec */ } LGPOS; /* be casted to TIME. */ extern LGPOS lgposMax; extern LGPOS lgposMin; extern INT fRecovering; /* to turn off logging during Redo */ /***********************************************************/ /*********************** DAE macros ************************/ /***********************************************************/ /* per database operation counter, ulDBTime is logged, used to compare * with the ulDBTime of a page to decide if a redo of the logged operation * is necessary. */ #define ulDBTimeMin (0x00000000) #define ulDBTimeMax (0xffffffff) /* Transaction counter, used to keep track of the oldest transaction. */ typedef ULONG TRX; #define trxMin 0 #define trxMax (0xffffffff) typedef struct { ULONG cb; BYTE *pb; } LINE; #define FLineNull(pline) \ ((pline) == NULL || (pline)->cb == 0 || (pline)->pb == NULL) #define LineCopy(plineTo, plineFrom) \ { \ (plineTo)->cb = (plineFrom)->cb; \ memcpy((plineTo)->pb, (plineFrom)->pb, (plineFrom)->cb); \ } #define CbLine(pline) ((pline) ? (pline)->cb : 0) typedef LINE KEY; // Directory Key #define FKeyNull(pkey) FLineNull(pkey) #define KeyCopy(pkeyTo, pkeyFrom) LineCopy(pkeyTo, pkeyFrom) #define CbKey(pkey) CbLine(pkey) typedef struct { ULONG cbMax; // size of buffer ULONG cbActual; // true size of return value ULONG cbReturned; // length of value returned BYTE *pb; // pointer to buffer for return value } OUTLINE; typedef struct _threebytes { BYTE b[3]; } THREEBYTES; #define ThreeBytesFromL(tb, l) \ { \ ULONG DAE_ul = l; \ BYTE *DAE_ptb = (BYTE *)&(tb); \ *DAE_ptb = (BYTE)DAE_ul; \ *++DAE_ptb = (BYTE)( DAE_ul >>= 8 ); \ *++DAE_ptb = (BYTE)( DAE_ul >>= 8 ); \ } #define LFromThreeBytes(l, tb) \ { \ ULONG DAE_ul; \ BYTE *DAE_ptb = (BYTE *)&(tb) + 2; \ DAE_ul = (ULONG) *DAE_ptb; \ DAE_ul <<= 8; \ DAE_ul |= *--DAE_ptb; \ DAE_ul <<=8; \ DAE_ul |= *--DAE_ptb; \ l = DAE_ul; \ } #define TbKeyFromPgno(tbLast, pgno) \ { \ ULONG DAE_ul = pgno; \ BYTE * DAE_ptb = ((BYTE *)&(tbLast)) + 2; \ *DAE_ptb = (BYTE) (DAE_ul); \ *--DAE_ptb = (BYTE) (DAE_ul >>= 8); \ *--DAE_ptb = (BYTE) (DAE_ul >>= 8); \ } #define PgnoFromTbKey(pgno, tbKey) \ { \ ULONG DAE_ul; \ BYTE * DAE_ptb = (BYTE *) & (tbKey); \ DAE_ul = (ULONG) *DAE_ptb; \ DAE_ul <<= 8; \ DAE_ul |= *++DAE_ptb; \ DAE_ul <<= 8; \ DAE_ul |= *++DAE_ptb; \ pgno = DAE_ul; \ } #define Pb4ByteAlign( pb ) ( ((LONG)pb + 3) & 0xfffffffc ) #define Pb4ByteTruncate( pb ) ( (LONG)pb & 0xfffffffc ) /***********************************************************/ /******************** general C macros *********************/ /***********************************************************/ #define forever for(;;) #ifdef DEBUG #ifdef RFS2 /* RFS/JET call logging /* /* RFS allocator: returns 0 if allocation is disallowed. Also handles RFS logging. /* cRFSAlloc is the global allocation counter. A value of -1 disables RFS in debug mode. /**/ #define RFSAlloc(type) (UtilRFSAlloc(#type)) /* RFS disable/enable macros */ #define RFSDisable() (fDisableRFS = 1) #define RFSEnable() (fDisableRFS = 0) /* JET call logging (log on failure) /**/ #define LogJETCall(func,err) (UtilRFSLogJETCall(#func,err,szAssertFilename,__LINE__)) /* JET call macros /**/ #define Call(func) {LogJETCall(func,err = (func)); if (err < 0) {goto HandleError;}} #define CallR(func) {LogJETCall(func,err = (func)); if (err < 0) {return err;}} #define CallJ(func,label) {LogJETCall(func,err = (func)); if (err < 0) {goto label;}} #define CallS(func) {ERR errT; LogJETCall(func,errT = (func)); Assert(errT == JET_errSuccess);} /* JET inline error logging (logging controlled by JET call flags) /**/ #define LogJETErr(err,label) (UtilRFSLogJETErr(err,#label,szAssertFilename,__LINE__)) /* JET inline error macros /**/ #define Error(errT,label) {LogJETErr(errT,label); err = (errT); goto label;} #else #define RFSAlloc(type) (1) #define RFSDisable() (1) #define RFSEnable() (0) #define Call(func) {if ((err = (func)) < 0) {goto HandleError;}} #define CallR(func) {if ((err = (func)) < 0) {return err;}} #define CallJ( func, label ) {if ((err = (func)) < 0) goto label;} #define Error( errToReturn, label ) {err = errToReturn; goto label;} #define CallS(func) { ERR errT; Assert( (errT = (func)) == JET_errSuccess ); } #endif #else #define RFSAlloc(type) (1) #define RFSDisable() (1) #define RFSEnable() (0) #define Call(func) {if ((err = (func)) < 0) {goto HandleError;}} #define CallR(func) {if ((err = (func)) < 0) {return err;}} #define CallJ(func,label) {if ((err = (func)) < 0) {goto label;}} #define CallS(func) {ERR errT; errT = (func);} #define Error(errT,label) {err = (errT); goto label;} #endif #define NotUsed(p) (p) /***********************************************************/ /***** include Jet Project prototypes and constants ********/ /***********************************************************/ #include "jet.h" #include "_jet.h" #include "_jetstr.h" #include "jetdef.h" #include "sesmgr.h" #include "isamapi.h" #include "vdbapi.h" #include "vtapi.h" #include "disp.h" #include "taskmgr.h" #include "vdbmgr.h" extern CODECONST(VDBFNDEF) vdbfndefIsam; #include "vtmgr.h" extern CODECONST(VTFNDEF) vtfndefIsam; extern CODECONST(VTFNDEF) vtfndefIsamInfo; extern CODECONST(VTFNDEF) vtfndefTTSortIns; extern CODECONST(VTFNDEF) vtfndefTTSortRet; extern CODECONST(VTFNDEF) vtfndefTTBase; JET_TABLEID TableidOfVtid( FUCB *pfucb ); ERR VTAPI ErrDispPrepareUpdate( JET_SESID sesid, JET_TABLEID tableid, JET_GRBIT grbit ); ERR VTAPI ErrDispSetColumn( JET_SESID sesid, JET_TABLEID tableid, JET_COLUMNID columnid, const void *pb, unsigned long cb, JET_GRBIT grbit, JET_SETINFO *psetinfo ); ERR VTAPI ErrDispCloseTable( JET_SESID sesid, JET_TABLEID tableid ); ERR VTAPI ErrDispUpdate( JET_SESID sesid, JET_TABLEID tableid, void *pb, unsigned long cbMax, unsigned long *pcbActual ); ERR VTAPI ErrDispMove( JET_SESID sesid, JET_TABLEID tableid, long crows, JET_GRBIT grbit ); /***********************************************************/ /******************* mutual exclusion **********************/ /***********************************************************/ typedef void * SEM; typedef void * SIG; typedef void * CRIT; /* enable multiple MUTEX resource /**/ #ifdef WIN16 #define SemDefine( s ) #define ErrSemCreate( s, sz ) JET_errSuccess #define SemRequest( s ) 0 #define SemRelease( s ) 0 #define SemAssert( s ) 0 #define ErrSignalCreate( s, sz ) JET_errSuccess #define ErrSignalCreateAutoReset( s, sz ) JET_errSuccess #define SignalReset( s ) 0 #define SignalSend( s ) 0 #define SignalWait( s, t ) 0 #define SignalWaitEx( s, t ) 0 #define MultipleSignalWait( i, rg, f, t ) 0 #define SignalClose( s ) 0 #define ErrInitializeCriticalSection( s ) JET_errSuccess #define EnterCriticalSection( s ) 0 #define LeaveCriticalSection( s ) 0 #define EnterNestableCriticalSection( s ) 0 #define LeaveNestableCriticalSection( s ) 0 #define AssertCriticalSection( s ) 0 #define DeleteCriticalSection( s ) 0 #define SgSemDefine( s ) #define SgErrSemCreate( s, sz ) JET_errSuccess #define SgSemRequest( s ) 0 #define SgSemRelease( s ) 0 #define SgSemAssert( s ) 0 #define LgSemDefine( s ) #define LgErrSemCreate( s, sz ) JET_errSuccess #define LgSemRequest( s ) 0 #define LgSemRelease( s ) 0 #define LgSemAssert( s ) 0 #define LgErrInitializeCriticalSection( s, c ) JET_errSuccess #define LgEnterCriticalSection( s ) 0 #define LgLeaveCriticalSection( s ) 0 #define LgEnterNestableCriticalSection( s ) 0 #define LgLeaveNestableCriticalSection( s ) 0 #define LgAssertCriticalSection( s ) 0 #define LgDeleteCriticalSection( s ) 0 #else /* !WIN16 */ #ifdef SGSEM /* small grain */ #define SemDefine( s ) __near SEM s #define ErrSemCreate( s, sz ) UtilSemCreate( s ) #define SemRequest( s ) UtilSemRequest( s ) #define SemRelease( s ) UtilSemRelease( s ) #define SemAssert( s ) UtilAssertSEM( s ) #define ErrSignalCreate( s, sz ) ErrUtilSignalCreate( s, sz ) #define ErrSignalCreateAutoReset( s, sz ) ErrUtilSignalCreateAutoReset( s, sz ) #define SignalReset( s ) UtilSignalReset( s ) #define SignalSend( s ) UtilSignalSend( s ) #define SignalWait( s, t ) UtilSignalWait( s, t ) #define SignalWaitEx( s, t, f ) UtilSignalWaitEx( s, t, f ) #define MultipleSignalWait( i, rg, f, t ) UtilMultipleSignalWait( i, rg, f, t ) #define SignalClose( s ) UtilCloseSignal( s ) #define ErrInitializeCriticalSection( s ) ErrUtilInitializeCriticalSection( s ) #define EnterCriticalSection( s ) UtilEnterCriticalSection( s ) #define LeaveCriticalSection( s ) UtilLeaveCriticalSection( s ) #define EnterNestableCriticalSection( s ) UtilEnterNestableCriticalSection( s ) #define LeaveNestableCriticalSection( s ) UtilLeaveNestableCriticalSection( s ) #define AssertCriticalSection( s ) UtilAssertCrit( s ) #define HoldCriticalSection( s ) \ { \ UtilAssertCrit( s ); \ UtilHoldCriticalSection( s ); \ } #define ReleaseCriticalSection( s ) { \ UtilAssertCrit( s ); \ UtilReleaseCriticalSection( s );\ } #define DeleteCriticalSection( s ) UtilDeleteCriticalSection( s ) #define SgSemDefine( s ) __near SEM s #define SgErrSemCreate( s, sz ) UtilSemCreate( s, sz ) #define SgSemRequest( s ) UtilSemRequest( s ) #define SgSemRelease( s ) UtilSemRelease( s ) #define SgSemAssert( s ) UtilAssertSEM( s ) #define LgSemDefine( s ) #define LgErrSemCreate( s, sz ) 0 #define LgSemRequest( s ) 0 #define LgSemRelease( s ) 0 #define LgSemAssert( s ) 0 #define LgErrInitializeCriticalSection( s ) JET_errSuccess #define LgEnterCriticalSection( s ) 0 #define LgLeaveCriticalSection( s ) 0 #define LgEnterNestableCriticalSection( s ) 0 #define LgLeaveNestableCriticalSection( s ) 0 #define LgAssertCriticalSection( s ) 0 #define LgDeleteCriticalSection( s ) 0 #else /* !SGSEM */ #define SemDefine( s ) __near SEM s #define SemErrCreate( s, sz ) UtilSemCreate( s, sz ) #define SemRequest( s ) UtilSemRequest( s ) #define SemRelease( s ) UtilSemRelease( s ) #define SemAssert( s ) UtilAssertSEM( s ) #define ErrSignalCreate( s, sz ) ErrUtilSignalCreate( s, sz ) #define ErrSignalCreateAutoReset( s, sz ) ErrUtilSignalCreateAutoReset( s, sz ) #define SignalReset( s ) UtilSignalReset( s ) #define SignalSend( s ) UtilSignalSend( s ) #define SignalWait( s, t ) UtilSignalWait( s, t ) #define SignalWaitEx( s, t, f ) UtilSignalWaitEx( s, t, f ) #define MultipleSignalWait( i, rg, f, t ) UtilMultipleSignalWait( i, rg, f, t ) #define SignalClose( s ) UtilCloseSignal( s ) #define ErrInitializeCriticalSection( s ) ErrUtilInitializeCriticalSection( s ) #define EnterCriticalSection( s ) UtilEnterCriticalSection( s ) #define LeaveCriticalSection( s ) UtilLeaveCriticalSection( s ) #define EnterNestableCriticalSection( s ) UtilEnterNestableCriticalSection( s ) #define LeaveNestableCriticalSection( s ) UtilLeaveNestableCriticalSection( s ) #define AssertCriticalSection( s ) UtilAssertCrit( s ) #define HoldCriticalSection( s ) \ { \ UtilAssertCrit( s ); \ UtilHoldCriticalSection( s ); \ } #define ReleaseCriticalSection( s ) \ { \ UtilAssertCrit( s ); \ UtilReleaseCriticalSection( s );\ } #define DeleteCriticalSection( s ) UtilDeleteCriticalSection( s ) #define SgSemDefine( s ) #define SgErrSemCreate( s, sz ) 0 #define SgSemRequest( s ) UtilAssertCrit( critJet ) #define SgSemRelease( s ) UtilAssertCrit( critJet ) #define SgSemAssert( s ) UtilAssertCrit( critJet ) #define LgSemDefine( s ) __near SEM s; #define LgErrSemCreate( s, sz ) SemCreate( s, sz ) #define LgSemRequest( s ) SemRequest( s ) #define LgSemRelease( s ) SemRelease( s ) #define LgSemAssert( s ) UtilAssertCrit( s ) #define LgErrInitializeCriticalSection( s ) ErrUtilInitializeCriticalSection( s ) #define LgEnterCriticalSection( s ) UtilEnterCriticalSection( s ) #define LgLeaveCriticalSection( s ) UtilLeaveCriticalSection( s ) #define LgEnterNestableCriticalSection( s ) UtilEnterNestableCriticalSection( s ) #define LgLeaveNestableCriticalSection( s ) UtilLeaveNestableCriticalSection( s ) #define LgAssertCriticalSection( s ) UtilAssertCrit( s ) #define LgDeleteCriticalSection( s ) UtilDeleteCriticalSection( s ) #endif /* !SGSEM */ #endif /* !WIN16 */ /* include other global DAE headers /**/ #include "sys.h" #include "err.h" #include "daeconst.h" #define fSTInitNotDone 0 #define fSTInitInProgress 1 #define fSTInitDone 2 extern BOOL __near fSTInit;