transam.h 5.8 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * transam.h
4
 *	  postgres transaction access method support code header
5 6
 *
 *
B
Add:  
Bruce Momjian 已提交
7 8
 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
 * Portions Copyright (c) 1994, Regents of the University of California
9
 *
10
 * $Id: transam.h,v 1.26 2000/11/03 11:39:36 vadim Exp $
11
 *
12 13 14
 *	 NOTES
 *		Transaction System Version 101 now support proper oid
 *		generation and recording in the variable relation.
15 16 17 18 19 20
 *
 *-------------------------------------------------------------------------
 */
#ifndef TRANSAM_H
#define TRANSAM_H

21
#include "storage/bufmgr.h"
22

23
/* ----------------
24
 *		transaction system version id
25
 *
26 27 28 29
 *		this is stored on the first page of the log, time and variable
 *		relations on the first 4 bytes.  This is so that if we improve
 *		the format of the transaction log after postgres version 2, then
 *		people won't have to rebuild their databases.
30
 *
31 32 33
 *		TRANS_SYSTEM_VERSION 100 means major version 1 minor version 0.
 *		Two databases with the same major version should be compatible,
 *		even if their minor versions differ.
34 35
 * ----------------
 */
V
Vadim B. Mikheev 已提交
36
#define TRANS_SYSTEM_VERSION	200
37 38

/* ----------------
39
 *		transaction id status values
40
 *
V
Vadim B. Mikheev 已提交
41 42
 *		someday we will use "11" = 3 = XID_COMMIT_CHILD to mean the
 *		commiting of child xactions.
43 44
 * ----------------
 */
45 46 47 48
#define XID_COMMIT			2	/* transaction commited */
#define XID_ABORT			1	/* transaction aborted */
#define XID_INPROGRESS		0	/* transaction in progress */
#define XID_COMMIT_CHILD	3	/* child xact commited */
49

50
typedef unsigned char XidStatus;/* (2 bits) */
51 52

/* ----------
53 54 55
 *		note: we reserve the first 16384 object ids for internal use.
 *		oid's less than this appear in the .bki files.  the choice of
 *		16384 is completely arbitrary.
56 57 58 59 60
 * ----------
 */
#define BootstrapObjectIdData 16384

/* ----------------
61
 *		BitIndexOf computes the index of the Nth xid on a given block
62 63
 * ----------------
 */
64
#define BitIndexOf(N)	((N) * 2)
65 66

/* ----------------
67
 *		transaction page definitions
68 69
 * ----------------
 */
V
WAL  
Vadim B. Mikheev 已提交
70 71 72
#ifdef XLOG
#define TP_DataSize				(BLCKSZ - sizeof(XLogRecPtr))
#else
73
#define TP_DataSize				BLCKSZ
V
WAL  
Vadim B. Mikheev 已提交
74
#endif
75
#define TP_NumXidStatusPerBlock (TP_DataSize * 4)
76 77

/* ----------------
78
 *		LogRelationContents structure
79
 *
80 81 82 83
 *		This structure describes the storage of the data in the
 *		first 128 bytes of the log relation.  This storage is never
 *		used for transaction status because transaction id's begin
 *		their numbering at 512.
84
 *
85 86
 *		The first 4 bytes of this relation store the version
 *		number of the transction system.
87 88
 * ----------------
 */
89 90
typedef struct LogRelationContentsData
{
V
WAL  
Vadim B. Mikheev 已提交
91 92 93 94
#ifdef XLOG
	XLogRecPtr	LSN;		/* temp hack: LSN is member of any block */
							/* so should be described in bufmgr */
#endif
95
	int			TransSystemVersion;
96
} LogRelationContentsData;
97 98 99 100

typedef LogRelationContentsData *LogRelationContents;

/* ----------------
101
 *		VariableRelationContents structure
102
 *
103 104 105 106
 *		The variable relation is a special "relation" which
 *		is used to store various system "variables" persistantly.
 *		Unlike other relations in the system, this relation
 *		is updated in place whenever the variables change.
107
 *
108 109
 *		The first 4 bytes of this relation store the version
 *		number of the transction system.
110
 *
111 112 113
 *		Currently, the relation has only one page and the next
 *		available xid, the last committed xid and the next
 *		available oid are stored there.
114 115
 * ----------------
 */
116 117
typedef struct VariableRelationContentsData
{
V
WAL  
Vadim B. Mikheev 已提交
118 119 120
#ifdef XLOG
	XLogRecPtr	LSN;
#endif
121 122 123 124
	int			TransSystemVersion;
	TransactionId nextXidData;
	TransactionId lastXidData;	/* unused */
	Oid			nextOid;
125
} VariableRelationContentsData;
126 127 128

typedef VariableRelationContentsData *VariableRelationContents;

129 130 131 132 133 134 135 136 137 138
/*
 * VariableCache is placed in shmem and used by backends to
 * get next available XID & OID without access to
 * variable relation. Actually, I would like to have two
 * different on-disk storages for next XID and OID...
 * But hoping that someday we will use per database OID
 * generator I leaved this as is.	- vadim 07/21/98
 */
typedef struct VariableCacheData
{
139
#ifndef XLOG
140
	uint32		xid_count;
141
#endif
142 143
	TransactionId nextXid;
	Oid			nextOid;
144
	uint32		oidCount;
145
} VariableCacheData;
146

147
typedef VariableCacheData *VariableCache;
148

149
/* ----------------
150
 *		extern declarations
151 152 153 154 155 156
 * ----------------
 */

/*
 * prototypes for functions in transam/transam.c
 */
157 158 159 160 161
extern void InitializeTransactionLog(void);
extern bool TransactionIdDidCommit(TransactionId transactionId);
extern bool TransactionIdDidAbort(TransactionId transactionId);
extern void TransactionIdCommit(TransactionId transactionId);
extern void TransactionIdAbort(TransactionId transactionId);
162 163

/* in transam/transsup.c */
164
extern void AmiTransactionOverride(bool flag);
165
extern void TransComputeBlockNumber(Relation relation,
B
Bruce Momjian 已提交
166
			  TransactionId transactionId, BlockNumber *blockNumberOutP);
167
extern XidStatus TransBlockNumberGetXidStatus(Relation relation,
168
				BlockNumber blockNumber, TransactionId xid, bool *failP);
169
extern void TransBlockNumberSetXidStatus(Relation relation,
170
		   BlockNumber blockNumber, TransactionId xid, XidStatus xstatus,
171
							 bool *failP);
172 173

/* in transam/varsup.c */
174
extern void VariableRelationPutNextXid(TransactionId xid);
175
extern void GetNewTransactionId(TransactionId *xid);
176
extern void ReadNewTransactionId(TransactionId *xid);
177
extern void GetNewObjectId(Oid *oid_return);
178
extern void CheckMaxObjectId(Oid assigned_oid);
179 180

/* ----------------
181
 *		global variable extern declarations
182 183 184 185
 * ----------------
 */

/* in transam.c */
186 187
extern Relation LogRelation;
extern Relation VariableRelation;
188

189 190
extern TransactionId cachedTestXid;
extern XidStatus cachedTestXidStatus;
191 192 193 194 195

extern TransactionId NullTransactionId;
extern TransactionId AmiTransactionId;
extern TransactionId FirstTransactionId;

196
extern int	RecoveryCheckingEnableState;
197 198

/* in transsup.c */
199
extern bool AMI_OVERRIDE;
200 201

/* in varsup.c */
202
extern int	OidGenLockId;
203

204
#endif	 /* TRAMSAM_H */