#include /* for _MAX_PATH */ typedef enum { lsNormal, lsQuiesce, lsOutOfDiskSpace } LS; //------------------------ system parameters --------------------------- extern long lMaxSessions; extern long lMaxOpenTables; extern long lMaxVerPages; extern long lMaxCursors; extern long lMaxBuffers; extern long lLogBuffers; extern long lLogFileSize; extern long lLogFlushThreshold; extern long lLGCheckPointPeriod; extern long lWaitLogFlush; extern long lCommitDefault; extern long lLogFlushPeriod; extern long lLGWaitingUserMax; extern BOOL fLGGlobalCircularLog; //------ log.c -------------------------------------------------------------- /* flags controlling logging behavior /**/ extern BOOL fLogDisabled; /* to turn off logging by environment variable */ extern BOOL fFreezeCheckpoint; /* freeze checkpoint when backup occurs. */ extern BOOL fNewLogGeneration; extern BOOL fNewLogRecordAdded; extern BOOL fBackupActive; extern BOOL fLGNoMoreLogWrite; extern LS lsGlobal; extern PIB *ppibLGFlushQHead; extern PIB *ppibLGFlushQTail; extern INT csecLGThreshold; extern INT csecLGCheckpointCount; extern INT csecLGCheckpointPeriod; extern INT cmsLGFlushPeriod; extern INT cmsLGFlushStep; /* flags controlling recovery behavior /**/ extern BOOL fGlobalExternalRestore; extern BOOL fHardRestore; extern ERR errGlobalRedoError; extern LGPOS lgposRedoShutDownMarkGlobal; #ifdef DEBUG extern DWORD dwBMThreadId; extern DWORD dwLogThreadId; extern BOOL fDBGTraceLog; extern BOOL fDBGTraceLogWrite; extern BOOL fDBGFreezeCheckpoint; extern BOOL fDBGTraceRedo; extern BOOL fDBGTraceBR; #endif extern LONG cXactPerFlush; #ifdef PERFCNT extern BOOL fPERFEnabled; extern ULONG rgcCommitByUser[10]; extern ULONG rgcCommitByLG[10]; #endif #pragma pack(1) typedef struct { BYTE szSystemPath[_MAX_PATH + 1]; BYTE szLogFilePath[_MAX_PATH + 1]; ULONG ulMaxSessions; ULONG ulMaxOpenTables; ULONG ulMaxVerPages; ULONG ulMaxCursors; ULONG ulLogBuffers; ULONG ulcsecLGFile; ULONG ulMaxBuffers; /* not used, for ref only */ } DBMS_PARAM; VOID LGSetDBMSParam( DBMS_PARAM *pdbms_param ); VOID LGRestoreDBMSParam( DBMS_PARAM *pdbms_param ); VOID LGReportEvent( DWORD IDEvent, ERR err ); typedef struct { WORD ibOffset:12; /* offset to old record. */ WORD f2BytesLength:1; /* if length is 2 bytes? */ WORD fInsert:1; /* insertion or replace */ /* the following 2 bits are mutual exclusive. */ WORD fInsertWithFill:1; /* insert with junks filled? */ WORD fReplaceWithSameLength:1; /* replace with same length? */ } DIFFHDR; #ifdef DEBUG VOID LGDumpDiff( BYTE *pbDiff, INT cb ); #endif VOID LGSetDiffs( FUCB *pfucb, BYTE *pbDiff, INT *pcbDiff ); VOID LGGetAfterImage( BYTE *pbDiff, INT cbDiff, BYTE *pbOld, INT cbOld, BYTE *pbNew, INT *pcbNew ); BOOL FLGAppendDiff( BYTE **ppbCur, BYTE *pbMax, INT ibOffsetOld, INT cbDataOld, INT cbDataNew, BYTE *pbDataNew ); extern SIGNATURE signLogGlobal; extern BOOL fSignLogSetGlobal; VOID SIGGetSignature( SIGNATURE *psign ); /* * NOTE: Whenever a new log record type is added or changed, the following * NOTE: should be udpated too: mplrtypsz in logapi.c, new print function for * NOTE: the new lrtyp in logapi.c, and mplrtypcb and CbLGSizeOfRec in * NOTE: redut.c. */ typedef BYTE LRTYP; #define lrtypNOP ((LRTYP) 0 ) /* NOP null operation */ #define lrtypInit ((LRTYP) 1 ) #define lrtypTerm ((LRTYP) 2 ) #define lrtypMS ((LRTYP) 3 ) /* mutilsec flush */ #define lrtypEnd ((LRTYP) 4 ) /* end of log generation */ #define lrtypBegin ((LRTYP) 5 ) #define lrtypCommit ((LRTYP) 6 ) #define lrtypRollback ((LRTYP) 7 ) #define lrtypCreateDB ((LRTYP) 8 ) #define lrtypAttachDB ((LRTYP) 9 ) #define lrtypDetachDB ((LRTYP) 10 ) #define lrtypInitFDP ((LRTYP) 11 ) #define lrtypSplit ((LRTYP) 12 ) #define lrtypEmptyPage ((LRTYP) 13 ) #define lrtypMerge ((LRTYP) 14 ) #define lrtypInsertNode ((LRTYP) 15 ) #define lrtypInsertItemList ((LRTYP) 16 ) #define lrtypFlagDelete ((LRTYP) 17 ) #define lrtypReplace ((LRTYP) 18 ) /* replace with full after image */ #define lrtypReplaceD ((LRTYP) 19 ) /* replace with delta'ed after image */ #define lrtypLockBI ((LRTYP) 20 ) /* replace with lock */ #define lrtypDeferredBI ((LRTYP) 21 ) /* deferred before image. */ #define lrtypUpdateHeader ((LRTYP) 22 ) #define lrtypInsertItem ((LRTYP) 23 ) #define lrtypInsertItems ((LRTYP) 24 ) #define lrtypFlagDeleteItem ((LRTYP) 25 ) #define lrtypFlagInsertItem ((LRTYP) 26 ) #define lrtypDeleteItem ((LRTYP) 27 ) #define lrtypSplitItemListNode ((LRTYP) 28 ) #define lrtypDelta ((LRTYP) 29 ) #define lrtypDelete ((LRTYP) 30 ) #define lrtypELC ((LRTYP) 31 ) #define lrtypFreeSpace ((LRTYP) 32 ) #define lrtypUndo ((LRTYP) 33 ) #define lrtypPrecommit ((LRTYP) 34 ) #define lrtypBegin0 ((LRTYP) 35 ) #define lrtypCommit0 ((LRTYP) 36 ) #define lrtypRefresh ((LRTYP) 37 ) /* debug log records /**/ #define lrtypRecoveryUndo ((LRTYP) 38 ) #define lrtypRecoveryQuit ((LRTYP) 39 ) #define lrtypFullBackup ((LRTYP) 40 ) #define lrtypIncBackup ((LRTYP) 41 ) #define lrtypCheckPage ((LRTYP) 42 ) #define lrtypJetOp ((LRTYP) 43 ) #define lrtypTrace ((LRTYP) 44 ) #define lrtypShutDownMark ((LRTYP) 45 ) #define lrtypMacroBegin ((LRTYP) 46 ) #define lrtypMacroCommit ((LRTYP) 47 ) #define lrtypMacroAbort ((LRTYP) 48 ) #define lrtypMax ((LRTYP) 49 ) /* log record structure ( fixed size portion of log entry ) /**/ typedef struct { LRTYP lrtyp; } LR; typedef LR LRSHUTDOWNMARK; typedef struct { LRTYP lrtyp; BYTE itagSon; /* itag of node, used only for verification */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of DB operations */ PN pn:27; /* DBTimeHigh + dbid + pgno */ ULONG ulDBTimeHigh:5; BYTE itagFather; /* itag of father node */ BYTE ibSon; /* position to insert in father son table */ BYTE bHeader; /* node header */ BYTE cbKey; /* key size */ USHORT fDirVersion:1; /* fDIRVersion for insert item list */ USHORT cbData:15; /* data size */ CHAR szKey[0]; /* key and data follow */ } LRINSERTNODE; typedef struct /* for lrtypReplace lrtypReplaceC lrtypReplaceD */ { LRTYP lrtyp; BYTE itag; /* wherereplace occurs */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID bm; /* bookmark of this replace node */ USHORT fDirVersion:1; /* flags used in original DIR call */ USHORT cb:15; /* data size/diff info */ USHORT cbOldData; /* before image data size, may be 0 */ USHORT cbNewData; /* after image data size, == cb if not replaceC */ CHAR szData[0]; /* made line data for after image follow */ } LRREPLACE; typedef struct /* for lrtypDeferredBI */ { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record */ SRID bm; /* entry key to version store */ DBID dbid; USHORT level:4; USHORT cbData:12; /* data size/diff info */ CHAR rgbData[0]; /* made line data for new record follow */ } LRDEFERREDBI; typedef struct { LRTYP lrtyp; BYTE itag; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID bm; USHORT cbOldData; } LRLOCKBI; typedef struct { LRTYP lrtyp; BYTE itag; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID bm; /* bookmark of this delete node */ BYTE fDirVersion; /* flags used in original DIR call */ } LRFLAGDELETE; typedef struct { LRTYP lrtyp; BYTE itag; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; } LRDELETE; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ SRID bm; SRID bmTarget; /* page being updated during undo operation */ WORD dbid:3; WORD wDBTimeHigh:5; WORD wFiller:8; USHORT level:4; USHORT cbDelta:12; } LRFREESPACE; typedef struct { LRTYP lrtyp; BYTE level; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ SRID bm; WORD dbid:3; WORD wDBTimeHigh:5; WORD wFiller:8; USHORT oper; /* no DDL */ SRID item; SRID bmTarget; /* the page being updated during undo operation */ } LRUNDO; /* expunge link commit log record /**/ typedef struct { LRTYP lrtyp; BYTE itag; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID sridSrc; } LRELC; typedef struct { LRTYP lrtyp; BYTE itag; USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID bm; /* bookmark of this udpated node */ BYTE bHeader; } LRUPDATEHEADER; typedef struct { LRTYP lrtyp; BYTE itag; /* of item list node */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of DB operations */ PN pn:27; /* dbid + pgno */ ULONG ulDBTimeHigh:5; SRID srid; /* item to insert */ SRID sridItemList; /* bookmark of first item list node */ BYTE fDirVersion; /* so far only one bit is used - fDIRVersion */ } LRINSERTITEM; typedef struct { LRTYP lrtyp; BYTE itag; /* item list */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of DB operations */ PN pn:27; /* ulDBTimeHigh + dbid + pgno */ ULONG ulDBTimeHigh:5; WORD citem; /* number of items to append */ SRID rgitem[0]; } LRINSERTITEMS; typedef struct { LRTYP lrtyp; BYTE itag; /* of item list node */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID srid; /* item to insert */ SRID sridItemList; /* bookmark of first item list node */ } LRFLAGITEM; typedef struct { LRTYP lrtyp; BYTE itagToSplit; /* used only for verification! */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of DB operations */ PN pn:27; /* ulDBTimeHigh + dbid + pgno */ ULONG ulDBTimeHigh:5; WORD cItem; BYTE itagFather; /* itag of father */ BYTE ibSon; /* Position to insert in father's son table */ BYTE fDirAppendItem; /* flag to indicate if it is append item */ } LRSPLITITEMLISTNODE; typedef struct { LRTYP lrtyp; BYTE itag; /* item list */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of DB operations */ PN pn:27; /* dbid + pgno */ ULONG ulDBTimeHigh:5; SRID srid; /* item to insert */ SRID sridItemList; /* bookmark of first item list node */ } LRDELETEITEM; typedef struct { LRTYP lrtyp; BYTE itag; /* wherereplace occurs */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; SRID bm; /* bookmark of this replace node */ LONG lDelta; BYTE fDirVersion; /* flags used in original DIR call */ } LRDELTA; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* current flush counter of page */ PN pn:27; ULONG ulDBTimeHigh:5; PGNO pgnoFDP; SHORT cbFree; SHORT cbUncommitted; SHORT itagNext; } LRCHECKPAGE; typedef struct { LRTYP lrtyp; BYTE levelBegin:4; /* begin transaction level */ BYTE level:4; /* transaction levels */ USHORT procid; /* user id of this log record */ } LRBEGIN; typedef struct { LRBEGIN; TRX trxBegin0; } LRBEGIN0; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; TRX trxBegin0; } LRREFRESH; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; } LRPRECOMMIT; typedef struct { LRTYP lrtyp; BYTE level; /* transaction levels */ USHORT procid; /* user id of this log record */ } LRCOMMIT; typedef struct { LRCOMMIT; TRX trxCommit0; } LRCOMMIT0; typedef struct { LRTYP lrtyp; LEVEL levelRollback; /* transaction level */ USHORT procid; /* user id of this log record */ } LRROLLBACK; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; } LRMACROBEGIN; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; } LRMACROEND; typedef struct { LRTYP lrtyp; BYTE dbid; USHORT procid; /* user id of this log record, unused in V15 */ JET_GRBIT grbit; SIGNATURE signDb; USHORT fLogOn:1; USHORT cbPath:15; /* data size */ CHAR rgb[0]; /* path name and signiture follows */ } LRCREATEDB; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; SIGNATURE signDb; SIGNATURE signLog; LGPOS lgposConsistent; /* earliest acceptable database consistent time */ DBID dbid; USHORT fLogOn:1; USHORT fReadOnly:1; USHORT fVersioningOff:1; USHORT cbPath:12; /* data size */ CHAR rgb[0]; /* path name follows */ } LRATTACHDB; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record, unused in V15 */ DBID dbid; USHORT cbPath:15; USHORT cbDbSig; CHAR rgb[0]; /* path name follows */ } LRDETACHDB; typedef struct { LRTYP lrtyp; BYTE splitt; /* split type */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* flush counter of page being split */ PN pn:27; /* page (focus) being split, includes dbid */ ULONG ulDBTimeHigh:5; PGNO pgnoNew; /* newly-allocated page no */ PGNO pgnoNew2; /* newly-allocated page no */ PGNO pgnoNew3; /* newly-allocated page no */ PGNO pgnoSibling; /* newly-allocated page no */ BYTE fLeaf:1; /* split on leaf node */ BYTE pgtyp:7; /* page type of new page */ BYTE itagSplit; /* node at which page is being split */ SHORT ibSonSplit; /* ibSon at which node is being split */ PGNO pgnoFather; /* pgno of father node */ SHORT itagFather; /* itag of father node, could be itagNil (3 bytes) */ SHORT itagGrandFather;/* itag of Grand father node, could be itagNil (3 bytes) */ SHORT cbklnk; /* number of back links */ BYTE ibSonFather; BYTE cbKey; BYTE cbKeyMac; BYTE rgb[0]; } LRSPLIT; typedef struct { LRTYP lrtyp; BYTE itagFather; /* itag of father of page pointer */ USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* flush counter of page being split */ PN pn:27; /* page pointer of empty page */ ULONG ulDBTimeHigh:5; PGNO pgnoFather; PGNO pgnoLeft; PGNO pgnoRight; USHORT itag; /* itag of page pointer, could be Nil (itagNil is 3 bytes) */ BYTE ibSon; } LREMPTYPAGE; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; PN pn:27; /* page pointer of merged page */ ULONG ulDBTimeHigh:5; PGNO pgnoRight; /* page appended to */ PGNO pgnoParent; ULONG ulDBTimeLow; SHORT itagPagePtr; SHORT cbKey; SHORT cbklnk; BYTE rgb[0]; } LRMERGE; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record */ ULONG ulDBTimeLow; /* flush counter of father FDP page */ PN pn:27; /* FDP page */ ULONG ulDBTimeHigh:5; PGNO pgnoFDPParent; /* parent FDP */ USHORT cpgGot; /* returned number of pages */ USHORT cpgWish; /* request pages */ } LRINITFDP; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT ibForwardLink; ULONG ulCheckSum; USHORT isecForwardLink; } LRMS; typedef struct { LRTYP lrtyp; BYTE rgbFiller[3]; // UNDONE: remove this when PPC compiler bug fix DBMS_PARAM dbms_param; } LRINIT; typedef struct { LRTYP lrtyp; BYTE fHard; BYTE rgbFiller[2]; // UNDONE: remove this when PPC compiler bug fix LGPOS lgpos; /* point back to last beginning of undo */ LGPOS lgposRedoFrom; } LRTERMREC; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT cbPath; /* backup path/restore path */ BYTE szData[0]; } LRLOGRESTORE; typedef struct { LRTYP lrtyp; BYTE op; /* jet operation */ USHORT procid; /* user id of this log record */ } LRJETOP; typedef struct { LRTYP lrtyp; BYTE bFiller; // UNDONE: remove this when PPC compiler bug fix USHORT procid; /* user id of this log record */ USHORT cb; BYTE sz[0]; } LRTRACE; #pragma pack() #ifdef NOLOG #define LGDepend( pbf, lgpos ) #define LGDepend2( pbf, lgpos ) #define ErrLGInsert( pfucb, fHeader, pkey, plineData, fDIRFlags ) 0 #define ErrLGInsertItemList( pfucb, fHeader, pkey, plineData ) 0 #define ErrLGReplace( pfucb, plineNew, fDIRFlags, cbOldData, plineDiff ) 0 #define ErrLGDeferredBIWithoutRetry( prce ) 0 #define ErrLGDeferredBI( prce ) 0 #define ErrLGFlagDelete( pfucb, fFlags ) 0 #deinfe ErrLGUpdateHeader( pfucb, bHeader ) 0 #define ErrLGInsertItem( pfucb, fDIRFlags ) 0 #define ErrLGInsertItems( pfucb, rgitem, citem ) 0 #define ErrLGFlagDeleteItem( pfucb ) 0 #define ErrLGSplitItemListNode( pfucb, cItem, itagFather, ibSon, itagToSplit, fFlags) 0 #define ErrLGDeleteItem( pfucb ) 0 #define ErrLGDelta( pfucb, lDelta, fDIRFlags ) 0 #define ErrLGLockBI( pfucb, cbData ) 0 #define ErrLGBeginTransaction( ppib, levelBeginFrom ) 0 #define ErrLGPrecommitTransaction( ppib, &lgposPrecommitRec ) 0 #define ErrLGCommitTransaction( ppib, levelCommitTo ) 0 #define ErrLGRefreshTransaction( ppib ) 0 #define ErrLGRollback( ppib,levelsRollback ) 0 #define ErrLGMacroBegin( ppib ) 0 #define ErrLGMacroCommit( ppib ) 0 #define ErrLGMacroAbort( ppib ) 0 #define ErrLGUndo( prce ) 0 #define ErrLGFreeSpace( pfucb, bm, cbDelta ) 0 #define ErrLGCreateDB( ppib, dbid, grbit, sz, cch, psign, plgposRec ) 0 #define ErrLGAttachDB( ppib, dbid, sz, cch, psign, psignLog, plgposConsistent, plgposRec ) 0 #define ErrLGDetachDB( ppib, dbid, sz, cch, plgposRec ) 0 #define ErrLGMerge( pfucb, psplit ) 0 #define ErrLGSplit( splitt, pfucb, pcsrPagePointer, psplit, pgtypNew ) 0 #define ErrLGEmptyPage( pfucbFather, prmpage ) 0 #define ErrLGInitFDP( pfucb, pgnoFDPParent, pnFDP, cpgGot, cpgWish) 0 #define ErrLGFlagInsertItem(pfucb) 0 #define ErrLGStart() 0 #define ErrLGQuit( plgposRecoveryUndo ) 0 #define ErrLGShutDownMark( plgposLogRec ) 0 #define ErrLGRecoveryQuit( plgposRecoveryUndo ) 0 #define ErrLGRecoveryUndo( szRestorePath ) 0 #define ErrLGFullBackup(szRestorePath, plgposLogRec ) 0 #define ErrLGIncBackup(szRestorePath ) 0 #define ErrLGCheckPage( pfucb, cbFree, cbUncommitted, itagNext, pgnoFDP ) 0 #define ErrLGCheckPage2( ppib, pbf, cbFree, cbUncommited, itagNext, pgnoFDP ) 0 #define ErrLGTrace( ppib, sz ) 0 #define ErrLGTrace2( ppib, sz ) 0 #else /* !NOLOG */ #define ErrLGInsert( pfucb, fHeader, pkey, plineData, fFlags) \ ErrLGInsertNode( lrtypInsertNode, pfucb, fHeader, pkey, plineData, fFlags) #define ErrLGInsertItemList( pfucb, fHeader, pkey, plineData, fFlags) \ ErrLGInsertNode( lrtypInsertItemList, pfucb, fHeader, pkey, plineData, fFlags) ERR ErrLGInsertNode( LRTYP lrtyp, FUCB *pfucb, INT fHeader, KEY *pkey, LINE *plineData, INT fFlags); ERR ErrLGReplace( FUCB *pfucb, LINE *plineNew, INT fDIRFlags, INT cbOldData, BYTE *pbDiff, INT cbDiff ); ERR ErrLGDeferredBIWithoutRetry( RCE *prce ); ERR ErrLGDeferredBI( RCE *prce ); ERR ErrLGFlagDelete( FUCB *pfucb, INT fFlags); ERR ErrLGUpdateHeader( FUCB *pfucb, INT bHeader ); ERR ErrLGInsertItem( FUCB *pfucb, INT fDIRFlags ); ERR ErrLGInsertItems( FUCB *pfucb, SRID *rgitem, INT citem ); ERR ErrLGFlagDeleteItem( FUCB *pfucb ); ERR ErrLGSplitItemListNode( FUCB *pfucb, INT cItem, INT itagFather, INT ibSon, INT itagToSplit, INT fFlags ); ERR ErrLGDelta( FUCB *pfucb, LONG lDelta, INT fDIRFlags ); ERR ErrLGLockBI( FUCB *pfucb, INT cbData ); ERR ErrLGBeginTransaction( PIB *ppib, INT levelBeginFrom ); ERR ErrLGRefreshTransaction( PIB *ppib ); ERR ErrLGPrecommitTransaction( PIB *ppib, LGPOS *plgposRec ); ERR ErrLGCommitTransaction( PIB *ppib, INT levelCommitTo ); ERR ErrLGRollback( PIB *ppib, INT levelsRollback ); ERR ErrLGUndo( RCE *prce ); ERR ErrLGFreeSpace( FUCB *pfucb, SRID bm, INT cbDelta ); ERR ErrLGMacroBegin( PIB *ppib ); ERR ErrLGMacroEnd( PIB *ppib, LRTYP lrtyp ); #define ErrLGMacroCommit( ppib ) ErrLGMacroEnd( ppib, lrtypMacroCommit ) #define ErrLGMacroAbort( ppib ) ErrLGMacroEnd( ppib, lrtypMacroAbort ) ERR ErrLGCreateDB( PIB *ppib, DBID dbid, JET_GRBIT grbit, CHAR *sz, INT cch, SIGNATURE *psignDb, LGPOS *plgposRec ); ERR ErrLGAttachDB( PIB *ppib, DBID dbid, CHAR *sz, INT cch, SIGNATURE *psignDb, SIGNATURE *psignLog, LGPOS *plgposConsistent, LGPOS *plgposRec ); ERR ErrLGDetachDB( PIB *ppib, DBID dbid, CHAR *sz, INT cch, LGPOS *plgposRec ); ERR ErrLGMerge( FUCB *pfucb, struct _split *psplit ); ERR ErrLGSplit( SPLITT splitt, FUCB *pfucb, CSR *pcsrPagePointer, struct _split *psplit, PGTYP pgtypNew ); ERR ErrLGEmptyPage( FUCB *pfucbFather, RMPAGE *prmpage ); ERR ErrLGInitFDP( FUCB *pfucb, PGNO pgnoFDPParent, PN pnFDP, INT cpgGot, INT cpgWish); #define ErrLGFlagDeleteItem(pfucb) ErrLGFlagItem(pfucb, lrtypFlagDeleteItem) #define ErrLGFlagInsertItem(pfucb) ErrLGFlagItem(pfucb, lrtypFlagInsertItem) ERR ErrLGFlagItem(FUCB *pfucb, LRTYP lrtyp); ERR ErrLGDeleteItem( FUCB *pfucb ); ERR ErrLGDelete( FUCB *pfucb ); ERR ErrLGExpungeLinkCommit( FUCB *pfucb, SSIB *pssibSrc, SRID sridSrc ); ERR ErrLGStart(); ERR ErrLGShutDownMark( LGPOS *plgposShutDownMark ); #define ErrLGRecoveryQuit( plgposRecoveryUndo, plgposRedoFrom, fHard ) \ ErrLGQuitRec( lrtypRecoveryQuit, plgposRecoveryUndo, plgposRedoFrom, fHard ) #define ErrLGQuit( plgposStart ) \ ErrLGQuitRec( lrtypTerm, plgposStart, pNil, 0 ) ERR ErrLGQuitRec( LRTYP lrtyp, LGPOS *plgposQuit, LGPOS *plgposRedoFrom, BOOL fHard); #define ErrLGRecoveryUndo(szRestorePath) \ ErrLGLogRestore(lrtypRecoveryUndo, szRestorePath, fNoNewGen, pNil ) #define ErrLGFullBackup(szRestorePath, plgposLogRec) \ ErrLGLogRestore(lrtypFullBackup, szRestorePath, fCreateNewGen, plgposLogRec ) #define ErrLGIncBackup(szRestorePath, plgposLogRec) \ ErrLGLogRestore(lrtypIncBackup, szRestorePath, fCreateNewGen, plgposLogRec ) ERR ErrLGLogRestore( LRTYP lrtyp, CHAR * szLogRestorePath, BOOL fNewGen, LGPOS *plgposLogRec ); ERR ErrLGCheckPage( FUCB *pfucb, SHORT cbFree, SHORT cbUncommitted, SHORT itagNext, PGNO pgnoFDP ); ERR ErrLGCheckPage2( PIB *ppib, BF *pbf, SHORT cbFree, SHORT cbUncommited, SHORT itagNext, PGNO pgnoFDP ); ERR ErrLGTrace( PIB *ppib, CHAR *sz ); ERR ErrLGTrace2( PIB *ppib, CHAR *sz ); #endif /* logging enabled */ ERR ErrLGSoftStart( BOOL fAllowNoJetLog, BOOL fNewCheckpointFile, BOOL *pfJetLogGeneratedDuringSoftStart ); ERR ErrLGInit( BOOL *pfNewCheckpointFile ); ERR ErrLGTerm( ERR err ); #define fCreateNewGen fTrue #define fNoNewGen fFalse ERR ErrLGLogRec( LINE *rgline, INT cline, BOOL fNewGen, LGPOS *plgposLogRec ); ERR ErrLGWaitPrecommit0Flush( PIB *ppib ); #define szAssertFilename __FILE__ STATIC INLINE ErrLGWaitForFlush( PIB *ppib, LGPOS *plgposLogRec ) { extern SIG sigLogFlush; ERR err; AssertCriticalSection( critJet ); if ( fLogDisabled || ( fRecovering && fRecoveringMode != fRecoveringUndo ) ) return JET_errSuccess; ppib->lgposPrecommit0 = *plgposLogRec; LeaveCriticalSection( critJet ); SignalSend( sigLogFlush ); err = ErrLGWaitPrecommit0Flush( ppib ); EnterCriticalSection( critJet ); Assert( err >= 0 || ( fLGNoMoreLogWrite && err == JET_errLogWriteFail ) ); return err; } #undef szAssertFilename ERR ErrLGInitLogBuffers( LONG lIntendLogBuffers ); ULONG UlLGMSCheckSum( CHAR *pbLrmsNew ); #define ErrLGCheckState() ( lsGlobal != lsNormal ? \ ErrLGNewReservedLogFile() : \ JET_errSuccess ) #define FLGOn() (!fLogDisabled) #define FLGOff() (fLogDisabled) BOOL FIsNullLgpos( LGPOS *plgpos ); VOID LGMakeLogName( CHAR *szLogName, CHAR *szFName ); ERR ErrLGPatchAttachedDB( DBID dbid, JET_RSTMAP *rgrstmap, INT crstmap ); ERR ErrLGNewReservedLogFile(); STATIC INLINE INT CmpLgpos( LGPOS *plgpos1, LGPOS *plgpos2 ) { BYTE *rgb1 = (BYTE *) plgpos1; BYTE *rgb2 = (BYTE *) plgpos2; // perform comparison on LGPOS as if it were a 64 bit integer #ifdef _X86_ // bytes 7 - 4 if ( *( (DWORD UNALIGNED *) ( rgb1 + 4 ) ) < *( (DWORD UNALIGNED *) ( rgb2 + 4 ) ) ) return -1; if ( *( (DWORD UNALIGNED *) ( rgb1 + 4 ) ) > *( (DWORD UNALIGNED *) ( rgb2 + 4 ) ) ) return 1; // bytes 3 - 0 if ( *( (DWORD UNALIGNED *) ( rgb1 + 0 ) ) < *( (DWORD UNALIGNED *) ( rgb2 + 0 ) ) ) return -1; if ( *( (DWORD UNALIGNED *) ( rgb1 + 0 ) ) > *( (DWORD UNALIGNED *) ( rgb2 + 0 ) ) ) return 1; #else // bytes 7 - 0 if ( *( (QWORD UNALIGNED *) ( rgb1 + 0 ) ) < *( (QWORD UNALIGNED *) ( rgb2 + 0 ) ) ) return -1; if ( *( (QWORD UNALIGNED *) ( rgb1 + 0 ) ) > *( (QWORD UNALIGNED *) ( rgb2 + 0 ) ) ) return 1; #endif return 0; } /* log checkpoint support /**/ ERR ErrLGCheckpointInit( BOOL *pfNewCheckpointFile ); VOID LGCheckpointTerm( VOID ); /* database attachments /**/ ERR ErrLGInitAttachment( VOID ); VOID LGTermAttachment( VOID ); ERR ErrLGLoadAttachmentsFromFMP( VOID ); ERR ErrLGInsertAttachment( DBID dbid, CHAR *szFullPath ); ERR ErrLGDeleteAttachment( DBID dbid ); VOID LGCopyAttachment( BYTE *rgbAttach );