Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

604 lines
18 KiB

#ifndef _DAEDEF_H
#define _DAEDEF_H
/* redirect Asserts in inline code to seem to fire from this file
/**/
#define szAssertFilename __FILE__
#include "config.h"
/***********************************************************/
/****************** global configuration macros ************/
/***********************************************************/
#define CHECKSUM /* check sum for read/write page validation */
//#define PERFCNT /* enable performance counter */
//#define NO_LOG /* log disable */
#define REUSE_DBID /* reuse detached database DBIDs */
//#define CHECK_LOG_VERSION
#define PCACHE_OPTIMIZATION /* enable all cache optimizations */
#define PREREAD /* try to preread pages when we read in one direction */
#ifdef DEBUG
#ifdef PREREAD
//#define PREREAD_DEBUG
#endif // PREREAD
#endif // DEBUG
/***********************************************************/
/******************* declaration macros ********************/
/***********************************************************/
#define VTAPI
#include "daedebug.h"
#ifndef PROFILE
#define LOCAL static
#else
#define LOCAL
#endif
// Hack for OLE-DB - make all functions global and non-inline
#ifdef USE_OLEDB
#undef LOCAL
#undef INLINE
#define LOCAL
#define 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;
BYTE *pbPreferredThreshold;
} 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 _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;
typedef ULONG PROCID;
#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->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;
typedef ULONG SRID;
typedef ULONG LINK;
STATIC INLINE PGNO PgnoOfSrid( SRID const srid )
{
return srid >> 8;
}
STATIC INLINE BYTE ItagOfSrid( SRID const srid )
{
return *( (BYTE *) &srid );
}
STATIC INLINE SRID SridOfPgnoItag( PGNO const pgno, LONG const itag )
{
return (SRID) ( ( pgno << 8 ) | (BYTE) itag );
}
#define itagNil ( 0x0FFF )
#define sridNull ( 0x000000FF )
#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, lGen order so that we can
* use little endian integer comparisons.
*/
typedef struct
{
USHORT ib; /* must be the last so that lgpos can */
USHORT isec; /* index of disksec starting logsec */
LONG lGeneration; /* generation of logsec */
} LGPOS; /* be casted to TIME. */
extern LGPOS lgposMax;
extern LGPOS lgposMin;
extern INT fRecovering; /* to turn off logging during Redo */
#define fRecoveringNone 0
#define fRecoveringRedo 1
#define fRecoveringUndo 2
extern INT fRecoveringMode; /* where we are in recovering? Redo or Undo phase */
extern char szBaseName[];
extern char szSystemPath[];
extern int fTempPathSet;
extern char szTempPath[];
extern char szJet[];
extern char szJetLog[];
extern char szJetLogNameTemplate[];
extern char szJetTmp[];
extern char szJetTmpLog[];
extern char szMdbExt[];
extern char szJetTxt[];
/***********************************************************/
/*********************** DAE macros ************************/
/***********************************************************/
/* these are needed for setting columns and tracking indexes
/**/
#define cbitFixed 32
#define cbitVariable 32
#define cbitFixedVariable (cbitFixed + cbitVariable)
#define cbitTagged 192
#define fidFixedLeast 1
#define fidFixedMost (fidVarLeast-1)
#define fidVarLeast 128
#define fidVarMost (fidTaggedLeast-1)
#define fidTaggedLeast 256
#define fidTaggedMost (0x7ffe)
#define fidMax (0x7fff)
#define FFixedFid(fid) ((fid)<=fidFixedMost && (fid)>=fidFixedLeast)
#define FVarFid(fid) ((fid)<=fidVarMost && (fid)>=fidVarLeast)
#define FTaggedFid(fid) ((fid)<=fidTaggedMost && (fid)>=fidTaggedLeast)
STATIC INLINE INT IbFromFid ( FID fid )
{
INT ib;
if ( FFixedFid( fid ) )
{
ib = ((fid - fidFixedLeast) % cbitFixed) / 8;
}
else if ( FVarFid( fid ) )
{
ib = (((fid - fidVarLeast) % cbitVariable) + cbitFixed) / 8;
}
else
{
Assert( FTaggedFid( fid ) );
ib = (((fid - fidTaggedLeast) % cbitTagged) + cbitFixedVariable) / 8;
}
Assert( ib >= 0 && ib < 32 );
return ib;
}
STATIC INLINE INT IbitFromFid ( FID fid )
{
INT ibit;
if ( FFixedFid( fid ) )
{
ibit = 1 << ((fid - fidFixedLeast) % 8 );
}
else if ( FVarFid( fid ) )
{
ibit = 1 << ((fid - fidVarLeast) % 8);
}
else
{
Assert( FTaggedFid( fid ) );
ibit = 1 << ((fid - fidTaggedLeast) % 8);
}
return ibit;
}
/* per database operation counter, qwDBTime is logged, used to compare
* with the ulDBTime of a page to decide if a redo of the logged operation
* is necessary.
*/
#define qwDBTimeMin (0x0000000000000000)
#define qwDBTimeMax (0x0000000fffffffff)
/* 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;
STATIC INLINE BOOL FLineNull( LINE const *pline )
{
return !pline || !pline->cb || !pline->pb;
}
STATIC INLINE VOID LineCopy( LINE *plineTo, LINE const *plineFrom )
{
plineTo->cb = plineFrom->cb;
memcpy( plineTo->pb, plineFrom->pb, plineFrom->cb );
}
STATIC INLINE ULONG CbLine( LINE const *pline )
{
return pline ? pline->cb : 0;
}
typedef LINE KEY;
#define FKeyNull FLineNull
#define KeyCopy LineCopy
#define CbKey CbLine
STATIC INLINE BYTE *Pb4ByteAlign( BYTE const *pb )
{
return (BYTE *) ( ( (LONG_PTR) pb + 3 ) & ~3 );
}
STATIC INLINE BYTE *Pb4ByteTruncate( BYTE const *pb )
{
return (BYTE *) ( (LONG_PTR) pb & ~3 );
}
typedef struct _threebytes { BYTE b[3]; } THREEBYTES;
/***BEGIN MACHINE DEPENDANT***/
STATIC INLINE VOID ThreeBytesFromL( THREEBYTES *ptb, LONG const l )
{
memcpy( ptb, &l, sizeof(THREEBYTES) );
}
STATIC INLINE VOID LFromThreeBytes( LONG *pl, THREEBYTES *ptb )
{
*pl = 0;
memcpy( pl, ptb, sizeof(THREEBYTES) );
}
STATIC INLINE VOID KeyFromLong( BYTE *rgbKey, ULONG const ul )
{
BYTE *rgbul = (BYTE *) &ul;
rgbKey[3] = rgbul[0];
rgbKey[2] = rgbul[1];
rgbKey[1] = rgbul[2];
rgbKey[0] = rgbul[3];
}
STATIC INLINE VOID LongFromKey( ULONG *pul, BYTE const *rgbKey )
{
BYTE *rgbul = (BYTE *) pul;
rgbul[3] = rgbKey[0];
rgbul[2] = rgbKey[1];
rgbul[1] = rgbKey[2];
rgbul[0] = rgbKey[3];
}
/***END MACHINE DEPENDANT***/
/***********************************************************/
/******************** general C macros *********************/
/***********************************************************/
#define forever for(;;)
#define NotUsed(p) ( p==p )
/***********************************************************/
/***** include Jet Project prototypes and constants ********/
/***********************************************************/
#define VOID void
#define VDBAPI
extern CODECONST(VTFNDEF) vtfndefIsam;
extern CODECONST(VTFNDEF) vtfndefIsamInfo;
extern CODECONST(VTFNDEF) vtfndefTTSortIns;
extern CODECONST(VTFNDEF) vtfndefTTSortRet;
extern CODECONST(VTFNDEF) vtfndefTTBase;
#ifdef DEBUG
JET_TABLEID TableidOfVtid( FUCB *pfucb );
#else
#define TableidOfVtid( pfucb ) ( (pfucb)->tableid )
#endif
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 );
JET_VSESID UtilGetVSesidOfSesidTableid( JET_SESID sesid, JET_TABLEID tableid );
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 * SIG;
typedef void * CRIT;
/* enable multiple MUTEX resource
/**/
#ifdef SGMUTEX /* small grain */
#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 AssertNotInCriticalSection( s ) UtilAssertNotInCrit( s )
#define DeleteCriticalSection( s ) UtilDeleteCriticalSection( s )
#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 LgAssertNotInCriticalSection( s ) 0
#define LgDeleteCriticalSection( s ) 0
#define HoldCriticalSection( s ) 0
#define ReleaseCriticalSection( s ) 0
#define SgErrInitializeCriticalSection ErrInitalizeCriticalSection
#define SgEnterCriticalSection EnterCriticalSection
#define SgLeaveCriticalSection LeaveCriticalSection
#define SgEnterNestableCriticalSection EnterNestableCriticalSection
#define SgLeaveNestableCriticalSection LeaveNestableCriticalSection
#define SgAssertCriticalSection AssertCriticalSection
#define SgAssertNotInCriticalSection AssertNotInCriticalSection
#define SgDeleteCriticalSection DeleteCriticalSection
#else /* !SGMUTEX */
#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 AssertNotInCriticalSection( s ) UtilAssertNotInCrit( s )
#define DeleteCriticalSection( s ) UtilDeleteCriticalSection( s )
#define LgErrInitializeCriticalSection ErrUtilInitializeCriticalSection
#define LgEnterCriticalSection UtilEnterCriticalSection
#define LgLeaveCriticalSection UtilLeaveCriticalSection
#define LgEnterNestableCriticalSection UtilEnterNestableCriticalSection
#define LgLeaveNestableCriticalSection UtilLeaveNestableCriticalSection
#define LgAssertCriticalSection UtilAssertCrit
#define LgAssertNotInCriticalSection UtilAssertNotInCrit
#define LgDeleteCriticalSection UtilDeleteCriticalSection
#define LgHoldCriticalSection( s ) \
{ \
UtilAssertCrit( s ); \
UtilHoldCriticalSection( s ); \
}
#define LgReleaseCriticalSection( s ) \
{ \
UtilAssertCrit( s ); \
UtilReleaseCriticalSection( s ); \
}
#define SgErrInitializeCriticalSection( s ) JET_errSuccess
#define SgEnterCriticalSection( s ) 0
#define SgLeaveCriticalSection( s ) 0
#define SgEnterNestableCriticalSection( s ) 0
#define SgLeaveNestableCriticalSection( s ) 0
#define SgAssertCriticalSection( s ) 0
#define SgAssertNotInCriticalSection( s ) 0
#define SgDeleteCriticalSection( s ) 0
#endif /* !SGMUTEX */
/* include other global DAE headers
/**/
#include "daeconst.h"
#define fSTInitNotDone 0
#define fSTInitInProgress 1
#define fSTInitDone 2
extern BOOL fSTInit;
#pragma pack(1)
typedef struct
{
ULONG cDiscont;
ULONG cUnfixedMessyPage;
} P_OLC_DATA;
#define MAX_COMPUTERNAME_LENGTH 15
typedef struct
{
BYTE bSeconds; // 0 - 60
BYTE bMinutes; // 0 - 60
BYTE bHours; // 0 - 24
BYTE bDay; // 1 - 31
BYTE bMonth; // 0 - 11
BYTE bYear; // current year - 1900
BYTE bFiller1;
BYTE bFiller2;
} LOGTIME;
typedef struct _signiture
{
ULONG ulRandom; /* a random number */
LOGTIME logtimeCreate; /* time db created, in logtime format */
BYTE szComputerName[ MAX_COMPUTERNAME_LENGTH + 1 ]; /* where db is created */
} SIGNATURE;
typedef struct _bkinfo
{
LGPOS lgposMark; /* id for this backup */
LOGTIME logtimeMark;
ULONG genLow;
ULONG genHigh;
} BKINFO;
/* Magic number used in database header for integrity checking
/**/
#define ulDAEMagic 0x89abcdef
#define ulDAEVersion 0x00000500
#define ulDAEPrevVersion 0x00000400 /* temporary to make exchange compatible */
#define fDBStateJustCreated 1
#define fDBStateInconsistent 2
#define fDBStateConsistent 3
typedef struct _dbfilehdr_fixed
{
ULONG ulChecksum; /* checksum of the 4k page */
ULONG ulMagic; /* Magic number */
ULONG ulVersion; /* version of DAE the db created */
SIGNATURE signDb; /* signature of the db (incl. creation time). */
ULONG grbitAttributes;/* attributes of the db */
ULONG ulDBTimeLow; /* low ulDBTime of this database */
/* keep it here for backward compatibility */
ULONG fDBState; /* consistent/inconsistent state */
LGPOS lgposConsistent;/* null if in inconsistent state */
LOGTIME logtimeConsistent;/* null if in inconsistent state */
LOGTIME logtimeAttach; /* Last attach time. */
LGPOS lgposAttach;
LOGTIME logtimeDetach; /* Last detach time. */
LGPOS lgposDetach;
DBID dbid; /* current db attachment. */
SIGNATURE signLog; /* log signature for this attachments */
BKINFO bkinfoFullPrev; /* Last successful full backup. */
BKINFO bkinfoIncPrev; /* Last successful Incremental backup. */
/* Reset when bkinfoFullPrev is set */
BKINFO bkinfoFullCur; /* current backup. Succeed if a */
/* corresponding pat file generated. */
ULONG ulDBTimeHigh; /* DBTime */
} DBFILEHDR_FIXED;
#define cbPage 4096 // database logical page size
typedef struct _dbfilehdr
{
DBFILEHDR_FIXED;
BYTE rgbFiller[ cbPage - sizeof( DBFILEHDR_FIXED ) ];
} DBFILEHDR;
#pragma pack()
STATIC INLINE VOID DBHDRSetDBTime( DBFILEHDR *pdbfilehdr, QWORD qwDBTime )
{
QWORDX qwx;
qwx.qw = qwDBTime;
pdbfilehdr->ulDBTimeLow = qwx.l;
pdbfilehdr->ulDBTimeHigh = qwx.h;
}
STATIC INLINE QWORD QwDBHDRDBTime( DBFILEHDR *pdbfilehdr )
{
QWORDX qwx;
qwx.l = pdbfilehdr->ulDBTimeLow;
qwx.h = pdbfilehdr->ulDBTimeHigh;
return qwx.qw;
}
// #define TEST_WRAP_AROUND 1
STATIC INLINE VOID DBHDRIncDBTime( DBFILEHDR *pdbfilehdr )
{
QWORD qw;
qw = QwDBHDRDBTime( pdbfilehdr );
#ifdef TEST_WRAP_AROUND
if ( qw < 0x00000000fffc0000 )
qw = 0x00000000fffc0000;
#endif
qw++;
DBHDRSetDBTime( pdbfilehdr, qw );
}
#undef szAssertFilename
#endif // _DAEDEF_H