1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 1996, 1997, 1998, 1999, 2000
* Sleepycat Software. All rights reserved.
*
* $Id: db_am.h,v 11.21 2000/12/12 17:43:56 bostic Exp $
*/
#ifndef _DB_AM_H_
#define _DB_AM_H_
#define DB_MINPAGECACHE 10 /* Min pages access methods cache. */
/* DB recovery operation codes. The low bits used to have flags or'd in. */
#define DB_ADD_DUP 0x10
#define DB_REM_DUP 0x20
#define DB_ADD_BIG 0x30
#define DB_REM_BIG 0x40
#define DB_UNUSED_1 0x50
#define DB_UNUSED_2 0x60
#define DB_ADD_PAGE 0x70
#define DB_REM_PAGE 0x80
/*
* This is a grotesque naming hack. We have modified the btree page
* allocation and freeing functions to be generic and have therefore
* moved them into the access-method independent portion of the code.
* However, since we didn't want to create new log records and routines
* for them, we left their logging and recovery functions over in btree.
* To make the code look prettier, we macro them, but this is sure to
* confuse the heck out of everyone.
*/
#define __db_pg_alloc_log __bam_pg_alloc_log
#define __db_pg_free_log __bam_pg_free_log
/*
* Standard initialization and shutdown macros for all recovery functions.
*
* Requires the following local variables:
*
* DB *file_dbp;
* DB_MPOOLFILE *mpf;
* int ret;
*/
#define REC_INTRO(func, inc_count) { \
file_dbp = NULL; \
dbc = NULL; \
if ((ret = func(dbenv, dbtp->data, &argp)) != 0) \
goto out; \
if ((ret = __db_fileid_to_db(dbenv, \
&file_dbp, argp->fileid, inc_count)) != 0) { \
if (ret == DB_DELETED) { \
ret = 0; \
goto done; \
} \
goto out; \
} \
if (file_dbp == NULL) \
goto out; \
if ((ret = file_dbp->cursor(file_dbp, NULL, &dbc, 0)) != 0) \
goto out; \
F_SET(dbc, DBC_RECOVER); \
mpf = file_dbp->mpf; \
}
#define REC_CLOSE { \
int __t_ret; \
if (argp != NULL) \
__os_free(argp, sizeof(*argp)); \
if (dbc != NULL && (__t_ret = dbc->c_close(dbc)) != 0 && ret == 0) \
return (__t_ret); \
return (ret); \
}
/*
* No-op versions of the same macros.
*/
#define REC_NOOP_INTRO(func) { \
if ((ret = func(dbenv, dbtp->data, &argp)) != 0) \
return (ret); \
}
#define REC_NOOP_CLOSE \
if (argp != NULL) \
__os_free(argp, sizeof(*argp)); \
return (ret); \
/*
* Standard debugging macro for all recovery functions.
*/
#ifdef DEBUG_RECOVER
#define REC_PRINT(func) \
(void)func(dbenv, dbtp, lsnp, op, info);
#else
#define REC_PRINT(func)
#endif
/*
* Flags to __db_lget
*/
#define LCK_COUPLE 0x01 /* Lock Couple */
#define LCK_ALWAYS 0x02 /* Lock even for off page dup cursors */
#define LCK_ROLLBACK 0x04 /* Lock even if in rollback */
/*
* If doing transactions we have to hold the locks associated with a data item
* from a page for the entire transaction. However, we don't have to hold the
* locks associated with walking the tree. Distinguish between the two so that
* we don't tie up the internal pages of the tree longer than necessary.
*/
#define __LPUT(dbc, lock) \
(lock.off != LOCK_INVALID ? \
lock_put((dbc)->dbp->dbenv, &(lock)) : 0)
#define __TLPUT(dbc, lock) \
(lock.off != LOCK_INVALID && \
(dbc)->txn == NULL ? lock_put((dbc)->dbp->dbenv, &(lock)) : 0)
#ifdef DIAGNOSTIC
#define DB_CHECK_TXN(dbp, txn) \
if (txn != NULL) \
F_SET(dbp, DB_AM_TXN); \
else if (F_ISSET(dbp, DB_AM_TXN)) \
return (__db_missing_txn_err((dbp)->dbenv));
#else
#define DB_CHECK_TXN(dbp, txn)
#endif
#include "db_dispatch.h"
#include "db_auto.h"
#include "crdel_auto.h"
#include "db_ext.h"
#endif
|