]> granicus.if.org Git - postgresql/blob - src/include/access/transam.h
pg_variable is not used in WAL version now.
[postgresql] / src / include / access / transam.h
1 /*-------------------------------------------------------------------------
2  *
3  * transam.h
4  *        postgres transaction access method support code header
5  *
6  *
7  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
8  * 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  *       NOTES
13  *              Transaction System Version 101 now support proper oid
14  *              generation and recording in the variable relation.
15  *
16  *-------------------------------------------------------------------------
17  */
18 #ifndef TRANSAM_H
19 #define TRANSAM_H
20
21 #include "storage/bufmgr.h"
22
23 /* ----------------
24  *              transaction system version id
25  *
26  *              this is stored on the first page of the log, time and variable
27  *              relations on the first 4 bytes.  This is so that if we improve
28  *              the format of the transaction log after postgres version 2, then
29  *              people won't have to rebuild their databases.
30  *
31  *              TRANS_SYSTEM_VERSION 100 means major version 1 minor version 0.
32  *              Two databases with the same major version should be compatible,
33  *              even if their minor versions differ.
34  * ----------------
35  */
36 #define TRANS_SYSTEM_VERSION    200
37
38 /* ----------------
39  *              transaction id status values
40  *
41  *              someday we will use "11" = 3 = XID_COMMIT_CHILD to mean the
42  *              commiting of child xactions.
43  * ----------------
44  */
45 #define XID_COMMIT                      2       /* transaction commited */
46 #define XID_ABORT                       1       /* transaction aborted */
47 #define XID_INPROGRESS          0       /* transaction in progress */
48 #define XID_COMMIT_CHILD        3       /* child xact commited */
49
50 typedef unsigned char XidStatus;/* (2 bits) */
51
52 /* ----------
53  *              note: we reserve the first 16384 object ids for internal use.
54  *              oid's less than this appear in the .bki files.  the choice of
55  *              16384 is completely arbitrary.
56  * ----------
57  */
58 #define BootstrapObjectIdData 16384
59
60 /* ----------------
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  */
70 #ifdef XLOG
71 #define TP_DataSize                             (BLCKSZ - sizeof(XLogRecPtr))
72 #else
73 #define TP_DataSize                             BLCKSZ
74 #endif
75 #define TP_NumXidStatusPerBlock (TP_DataSize * 4)
76
77 /* ----------------
78  *              LogRelationContents structure
79  *
80  *              This structure describes the storage of the data in the
81  *              first 128 bytes of the log relation.  This storage is never
82  *              used for transaction status because transaction id's begin
83  *              their numbering at 512.
84  *
85  *              The first 4 bytes of this relation store the version
86  *              number of the transction system.
87  * ----------------
88  */
89 typedef struct LogRelationContentsData
90 {
91 #ifdef XLOG
92         XLogRecPtr      LSN;            /* temp hack: LSN is member of any block */
93                                                         /* so should be described in bufmgr */
94 #endif
95         int                     TransSystemVersion;
96 } LogRelationContentsData;
97
98 typedef LogRelationContentsData *LogRelationContents;
99
100 /* ----------------
101  *              VariableRelationContents structure
102  *
103  *              The variable relation is a special "relation" which
104  *              is used to store various system "variables" persistantly.
105  *              Unlike other relations in the system, this relation
106  *              is updated in place whenever the variables change.
107  *
108  *              The first 4 bytes of this relation store the version
109  *              number of the transction system.
110  *
111  *              Currently, the relation has only one page and the next
112  *              available xid, the last committed xid and the next
113  *              available oid are stored there.
114  * ----------------
115  */
116 typedef struct VariableRelationContentsData
117 {
118 #ifdef XLOG
119         XLogRecPtr      LSN;
120 #endif
121         int                     TransSystemVersion;
122         TransactionId nextXidData;
123         TransactionId lastXidData;      /* unused */
124         Oid                     nextOid;
125 } VariableRelationContentsData;
126
127 typedef VariableRelationContentsData *VariableRelationContents;
128
129 /*
130  * VariableCache is placed in shmem and used by backends to
131  * get next available XID & OID without access to
132  * variable relation. Actually, I would like to have two
133  * different on-disk storages for next XID and OID...
134  * But hoping that someday we will use per database OID
135  * generator I leaved this as is.       - vadim 07/21/98
136  */
137 typedef struct VariableCacheData
138 {
139 #ifndef XLOG
140         uint32          xid_count;
141 #endif
142         TransactionId nextXid;
143         Oid                     nextOid;
144         uint32          oidCount;
145 } VariableCacheData;
146
147 typedef VariableCacheData *VariableCache;
148
149 /* ----------------
150  *              extern declarations
151  * ----------------
152  */
153
154 /*
155  * prototypes for functions in transam/transam.c
156  */
157 extern void InitializeTransactionLog(void);
158 extern bool TransactionIdDidCommit(TransactionId transactionId);
159 extern bool TransactionIdDidAbort(TransactionId transactionId);
160 extern void TransactionIdCommit(TransactionId transactionId);
161 extern void TransactionIdAbort(TransactionId transactionId);
162
163 /* in transam/transsup.c */
164 extern void AmiTransactionOverride(bool flag);
165 extern void TransComputeBlockNumber(Relation relation,
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 extern Relation LogRelation;
187 extern Relation VariableRelation;
188
189 extern TransactionId cachedTestXid;
190 extern XidStatus cachedTestXidStatus;
191
192 extern TransactionId NullTransactionId;
193 extern TransactionId AmiTransactionId;
194 extern TransactionId FirstTransactionId;
195
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 */