2025-04-27 07:49:33 -04:00

151 lines
5.4 KiB
C++

/*
* @doc
*
* @module LAYOUT.H |
* Log storage Page Layout and structures stored inside log records.
* Miscellaneous data structures used for recovery support.
*
* @rev 0 | 16-Jan-95 | robertba | Created from Vincentf OFS code
* @rev 1 | 29-Mar-95 | wilfr | Removed transaction stuff
* @rev 2 | 03-Apr-95 | wilfr | seqno to gennum changes and removal of CLR processing
*
*/
#ifndef __LAYOUT_H__
#define __LAYOUT_H__
//+----------------------------------------------------------------------------
//
// Forward class declarations.
//
//-----------------------------------------------------------------------------
class CBuffer; // cbuf
/*
* @enum RCT | Describe the number and type of log records in a record page.
*
* hungarian rct
*/
typedef enum _tagRECORDTYPE
{
RCTUpdate = 0x00000001, //@emem Normal user record.
RCTUsrChkPt = 0x00000002, //@emem User checkpoint record - one for each
// call to SetCheckpoint
RCTBeginChkPt = 0x00000003, //@emem Written at the start of the
// chkpt.
RCTEndChkPt = 0x00000004, // @emem Written at the end of the chkpt.
// Log storage is flushed after this
// record is written.
RCTStrmChkpt = 0x00000005, // @emem Log record for the stream
// table contents.Must lie between
// the begin and end checkpoint
// records.
RCTRSLChkpt = 0x00000006 // @emem Log record for the restart info
} RCT;
/*
* @struct LOGRECHEADER |
* This is the header of a log record. Together with the sequence
* number of its page, it gives the current position of the log record.
* All offsets in this record are relative to the start of the log
* storage.
*
* hungarian lrh
*/
typedef struct _LOGRECHEADER
{
ULONG ulThisOffset; //@field Offset of this record in log storage.
ULONG ulPrevPhyOffset; //@field Previous log record Offset in storage.
ULONG ulDataLength; //@field Length of user supplied data in log record.
USHORT usUserType; //@field The client specified log record type
USHORT usSysRecType; //@field The log manager defined log record types
ULONG ulClientID; //@field Client ID for this record (##WGR - for future use)
ULONG ulNextPhyOffset; //@field Offset of next record - could be in next file
} LOGRECHEADER;
/*
* @struct RANGEENTRY |
* This is the descriptor for a buffer necessary to be obtained to
* write to or read from the log storage. A log record can consist
* up to four ranges; the trailing bytes of the first page where the
* record is written, full pages until the end of the log storage,
* full pages from the beginning of the log storage (necessary when
* the log storage is fixed size), and the leading bytes of the last
* page where the record is written.
*
* Each range can consist of one or pages.
*
* hungarian re
*/
typedef struct _RANGEENTRY
{
ULONG ulRecStart; //@field Offset in the first buffer page
// where the user data starts. This is relative to
// RECORDPAGE.achData
ULONG cbRecLength; //@field Number of user bytes stored in the buffer.
ULONG ulFirstPage; //@field Offset of first file page where
// user data is to be copied.
ULONG cbPhyLength; //@field Number of bytes that must be pinned.
// This is a multiple of page size.
ULONG ulGenNum; //@field Generation number to be stored in each page.
CBuffer *pcbuf; //@field The buffer for this range.
BOOL fFlush; //@field True implies that the buffer needs to be
// flushed when released. This is because it
// is full during writes or because no more
// records can be obtained from it during reads.
} RANGEENTRY;
/*
* @enum READMODE |
* Defines the order in which log records are read.
*
* hungarian remo
*/
typedef enum _tagREADMODE
{
REMOUNDONEXT = 0x00000001, //@emem Read next xact record to be undone.
// Used during transaction abort.
REMOXACTPREVIOUS = 0x00000002, //@emem Read previous xact record.
REMONEXT = 0x00000003, //@emem Read next record.
REMOPREVIOUS = 0x00000004 //@emem Read previous record.
} REMO;
//+----------------------------------------------------------------------------
// Constants to support checkpoint hysterisis.
//
//-----------------------------------------------------------------------------
const ULONG HYSTERISISBASE = 0x00000001;
const ULONG HYSTERISISOVERFLOW = 0x00000050;
//+----------------------------------------------------------------------------
// Constant representing the log record to be one of our own.
//
//-----------------------------------------------------------------------------
const ULONG LMID = 0xFFFFFFFF; //##WGR the LM's clientID.
#endif // __LAYOUT_H__