Use +force in dependency list of installation targets.
[kopensolaris-gnu/glibc.git] / db2 / db.h
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1996, 1997
5  *      Sleepycat Software.  All rights reserved.
6  *
7  *      @(#)db.h.src    10.102 (Sleepycat) 1/18/98
8  */
9
10 #ifndef _DB_H_
11 #define _DB_H_
12
13 #ifndef __NO_SYSTEM_INCLUDES
14 #include <sys/types.h>
15
16 #include <stdio.h>
17 #endif
18
19 /*
20  * XXX
21  * MacOS: ensure that Metrowerks C makes enumeration types int sized.
22  */
23 #ifdef __MWERKS__
24 #pragma enumsalwaysint on
25 #endif
26
27 /*
28  * XXX
29  * Handle function prototypes and the keyword "const".  This steps on name
30  * space that DB doesn't control, but all of the other solutions are worse.
31  *
32  * XXX
33  * While Microsoft's compiler is ANSI C compliant, it doesn't have _STDC_
34  * defined by default, you specify a command line flag or #pragma to turn
35  * it on.  Don't do that, however, because some of Microsoft's own header
36  * files won't compile.
37  */
38 #undef  __P
39 #if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER)
40 #define __P(protos)     protos          /* ANSI C prototypes */
41 #else
42 #define const
43 #define __P(protos)     ()              /* K&R C preprocessor */
44 #endif
45
46 /*
47  * !!!
48  * DB needs basic information about specifically sized types.  If they're
49  * not provided by the system, typedef them here.
50  *
51  * We protect them against multiple inclusion using __BIT_TYPES_DEFINED__,
52  * as does BIND and Kerberos, since we don't know for sure what #include
53  * files the user is using.
54  *
55  * !!!
56  * We also provide the standard u_int, u_long etc., if they're not provided
57  * by the system.  This isn't completely necessary, but the example programs
58  * need them.
59  */
60 #ifndef __BIT_TYPES_DEFINED__
61 #define __BIT_TYPES_DEFINED__
62
63
64
65
66
67 #endif
68
69
70
71
72
73
74 #define DB_VERSION_MAJOR        2
75 #define DB_VERSION_MINOR        3
76 #define DB_VERSION_PATCH        16
77 #define DB_VERSION_STRING       "Sleepycat Software: DB 2.3.16: (1/19/98)"
78
79 typedef u_int32_t       db_pgno_t;      /* Page number type. */
80 typedef u_int16_t       db_indx_t;      /* Page offset type. */
81 #define DB_MAX_PAGES    0xffffffff      /* >= # of pages in a file */
82
83 typedef u_int32_t       db_recno_t;     /* Record number type. */
84 typedef size_t          DB_LOCK;        /* Object returned by lock manager. */
85 #define DB_MAX_RECORDS  0xffffffff      /* >= # of records in a tree */
86
87 #define DB_FILE_ID_LEN          20      /* DB file ID length. */
88
89 /* Forward structure declarations, so applications get type checking. */
90 struct __db;            typedef struct __db DB;
91 #ifdef DB_DBM_HSEARCH
92                         typedef struct __db DBM;
93 #endif
94 struct __db_bt_stat;    typedef struct __db_bt_stat DB_BTREE_STAT;
95 struct __db_dbt;        typedef struct __db_dbt DBT;
96 struct __db_env;        typedef struct __db_env DB_ENV;
97 struct __db_info;       typedef struct __db_info DB_INFO;
98 struct __db_lockregion; typedef struct __db_lockregion DB_LOCKREGION;
99 struct __db_lockreq;    typedef struct __db_lockreq DB_LOCKREQ;
100 struct __db_locktab;    typedef struct __db_locktab DB_LOCKTAB;
101 struct __db_log;        typedef struct __db_log DB_LOG;
102 struct __db_log_stat;   typedef struct __db_log_stat DB_LOG_STAT;
103 struct __db_lsn;        typedef struct __db_lsn DB_LSN;
104 struct __db_mpool;      typedef struct __db_mpool DB_MPOOL;
105 struct __db_mpool_fstat;typedef struct __db_mpool_fstat DB_MPOOL_FSTAT;
106 struct __db_mpool_stat; typedef struct __db_mpool_stat DB_MPOOL_STAT;
107 struct __db_mpoolfile;  typedef struct __db_mpoolfile DB_MPOOLFILE;
108 struct __db_txn;        typedef struct __db_txn DB_TXN;
109 struct __db_txn_active; typedef struct __db_txn_active DB_TXN_ACTIVE;
110 struct __db_txn_stat;   typedef struct __db_txn_stat DB_TXN_STAT;
111 struct __db_txnmgr;     typedef struct __db_txnmgr DB_TXNMGR;
112 struct __db_txnregion;  typedef struct __db_txnregion DB_TXNREGION;
113 struct __dbc;           typedef struct __dbc DBC;
114
115 /* Key/data structure -- a Data-Base Thang. */
116 struct __db_dbt {
117         void     *data;                 /* key/data */
118         u_int32_t size;                 /* key/data length */
119         u_int32_t ulen;                 /* RO: length of user buffer. */
120         u_int32_t dlen;                 /* RO: get/put record length. */
121         u_int32_t doff;                 /* RO: get/put record offset. */
122
123 #define DB_DBT_INTERNAL 0x01            /* Perform any mallocs using regular
124                                            malloc, not the user's malloc. */
125 #define DB_DBT_MALLOC   0x02            /* Return in allocated memory. */
126 #define DB_DBT_PARTIAL  0x04            /* Partial put/get. */
127 #define DB_DBT_USERMEM  0x08            /* Return in user's memory. */
128         u_int32_t flags;
129 };
130
131 /*
132  * DB internal configuration.
133  *
134  * There are a set of functions that the application can replace with its
135  * own versions, and some other knobs which can be turned at run-time.
136  */
137 #define DB_FUNC_CALLOC   1              /* ANSI C calloc. */
138 #define DB_FUNC_CLOSE    2              /* POSIX 1003.1 close. */
139 #define DB_FUNC_DIRFREE  3              /* DB: free directory list. */
140 #define DB_FUNC_DIRLIST  4              /* DB: create directory list. */
141 #define DB_FUNC_EXISTS   5              /* DB: return if file exists. */
142 #define DB_FUNC_FREE     6              /* ANSI C free. */
143 #define DB_FUNC_FSYNC    7              /* POSIX 1003.1 fsync. */
144 #define DB_FUNC_IOINFO   8              /* DB: return file I/O information. */
145 #define DB_FUNC_MALLOC   9              /* ANSI C malloc. */
146 #define DB_FUNC_MAP     10              /* DB: map file into shared memory. */
147 #define DB_FUNC_OPEN    11              /* POSIX 1003.1 open. */
148 #define DB_FUNC_READ    12              /* POSIX 1003.1 read. */
149 #define DB_FUNC_REALLOC 13              /* ANSI C realloc. */
150 #define DB_FUNC_SEEK    14              /* POSIX 1003.1 lseek. */
151 #define DB_FUNC_SLEEP   15              /* DB: sleep secs/usecs. */
152 #define DB_FUNC_STRDUP  16              /* DB: strdup(3). */
153 #define DB_FUNC_UNLINK  17              /* POSIX 1003.1 unlink. */
154 #define DB_FUNC_UNMAP   18              /* DB: unmap shared memory file. */
155 #define DB_FUNC_WRITE   19              /* POSIX 1003.1 write. */
156 #define DB_FUNC_YIELD   20              /* DB: yield thread to scheduler. */
157 #define DB_TSL_SPINS    21              /* DB: initialize spin count. */
158
159 /*
160  * Database configuration and initialization.
161  */
162  /*
163   * Flags understood by both db_open(3) and db_appinit(3).
164   */
165 #define DB_CREATE               0x00001 /* O_CREAT: create file as necessary. */
166 #define DB_NOMMAP               0x00002 /* Don't mmap underlying file. */
167 #define DB_THREAD               0x00004 /* Free-thread DB package handles. */
168
169 /*
170  * Flags understood by db_appinit(3).
171  *
172  * DB_MUTEXDEBUG is internal only, and not documented.
173  */
174 /*                              0x00007    COMMON MASK. */
175 #define DB_INIT_LOCK            0x00008 /* Initialize locking. */
176 #define DB_INIT_LOG             0x00010 /* Initialize logging. */
177 #define DB_INIT_MPOOL           0x00020 /* Initialize mpool. */
178 #define DB_INIT_TXN             0x00040 /* Initialize transactions. */
179 #define DB_MPOOL_PRIVATE        0x00080 /* Mpool: private memory pool. */
180 #define DB_MUTEXDEBUG           0x00100 /* Do not get/set mutexes in regions. */
181 #define DB_RECOVER              0x00200 /* Run normal recovery. */
182 #define DB_RECOVER_FATAL        0x00400 /* Run catastrophic recovery. */
183 #define DB_TXN_NOSYNC           0x00800 /* Do not sync log on commit. */
184 #define DB_USE_ENVIRON          0x01000 /* Use the environment. */
185 #define DB_USE_ENVIRON_ROOT     0x02000 /* Use the environment if root. */
186
187 /* CURRENTLY UNUSED LOCK FLAGS. */
188 #define DB_TXN_LOCK_2PL         0x00000 /* Two-phase locking. */
189 #define DB_TXN_LOCK_OPTIMISTIC  0x00000 /* Optimistic locking. */
190 #define DB_TXN_LOCK_MASK        0x00000 /* Lock flags mask. */
191
192 /* CURRENTLY UNUSED LOG FLAGS. */
193 #define DB_TXN_LOG_REDO         0x00000 /* Redo-only logging. */
194 #define DB_TXN_LOG_UNDO         0x00000 /* Undo-only logging. */
195 #define DB_TXN_LOG_UNDOREDO     0x00000 /* Undo/redo write-ahead logging. */
196 #define DB_TXN_LOG_MASK         0x00000 /* Log flags mask. */
197
198 /*
199  * Flags understood by db_open(3).
200  *
201  * DB_EXCL and DB_TEMPORARY are internal only, and not documented.
202  * DB_SEQUENTIAL is currently internal, but likely to be exported some day.
203  */
204 /*                              0x00007    COMMON MASK. */
205 /*                              0x07fff    ALREADY USED. */
206 #define DB_EXCL                 0x08000 /* O_EXCL: exclusive open. */
207 #define DB_RDONLY               0x10000 /* O_RDONLY: read-only. */
208 #define DB_SEQUENTIAL           0x20000 /* Indicate sequential access. */
209 #define DB_TEMPORARY            0x40000 /* Remove on last close. */
210 #define DB_TRUNCATE             0x80000 /* O_TRUNCATE: replace existing DB. */
211
212 /*
213  * Deadlock detector modes; used in the DBENV structure to configure the
214  * locking subsystem.
215  */
216 #define DB_LOCK_NORUN           0x0
217 #define DB_LOCK_DEFAULT         0x1     /* Default policy. */
218 #define DB_LOCK_OLDEST          0x2     /* Abort oldest transaction. */
219 #define DB_LOCK_RANDOM          0x3     /* Abort random transaction. */
220 #define DB_LOCK_YOUNGEST        0x4     /* Abort youngest transaction. */
221
222 struct __db_env {
223         int              db_lorder;     /* Byte order. */
224
225                                         /* Error message callback. */
226         void (*db_errcall) __P((const char *, char *));
227         FILE            *db_errfile;    /* Error message file stream. */
228         const char      *db_errpfx;     /* Error message prefix. */
229         int              db_verbose;    /* Generate debugging messages. */
230
231         /* User paths. */
232         char            *db_home;       /* Database home. */
233         char            *db_log_dir;    /* Database log file directory. */
234         char            *db_tmp_dir;    /* Database tmp file directory. */
235
236         char           **db_data_dir;   /* Database data file directories. */
237         int              data_cnt;      /* Database data file slots. */
238         int              data_next;     /* Next Database data file slot. */
239
240         /* Locking. */
241         DB_LOCKTAB      *lk_info;       /* Return from lock_open(). */
242         u_int8_t        *lk_conflicts;  /* Two dimensional conflict matrix. */
243         int              lk_modes;      /* Number of lock modes in table. */
244         u_int            lk_max;        /* Maximum number of locks. */
245         u_int32_t        lk_detect;     /* Deadlock detect on every conflict. */
246
247         /* Logging. */
248         DB_LOG          *lg_info;       /* Return from log_open(). */
249         u_int32_t        lg_max;        /* Maximum file size. */
250
251         /* Memory pool. */
252         DB_MPOOL        *mp_info;       /* Return from memp_open(). */
253         size_t           mp_mmapsize;   /* Maximum file size for mmap. */
254         size_t           mp_size;       /* Bytes in the mpool cache. */
255
256         /* Transactions. */
257         DB_TXNMGR       *tx_info;       /* Return from txn_open(). */
258         unsigned int     tx_max;        /* Maximum number of transactions. */
259         int (*tx_recover)               /* Dispatch function for recovery. */
260             __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
261
262 #define DB_ENV_APPINIT          0x01    /* Paths initialized by db_appinit(). */
263 #define DB_ENV_STANDALONE       0x02    /* Test: freestanding environment. */
264 #define DB_ENV_THREAD           0x04    /* DB_ENV is multi-threaded. */
265         u_int32_t        flags;         /* Flags. */
266 };
267
268 /*******************************************************
269  * Access methods.
270  *******************************************************/
271 /*
272  * XXX
273  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
274  */
275 typedef enum {
276         DB_BTREE=1,                     /* B+tree. */
277         DB_HASH,                        /* Extended Linear Hashing. */
278         DB_RECNO,                       /* Fixed and variable-length records. */
279         DB_UNKNOWN                      /* Figure it out on open. */
280 } DBTYPE;
281
282 #define DB_BTREEVERSION 6               /* Current btree version. */
283 #define DB_BTREEOLDVER  6               /* Oldest btree version supported. */
284 #define DB_BTREEMAGIC   0x053162
285
286 #define DB_HASHVERSION  5               /* Current hash version. */
287 #define DB_HASHOLDVER   4               /* Oldest hash version supported. */
288 #define DB_HASHMAGIC    0x061561
289
290 #define DB_LOGVERSION   2               /* Current log version. */
291 #define DB_LOGOLDVER    2               /* Oldest log version supported. */
292 #define DB_LOGMAGIC     0x040988
293
294 struct __db_info {
295         int              db_lorder;     /* Byte order. */
296         size_t           db_cachesize;  /* Underlying cache size. */
297         size_t           db_pagesize;   /* Underlying page size. */
298
299                                         /* Local heap allocation. */
300         void *(*db_malloc) __P((size_t));
301
302         /* Btree access method. */
303         int              bt_maxkey;     /* Maximum keys per page. */
304         int              bt_minkey;     /* Minimum keys per page. */
305         int (*bt_compare)               /* Comparison function. */
306             __P((const DBT *, const DBT *));
307         size_t (*bt_prefix)             /* Prefix function. */
308             __P((const DBT *, const DBT *));
309
310         /* Hash access method. */
311         unsigned int     h_ffactor;     /* Fill factor. */
312         unsigned int     h_nelem;       /* Number of elements. */
313         u_int32_t       (*h_hash)       /* Hash function. */
314             __P((const void *, u_int32_t));
315
316         /* Recno access method. */
317         int              re_pad;        /* Fixed-length padding byte. */
318         int              re_delim;      /* Variable-length delimiting byte. */
319         u_int32_t        re_len;        /* Length for fixed-length records. */
320         char            *re_source;     /* Source file name. */
321
322 #define DB_DELIMITER            0x0001  /* Recno: re_delim set. */
323 #define DB_DUP                  0x0002  /* Btree, Hash: duplicate keys. */
324 #define DB_FIXEDLEN             0x0004  /* Recno: fixed-length records. */
325 #define DB_PAD                  0x0008  /* Recno: re_pad set. */
326 #define DB_RECNUM               0x0010  /* Btree: record numbers. */
327 #define DB_RENUMBER             0x0020  /* Recno: renumber on insert/delete. */
328 #define DB_SNAPSHOT             0x0040  /* Recno: snapshot the input. */
329         u_int32_t        flags;
330 };
331
332 /*
333  * DB access method and cursor operation codes.  These are implemented as
334  * bit fields for future flexibility, but currently only a single one may
335  * be specified to any function.
336  */
337 #define DB_AFTER        0x000001        /* c_put() */
338 #define DB_APPEND       0x000002        /* put() */
339 #define DB_BEFORE       0x000004        /* c_put() */
340 #define DB_CHECKPOINT   0x000008        /* log_put(), log_get() */
341 #define DB_CURRENT      0x000010        /* c_get(), c_put(), log_get() */
342 #define DB_FIRST        0x000020        /* c_get(), log_get() */
343 #define DB_FLUSH        0x000040        /* log_put() */
344 #define DB_GET_RECNO    0x000080        /* get(), c_get() */
345 #define DB_KEYFIRST     0x000100        /* c_put() */
346 #define DB_KEYLAST      0x000200        /* c_put() */
347 #define DB_LAST         0x000400        /* c_get(), log_get() */
348 #define DB_NEXT         0x000800        /* c_get(), log_get() */
349 #define DB_NOOVERWRITE  0x001000        /* put() */
350 #define DB_NOSYNC       0x002000        /* close() */
351 #define DB_PREV         0x004000        /* c_get(), log_get() */
352 #define DB_RECORDCOUNT  0x008000        /* stat() */
353 #define DB_SET          0x010000        /* c_get(), log_get() */
354 #define DB_SET_RANGE    0x020000        /* c_get() */
355 #define DB_SET_RECNO    0x040000        /* c_get() */
356
357 /*
358  * DB (user visible) error return codes.
359  *
360  * XXX
361  * Changes to any of the user visible error return codes must be reflected
362  * in java/src/com/sleepycat/db/Db.java.
363  */
364 #define DB_INCOMPLETE           ( -1)   /* Sync didn't finish. */
365 #define DB_KEYEMPTY             ( -2)   /* The key/data pair was deleted or
366                                            was never created by the user. */
367 #define DB_KEYEXIST             ( -3)   /* The key/data pair already exists. */
368 #define DB_LOCK_DEADLOCK        ( -4)   /* Locker killed to resolve deadlock. */
369 #define DB_LOCK_NOTGRANTED      ( -5)   /* Lock unavailable, no-wait set. */
370 #define DB_LOCK_NOTHELD         ( -6)   /* Lock not held by locker. */
371 #define DB_NOTFOUND             ( -7)   /* Key/data pair not found (EOF). */
372
373 /* DB (private) error return codes. */
374 #define DB_DELETED              ( -8)   /* Recovery file marked deleted. */
375 #define DB_NEEDSPLIT            ( -9)   /* Page needs to be split. */
376 #define DB_REGISTERED           (-10)   /* Entry was previously registered. */
377 #define DB_SWAPBYTES            (-11)   /* Database needs byte swapping. */
378 #define DB_TXN_CKP              (-12)   /* Encountered ckp record in log. */
379
380 struct __db_ilock {                     /* Internal DB access method lock. */
381         db_pgno_t       pgno;           /* Page being locked. */
382                                         /* File id. */
383         u_int8_t        fileid[DB_FILE_ID_LEN];
384 };
385
386 /* DB access method description structure. */
387 struct __db {
388         void    *mutexp;                /* Synchronization for free threading */
389         DBTYPE   type;                  /* DB access method. */
390         DB_ENV  *dbenv;                 /* DB_ENV structure. */
391         DB_ENV  *mp_dbenv;              /* DB_ENV for local mpool creation. */
392
393         DB      *master;                /* Original DB created by db_open. */
394         void    *internal;              /* Access method private. */
395
396         DB_MPOOL        *mp;            /* The access method's mpool. */
397         DB_MPOOLFILE    *mpf;           /* The access method's mpool file. */
398
399         /*
400          * XXX
401          * Explicit representations of structures in queue.h.
402          *
403          * TAILQ_HEAD(curs_queue, __dbc);
404          */
405         struct {
406                 struct __dbc *tqh_first;
407                 struct __dbc **tqh_last;
408         } curs_queue;
409
410         /*
411          * XXX
412          * Explicit representations of structures in queue.h.
413          *
414          * LIST_HEAD(handleq, __db);
415          * LIST_ENTRY(__db);
416          */
417         struct {
418                 struct __db *lh_first;
419         } handleq;                      /* List of handles for this DB. */
420         struct {
421                 struct __db *le_next;
422                 struct __db **le_prev;
423         } links;                        /* Links for the handle list. */
424
425         u_int32_t log_fileid;           /* Logging file id. */
426
427         DB_TXN   *txn;                  /* Current transaction. */
428         u_int32_t locker;               /* Default process' locker id. */
429         DBT       lock_dbt;             /* DBT referencing lock. */
430         struct __db_ilock lock;         /* Lock. */
431
432         size_t    pgsize;               /* Logical page size of file. */
433
434                                         /* Local heap allocation. */
435         void *(*db_malloc) __P((size_t));
436
437                                         /* Functions. */
438         int (*close)    __P((DB *, int));
439         int (*cursor)   __P((DB *, DB_TXN *, DBC **));
440         int (*del)      __P((DB *, DB_TXN *, DBT *, int));
441         int (*fd)       __P((DB *, int *));
442         int (*get)      __P((DB *, DB_TXN *, DBT *, DBT *, int));
443         int (*put)      __P((DB *, DB_TXN *, DBT *, DBT *, int));
444         int (*stat)     __P((DB *, void *, void *(*)(size_t), int));
445         int (*sync)     __P((DB *, int));
446
447 #define DB_AM_DUP       0x000001        /* DB_DUP (internal). */
448 #define DB_AM_INMEM     0x000002        /* In-memory; no sync on close. */
449 #define DB_AM_LOCKING   0x000004        /* Perform locking. */
450 #define DB_AM_LOGGING   0x000008        /* Perform logging. */
451 #define DB_AM_MLOCAL    0x000010        /* Database memory pool is local. */
452 #define DB_AM_PGDEF     0x000020        /* Page size was defaulted. */
453 #define DB_AM_RDONLY    0x000040        /* Database is readonly. */
454 #define DB_AM_RECOVER   0x000080        /* In recovery (do not log or lock). */
455 #define DB_AM_SWAP      0x000100        /* Pages need to be byte-swapped. */
456 #define DB_AM_THREAD    0x000200        /* DB is multi-threaded. */
457 #define DB_BT_RECNUM    0x000400        /* DB_RECNUM (internal) */
458 #define DB_HS_DIRTYMETA 0x000800        /* Hash: Metadata page modified. */
459 #define DB_RE_DELIMITER 0x001000        /* DB_DELIMITER (internal). */
460 #define DB_RE_FIXEDLEN  0x002000        /* DB_FIXEDLEN (internal). */
461 #define DB_RE_PAD       0x004000        /* DB_PAD (internal). */
462 #define DB_RE_RENUMBER  0x008000        /* DB_RENUMBER (internal). */
463 #define DB_RE_SNAPSHOT  0x010000        /* DB_SNAPSHOT (internal). */
464         u_int32_t flags;
465 };
466
467 /* Cursor description structure. */
468 struct __dbc {
469         DB *dbp;                        /* Related DB access method. */
470         DB_TXN   *txn;                  /* Associated transaction. */
471
472         /*
473          * XXX
474          * Explicit representations of structures in queue.h.
475          *
476          * TAILQ_ENTRY(__dbc);
477          */
478         struct {
479                 struct __dbc *tqe_next;
480                 struct __dbc **tqe_prev;
481         } links;
482
483         void     *internal;             /* Access method private. */
484
485         int (*c_close)  __P((DBC *));
486         int (*c_del)    __P((DBC *, int));
487         int (*c_get)    __P((DBC *, DBT *, DBT *, int));
488         int (*c_put)    __P((DBC *, DBT *, DBT *, int));
489 };
490
491 /* Btree/recno statistics structure. */
492 struct __db_bt_stat {
493         u_int32_t bt_flags;             /* Open flags. */
494         u_int32_t bt_maxkey;            /* Maxkey value. */
495         u_int32_t bt_minkey;            /* Minkey value. */
496         u_int32_t bt_re_len;            /* Fixed-length record length. */
497         u_int32_t bt_re_pad;            /* Fixed-length record pad. */
498         u_int32_t bt_pagesize;          /* Page size. */
499         u_int32_t bt_levels;            /* Tree levels. */
500         u_int32_t bt_nrecs;             /* Number of records. */
501         u_int32_t bt_int_pg;            /* Internal pages. */
502         u_int32_t bt_leaf_pg;           /* Leaf pages. */
503         u_int32_t bt_dup_pg;            /* Duplicate pages. */
504         u_int32_t bt_over_pg;           /* Overflow pages. */
505         u_int32_t bt_free;              /* Pages on the free list. */
506         u_int32_t bt_freed;             /* Pages freed for reuse. */
507         u_int32_t bt_int_pgfree;        /* Bytes free in internal pages. */
508         u_int32_t bt_leaf_pgfree;       /* Bytes free in leaf pages. */
509         u_int32_t bt_dup_pgfree;        /* Bytes free in duplicate pages. */
510         u_int32_t bt_over_pgfree;       /* Bytes free in overflow pages. */
511         u_int32_t bt_pfxsaved;          /* Bytes saved by prefix compression. */
512         u_int32_t bt_split;             /* Total number of splits. */
513         u_int32_t bt_rootsplit;         /* Root page splits. */
514         u_int32_t bt_fastsplit;         /* Fast splits. */
515         u_int32_t bt_added;             /* Items added. */
516         u_int32_t bt_deleted;           /* Items deleted. */
517         u_int32_t bt_get;               /* Items retrieved. */
518         u_int32_t bt_cache_hit;         /* Hits in fast-insert code. */
519         u_int32_t bt_cache_miss;        /* Misses in fast-insert code. */
520         u_int32_t bt_magic;             /* Magic number. */
521         u_int32_t bt_version;           /* Version number. */
522 };
523
524 #if defined(__cplusplus)
525 extern "C" {
526 #endif
527 int   db_appinit __P((const char *, char * const *, DB_ENV *, int));
528 int   db_appexit __P((DB_ENV *));
529 int   db_jump_set __P((void *, int));
530 int   db_open __P((const char *, DBTYPE, int, int, DB_ENV *, DB_INFO *, DB **));
531 int   db_value_set __P((int, int));
532 char *db_version __P((int *, int *, int *));
533 #if defined(__cplusplus)
534 }
535 #endif
536
537 /*******************************************************
538  * Locking
539  *******************************************************/
540 #define DB_LOCKVERSION  1
541 #define DB_LOCKMAGIC    0x090193
542
543 /* Flag values for lock_vec(). */
544 #define DB_LOCK_NOWAIT          0x01    /* Don't wait on unavailable lock. */
545
546 /* Flag values for lock_detect(). */
547 #define DB_LOCK_CONFLICT        0x01    /* Run on any conflict. */
548
549 /*
550  * Request types.
551  *
552  * XXX
553  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
554  */
555 typedef enum {
556         DB_LOCK_DUMP=0,                 /* Display held locks. */
557         DB_LOCK_GET,                    /* Get the lock. */
558         DB_LOCK_PUT,                    /* Release the lock. */
559         DB_LOCK_PUT_ALL,                /* Release locker's locks. */
560         DB_LOCK_PUT_OBJ                 /* Release locker's locks on obj. */
561 } db_lockop_t;
562
563 /*
564  * Simple R/W lock modes and for multi-granularity intention locking.
565  *
566  * XXX
567  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
568  */
569 typedef enum {
570         DB_LOCK_NG=0,                   /* Not granted. */
571         DB_LOCK_READ,                   /* Shared/read. */
572         DB_LOCK_WRITE,                  /* Exclusive/write. */
573         DB_LOCK_IREAD,                  /* Intent to share/read. */
574         DB_LOCK_IWRITE,                 /* Intent exclusive/write. */
575         DB_LOCK_IWR                     /* Intent to read and write. */
576 } db_lockmode_t;
577
578 /* Lock request structure. */
579 struct __db_lockreq {
580         db_lockop_t      op;            /* Operation. */
581         db_lockmode_t    mode;          /* Requested mode. */
582         u_int32_t        locker;        /* Locker identity. */
583         DBT             *obj;           /* Object being locked. */
584         DB_LOCK          lock;          /* Lock returned. */
585 };
586
587 /*
588  * Commonly used conflict matrices.
589  *
590  * Standard Read/Write (or exclusive/shared) locks.
591  */
592 #define DB_LOCK_RW_N    3
593 extern const u_int8_t db_rw_conflicts[];
594
595 /* Multi-granularity locking. */
596 #define DB_LOCK_RIW_N   6
597 extern const u_int8_t db_riw_conflicts[];
598
599 #if defined(__cplusplus)
600 extern "C" {
601 #endif
602 int       lock_close __P((DB_LOCKTAB *));
603 int       lock_detect __P((DB_LOCKTAB *, int, int));
604 int       lock_get __P((DB_LOCKTAB *,
605             u_int32_t, int, const DBT *, db_lockmode_t, DB_LOCK *));
606 int       lock_id __P((DB_LOCKTAB *, u_int32_t *));
607 int       lock_open __P((const char *, int, int, DB_ENV *, DB_LOCKTAB **));
608 int       lock_put __P((DB_LOCKTAB *, DB_LOCK));
609 int       lock_unlink __P((const char *, int, DB_ENV *));
610 int       lock_vec __P((DB_LOCKTAB *,
611             u_int32_t, int, DB_LOCKREQ *, int, DB_LOCKREQ **));
612 #if defined(__cplusplus)
613 }
614 #endif
615
616 /*******************************************************
617  * Logging.
618  *******************************************************/
619 /* Flag values for log_archive(). */
620 #define DB_ARCH_ABS             0x001   /* Absolute pathnames. */
621 #define DB_ARCH_DATA            0x002   /* Data files. */
622 #define DB_ARCH_LOG             0x004   /* Log files. */
623
624 /*
625  * A DB_LSN has two parts, a fileid which identifies a specific file, and an
626  * offset within that file.  The fileid is an unsigned 4-byte quantity that
627  * uniquely identifies a file within the log directory -- currently a simple
628  * counter inside the log.  The offset is also an unsigned 4-byte value.  The
629  * log manager guarantees the offset is never more than 4 bytes by switching
630  * to a new log file before the maximum length imposed by an unsigned 4-byte
631  * offset is reached.
632  */
633 struct __db_lsn {
634         u_int32_t       file;           /* File ID. */
635         u_int32_t       offset;         /* File offset. */
636 };
637
638 /* Log statistics structure. */
639 struct __db_log_stat {
640         u_int32_t st_magic;             /* Log file magic number. */
641         u_int32_t st_version;           /* Log file version number. */
642         int st_mode;                    /* Log file mode. */
643         u_int32_t st_lg_max;            /* Maximum log file size. */
644         u_int32_t st_w_bytes;           /* Bytes to log. */
645         u_int32_t st_w_mbytes;          /* Megabytes to log. */
646         u_int32_t st_wc_bytes;          /* Bytes to log since checkpoint. */
647         u_int32_t st_wc_mbytes;         /* Megabytes to log since checkpoint. */
648         u_int32_t st_wcount;            /* Total syncs to the log. */
649         u_int32_t st_scount;            /* Total writes to the log. */
650         u_int32_t st_region_wait;       /* Region lock granted after wait. */
651         u_int32_t st_region_nowait;     /* Region lock granted without wait. */
652         u_int32_t st_cur_file;          /* Current log file number. */
653         u_int32_t st_cur_offset;        /* Current log file offset. */
654 };
655
656 #if defined(__cplusplus)
657 extern "C" {
658 #endif
659 int      log_archive __P((DB_LOG *, char **[], int, void *(*)(size_t)));
660 int      log_close __P((DB_LOG *));
661 int      log_compare __P((const DB_LSN *, const DB_LSN *));
662 int      log_file __P((DB_LOG *, const DB_LSN *, char *, size_t));
663 int      log_flush __P((DB_LOG *, const DB_LSN *));
664 int      log_get __P((DB_LOG *, DB_LSN *, DBT *, int));
665 int      log_open __P((const char *, int, int, DB_ENV *, DB_LOG **));
666 int      log_put __P((DB_LOG *, DB_LSN *, const DBT *, int));
667 int      log_register __P((DB_LOG *, DB *, const char *, DBTYPE, u_int32_t *));
668 int      log_stat __P((DB_LOG *, DB_LOG_STAT **, void *(*)(size_t)));
669 int      log_unlink __P((const char *, int, DB_ENV *));
670 int      log_unregister __P((DB_LOG *, u_int32_t));
671 #if defined(__cplusplus)
672 }
673 #endif
674
675 /*******************************************************
676  * Mpool
677  *******************************************************/
678 /* Flag values for memp_fget(). */
679 #define DB_MPOOL_CREATE         0x001   /* Create a page. */
680 #define DB_MPOOL_LAST           0x002   /* Return the last page. */
681 #define DB_MPOOL_NEW            0x004   /* Create a new page. */
682
683 /* Flag values for memp_fput(), memp_fset(). */
684 #define DB_MPOOL_CLEAN          0x001   /* Clear modified bit. */
685 #define DB_MPOOL_DIRTY          0x002   /* Page is modified. */
686 #define DB_MPOOL_DISCARD        0x004   /* Don't cache the page. */
687
688 /* Mpool statistics structure. */
689 struct __db_mpool_stat {
690         size_t st_cachesize;            /* Cache size. */
691         u_int32_t st_cache_hit;         /* Pages found in the cache. */
692         u_int32_t st_cache_miss;        /* Pages not found in the cache. */
693         u_int32_t st_map;               /* Pages from mapped files. */
694         u_int32_t st_page_create;       /* Pages created in the cache. */
695         u_int32_t st_page_in;           /* Pages read in. */
696         u_int32_t st_page_out;          /* Pages written out. */
697         u_int32_t st_ro_evict;          /* Clean pages forced from the cache. */
698         u_int32_t st_rw_evict;          /* Dirty pages forced from the cache. */
699         u_int32_t st_hash_buckets;      /* Number of hash buckets. */
700         u_int32_t st_hash_searches;     /* Total hash chain searches. */
701         u_int32_t st_hash_longest;      /* Longest hash chain searched. */
702         u_int32_t st_hash_examined;     /* Total hash entries searched. */
703         u_int32_t st_page_clean;        /* Clean pages. */
704         u_int32_t st_page_dirty;        /* Dirty pages. */
705         u_int32_t st_page_trickle;      /* Pages written by memp_trickle. */
706         u_int32_t st_region_wait;       /* Region lock granted after wait. */
707         u_int32_t st_region_nowait;     /* Region lock granted without wait. */
708 };
709
710 /* Mpool file statistics structure. */
711 struct __db_mpool_fstat {
712         char *file_name;                /* File name. */
713         size_t st_pagesize;             /* Page size. */
714         u_int32_t st_cache_hit;         /* Pages found in the cache. */
715         u_int32_t st_cache_miss;        /* Pages not found in the cache. */
716         u_int32_t st_map;               /* Pages from mapped files. */
717         u_int32_t st_page_create;       /* Pages created in the cache. */
718         u_int32_t st_page_in;           /* Pages read in. */
719         u_int32_t st_page_out;          /* Pages written out. */
720 };
721
722 #if defined(__cplusplus)
723 extern "C" {
724 #endif
725 int     memp_close __P((DB_MPOOL *));
726 int     memp_fclose __P((DB_MPOOLFILE *));
727 int     memp_fget __P((DB_MPOOLFILE *, db_pgno_t *, int, void *));
728 int     memp_fopen __P((DB_MPOOL *, const char *,
729             int, int, int, size_t, int, DBT *, u_int8_t *, DB_MPOOLFILE **));
730 int     memp_fput __P((DB_MPOOLFILE *, void *, int));
731 int     memp_fset __P((DB_MPOOLFILE *, void *, int));
732 int     memp_fsync __P((DB_MPOOLFILE *));
733 int     memp_open __P((const char *, int, int, DB_ENV *, DB_MPOOL **));
734 int     memp_register __P((DB_MPOOL *, int,
735             int (*)(db_pgno_t, void *, DBT *),
736             int (*)(db_pgno_t, void *, DBT *)));
737 int     memp_stat __P((DB_MPOOL *,
738             DB_MPOOL_STAT **, DB_MPOOL_FSTAT ***, void *(*)(size_t)));
739 int     memp_sync __P((DB_MPOOL *, DB_LSN *));
740 int     memp_trickle __P((DB_MPOOL *, int, int *));
741 int     memp_unlink __P((const char *, int, DB_ENV *));
742 #if defined(__cplusplus)
743 }
744 #endif
745
746 /*******************************************************
747  * Transactions.
748  *******************************************************/
749 #define DB_TXNVERSION   1
750 #define DB_TXNMAGIC     0x041593
751
752 /* Operations values to the tx_recover() function. */
753 #define DB_TXN_BACKWARD_ROLL    1       /* Read the log backwards. */
754 #define DB_TXN_FORWARD_ROLL     2       /* Read the log forwards. */
755 #define DB_TXN_OPENFILES        3       /* Read for open files. */
756 #define DB_TXN_REDO             4       /* Redo the operation. */
757 #define DB_TXN_UNDO             5       /* Undo the operation. */
758
759 /* Internal transaction status values. */
760
761 /* Transaction statistics structure. */
762 struct __db_txn_active {
763         u_int32_t       txnid;          /* Transaction ID */
764         DB_LSN          lsn;            /* Lsn of the begin record */
765 };
766
767 struct __db_txn_stat {
768         DB_LSN          st_last_ckp;    /* lsn of the last checkpoint */
769         DB_LSN          st_pending_ckp; /* last checkpoint did not finish */
770         time_t          st_time_ckp;    /* time of last checkpoint */
771         u_int32_t       st_last_txnid;  /* last transaction id given out */
772         u_int32_t       st_maxtxns;     /* maximum number of active txns */
773         u_int32_t       st_naborts;     /* number of aborted transactions */
774         u_int32_t       st_nbegins;     /* number of begun transactions */
775         u_int32_t       st_ncommits;    /* number of committed transactions */
776         u_int32_t       st_nactive;     /* number of active transactions */
777         DB_TXN_ACTIVE   *st_txnarray;   /* array of active transactions */
778 };
779
780 #if defined(__cplusplus)
781 extern "C" {
782 #endif
783 int       txn_abort __P((DB_TXN *));
784 int       txn_begin __P((DB_TXNMGR *, DB_TXN *, DB_TXN **));
785 int       txn_checkpoint __P((const DB_TXNMGR *, int, int));
786 int       txn_commit __P((DB_TXN *));
787 int       txn_close __P((DB_TXNMGR *));
788 u_int32_t txn_id __P((DB_TXN *));
789 int       txn_open __P((const char *, int, int, DB_ENV *, DB_TXNMGR **));
790 int       txn_prepare __P((DB_TXN *));
791 int       txn_stat __P((DB_TXNMGR *, DB_TXN_STAT **, void *(*)(size_t)));
792 int       txn_unlink __P((const char *, int, DB_ENV *));
793 #if defined(__cplusplus)
794 }
795 #endif
796
797 #ifndef DB_DBM_HSEARCH
798 #define DB_DBM_HSEARCH  0               /* No historic interfaces by default. */
799 #endif
800 #if DB_DBM_HSEARCH != 0
801 /*******************************************************
802  * Dbm/Ndbm historic interfaces.
803  *******************************************************/
804 #define DBM_INSERT      0               /* Flags to dbm_store(). */
805 #define DBM_REPLACE     1
806
807 /*
808  * The db(3) support for ndbm(3) always appends this suffix to the
809  * file name to avoid overwriting the user's original database.
810  */
811 #define DBM_SUFFIX      ".db"
812
813 typedef struct {
814         char *dptr;
815         int dsize;
816 } datum;
817
818 /*
819  * Translate DBM calls into DB calls so that DB doesn't step on the
820  * application's name space.
821  *
822  * The global variables dbrdonly, dirf and pagf were not retained when
823  * 4BSD replaced the dbm interface with ndbm, and are not support here.
824  */
825 #define dbminit(a)      __db_dbm_init(a)
826 #if !defined(__cplusplus)
827 #define delete(a)       __db_dbm_delete(a)
828 #endif
829 #define fetch(a)        __db_dbm_fetch(a)
830 #define firstkey        __db_dbm_firstkey
831 #define nextkey(a)      __db_dbm_nextkey(a)
832 #define store(a, b)     __db_dbm_store(a, b)
833
834 /* Prototype the DB calls. */
835 #if defined(__cplusplus)
836 extern "C" {
837 #endif
838 int      __db_dbm_init __P((char *));
839 int      __db_dbm_delete __P((datum));
840 int      __db_dbm_dbrdonly __P((void));
841 int      __db_dbm_dirf __P((void));
842 datum    __db_dbm_fetch __P((datum));
843 datum    __db_dbm_firstkey __P((void));
844 datum    __db_dbm_nextkey __P((datum));
845 int      __db_dbm_pagf __P((void));
846 int      __db_dbm_store __P((datum, datum));
847 #if defined(__cplusplus)
848 }
849 #endif
850
851 /*
852  * Translate NDBM calls into DB calls so that DB doesn't step on the
853  * application's name space.
854  */
855 #define dbm_clearerr(a)         __db_ndbm_clearerr(a)
856 #define dbm_close(a)            __db_ndbm_close(a)
857 #define dbm_delete(a, b)        __db_ndbm_delete(a, b)
858 #define dbm_dirfno(a)           __db_ndbm_dirfno(a)
859 #define dbm_error(a)            __db_ndbm_error(a)
860 #define dbm_fetch(a, b)         __db_ndbm_fetch(a, b)
861 #define dbm_firstkey(a)         __db_ndbm_firstkey(a)
862 #define dbm_nextkey(a)          __db_ndbm_nextkey(a)
863 #define dbm_open(a, b, c)       __db_ndbm_open(a, b, c)
864 #define dbm_pagfno(a)           __db_ndbm_pagfno(a)
865 #define dbm_rdonly(a)           __db_ndbm_rdonly(a)
866 #define dbm_store(a, b, c, d)   __db_ndbm_store(a, b, c, d)
867
868 /* Prototype the DB calls. */
869 #if defined(__cplusplus)
870 extern "C" {
871 #endif
872 int      __db_ndbm_clearerr __P((DBM *));
873 void     __db_ndbm_close __P((DBM *));
874 int      __db_ndbm_delete __P((DBM *, datum));
875 int      __db_ndbm_dirfno __P((DBM *));
876 int      __db_ndbm_error __P((DBM *));
877 datum    __db_ndbm_fetch __P((DBM *, datum));
878 datum    __db_ndbm_firstkey __P((DBM *));
879 datum    __db_ndbm_nextkey __P((DBM *));
880 DBM     *__db_ndbm_open __P((const char *, int, int));
881 int      __db_ndbm_pagfno __P((DBM *));
882 int      __db_ndbm_rdonly __P((DBM *));
883 int      __db_ndbm_store __P((DBM *, datum, datum, int));
884 #if defined(__cplusplus)
885 }
886 #endif
887
888 /*******************************************************
889  * Hsearch historic interface.
890  *******************************************************/
891 typedef enum {
892         FIND, ENTER
893 } ACTION;
894
895 typedef struct entry {
896         char *key;
897         void *data;
898 } ENTRY;
899
900 /*
901  * Translate HSEARCH calls into DB calls so that DB doesn't step on the
902  * application's name space.
903  */
904 #define hcreate(a)      __db_hcreate(a)
905 #define hdestroy        __db_hdestroy
906 #define hsearch(a, b)   __db_hsearch(a, b)
907
908 /* Prototype the DB calls. */
909 #if defined(__cplusplus)
910 extern "C" {
911 #endif
912 int      __db_hcreate __P((unsigned int));
913 void     __db_hdestroy __P((void));
914 ENTRY   *__db_hsearch __P((ENTRY, ACTION));
915 #if defined(__cplusplus)
916 }
917 #endif
918 #endif /* DB_DBM_HSEARCH */
919
920 /*
921  * XXX
922  * MacOS: Reset Metrowerks C enum sizes.
923  */
924 #ifdef __MWERKS__
925 #pragma enumsalwaysint reset
926 #endif
927 #endif /* !_DB_H_ */