📄 db_int.in
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996-2004 * Sleepycat Software. All rights reserved. * * $Id: db_int.in,v 11.155 2004/10/28 16:07:38 ubell Exp $ */#ifndef _DB_INTERNAL_H_#define _DB_INTERNAL_H_/******************************************************* * System includes, db.h, a few general DB includes. The DB includes are * here because it's OK if db_int.h includes queue structure declarations. *******************************************************/#ifndef NO_SYSTEM_INCLUDES#if defined(STDC_HEADERS) || defined(__cplusplus)#include <stdarg.h>#else#include <varargs.h>#endif#include <errno.h>#endif#include "db.h"#include "dbinc/queue.h"#include "dbinc/shqueue.h"#if defined(__cplusplus)extern "C" {#endif/******************************************************* * General purpose constants and macros. *******************************************************/#ifndef UINT16_MAX#define UINT16_MAX 65535 /* Maximum 16-bit unsigned. */#endif#ifndef UINT32_MAX#ifdef __STDC__#define UINT32_MAX 4294967295U /* Maximum 32-bit unsigned. */#else#define UINT32_MAX 0xffffffff /* Maximum 32-bit unsigned. */#endif#endif#if defined(HAVE_LONG_LONG) && defined(HAVE_UNSIGNED_LONG_LONG)#undef INT64_MAX#undef INT64_MIN#undef UINT64_MAX#ifdef DB_WIN32#define INT64_MAX _I64_MAX#define INT64_MIN _I64_MIN#define UINT64_MAX _UI64_MAX#define INT64_FMT "%l64d"#define UINT64_FMT "%l64u"#else/* * Override the system's 64-bit min/max constants. AIX's 32-bit compiler can * handle 64-bit values, but the system's constants don't include the LL/ULL * suffix, and so can't be compiled using the 32-bit compiler. */#define INT64_MAX 9223372036854775807LL#define INT64_MIN (-INT64_MAX-1)#define UINT64_MAX 18446744073709551615ULL#define INT64_FMT "%lld"#define UINT64_FMT "%llu"#endif /* DB_WIN32 */#endif /* HAVE_LONG_LONG && HAVE_UNSIGNED_LONG_LONG */#define MEGABYTE 1048576#define GIGABYTE 1073741824#define MS_PER_SEC 1000 /* Milliseconds in a second. */#define USEC_PER_MS 1000 /* Microseconds in a millisecond. */#define RECNO_OOB 0 /* Illegal record number. *//* Test for a power-of-two (tests true for zero, which doesn't matter here). */#define POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0)/* Test for valid page sizes. */#define DB_MIN_PGSIZE 0x000200 /* Minimum page size (512). */#define DB_MAX_PGSIZE 0x010000 /* Maximum page size (65536). */#define IS_VALID_PAGESIZE(x) \ (POWER_OF_TWO(x) && (x) >= DB_MIN_PGSIZE && ((x) <= DB_MAX_PGSIZE))/* Minimum number of pages cached, by default. */#define DB_MINPAGECACHE 16/* * If we are unable to determine the underlying filesystem block size, use * 8K on the grounds that most OS's use less than 8K for a VM page size. */#define DB_DEF_IOSIZE (8 * 1024)/* Align an integer to a specific boundary. */#undef DB_ALIGN#define DB_ALIGN(v, bound) \ (((v) + (bound) - 1) & ~(((uintmax_t)bound) - 1))/* Increment a pointer to a specific boundary. */#undef ALIGNP_INC#define ALIGNP_INC(p, bound) \ (void *)(((uintptr_t)(p) + (bound) - 1) & ~(((uintptr_t)bound) - 1))/* Decrement a pointer to a specific boundary. */#undef ALIGNP_DEC#define ALIGNP_DEC(p, bound) \ (void *)((uintptr_t)(p) & ~(((uintptr_t)bound) - 1))/* * Print an address as a u_long (a u_long is the largest type we can print * portably). Most 64-bit systems have made longs 64-bits, so this should * work. */#define P_TO_ULONG(p) ((u_long)(uintptr_t)(p))/* * Convert a pointer to a small integral value. * * The (u_int16_t)(uintptr_t) cast avoids warnings: the (uintptr_t) cast * converts the value to an integral type, and the (u_int16_t) cast converts * it to a small integral type so we don't get complaints when we assign the * final result to an integral type smaller than uintptr_t. */#define P_TO_UINT32(p) ((u_int32_t)(uintptr_t)(p))#define P_TO_UINT16(p) ((u_int16_t)(uintptr_t)(p))/* * There are several on-page structures that are declared to have a number of * fields followed by a variable length array of items. The structure size * without including the variable length array or the address of the first of * those elements can be found using SSZ. * * This macro can also be used to find the offset of a structure element in a * structure. This is used in various places to copy structure elements from * unaligned memory references, e.g., pointers into a packed page. * * There are two versions because compilers object if you take the address of * an array. */#undef SSZ#define SSZ(name, field) P_TO_UINT16(&(((name *)0)->field))#undef SSZA#define SSZA(name, field) P_TO_UINT16(&(((name *)0)->field[0]))/* Structure used to print flag values. */typedef struct __fn { u_int32_t mask; /* Flag value. */ const char *name; /* Flag name. */} FN;/* Set, clear and test flags. */#define FLD_CLR(fld, f) (fld) &= ~(f)#define FLD_ISSET(fld, f) ((fld) & (f))#define FLD_SET(fld, f) (fld) |= (f)#define F_CLR(p, f) (p)->flags &= ~(f)#define F_ISSET(p, f) ((p)->flags & (f))#define F_SET(p, f) (p)->flags |= (f)#define LF_CLR(f) ((flags) &= ~(f))#define LF_ISSET(f) ((flags) & (f))#define LF_SET(f) ((flags) |= (f))/* * Calculate a percentage. The values can overflow 32-bit integer arithmetic * so we use floating point. * * When calculating a bytes-vs-page size percentage, we're getting the inverse * of the percentage in all cases, that is, we want 100 minus the percentage we * calculate. */#define DB_PCT(v, total) \ ((int)((total) == 0 ? 0 : ((double)(v) * 100) / (total)))#define DB_PCT_PG(v, total, pgsize) \ ((int)((total) == 0 ? 0 : \ 100 - ((double)(v) * 100) / ((total) * (pgsize))))/* * Structure used for callback message aggregation. * * Display values in XXX_stat_print calls. */typedef struct __db_msgbuf { char *buf; /* Heap allocated buffer. */ char *cur; /* Current end of message. */ size_t len; /* Allocated length of buffer. */} DB_MSGBUF;#define DB_MSGBUF_INIT(a) do { \ (a)->buf = (a)->cur = NULL; \ (a)->len = 0; \} while (0)#define DB_MSGBUF_FLUSH(dbenv, a) do { \ if ((a)->buf != NULL) { \ if ((a)->cur != (a)->buf) \ __db_msg(dbenv, "%s", (a)->buf); \ __os_free(dbenv, (a)->buf); \ DB_MSGBUF_INIT(a); \ } \} while (0)#define STAT_FMT(msg, fmt, type, v) do { \ DB_MSGBUF __mb; \ DB_MSGBUF_INIT(&__mb); \ __db_msgadd(dbenv, &__mb, fmt, (type)(v)); \ __db_msgadd(dbenv, &__mb, "\t%s", msg); \ DB_MSGBUF_FLUSH(dbenv, &__mb); \} while (0)#define STAT_HEX(msg, v) \ __db_msg(dbenv, "%#lx\t%s", (u_long)(v), msg)#define STAT_ISSET(msg, p) \ __db_msg(dbenv, "%sSet\t%s", (p) == NULL ? "!" : " ", msg)#define STAT_LONG(msg, v) \ __db_msg(dbenv, "%ld\t%s", (long)(v), msg)#define STAT_LSN(msg, lsnp) \ __db_msg(dbenv, "%lu/%lu\t%s", \ (u_long)(lsnp)->file, (u_long)(lsnp)->offset, msg)#define STAT_STRING(msg, p) do { \ const char *__p = p; /* p may be a function call. */ \ __db_msg(dbenv, "%s\t%s", __p == NULL ? "!Set" : __p, msg); \} while (0)#define STAT_ULONG(msg, v) \ __db_msg(dbenv, "%lu\t%s", (u_long)(v), msg)/******************************************************* * API return values *******************************************************//* * Return values that are OK for each different call. Most calls have a * standard 'return of 0 is only OK value', but some, like db->get have * DB_NOTFOUND as a return value, but it really isn't an error. */#define DB_RETOK_STD(ret) ((ret) == 0)#define DB_RETOK_DBCDEL(ret) ((ret) == 0 || (ret) == DB_KEYEMPTY || \ (ret) == DB_NOTFOUND)#define DB_RETOK_DBCGET(ret) ((ret) == 0 || (ret) == DB_KEYEMPTY || \ (ret) == DB_NOTFOUND)#define DB_RETOK_DBCPUT(ret) ((ret) == 0 || (ret) == DB_KEYEXIST || \ (ret) == DB_NOTFOUND)#define DB_RETOK_DBDEL(ret) DB_RETOK_DBCDEL(ret)#define DB_RETOK_DBGET(ret) DB_RETOK_DBCGET(ret)#define DB_RETOK_DBPUT(ret) ((ret) == 0 || (ret) == DB_KEYEXIST)#define DB_RETOK_LGGET(ret) ((ret) == 0 || (ret) == DB_NOTFOUND)#define DB_RETOK_MPGET(ret) ((ret) == 0 || (ret) == DB_PAGE_NOTFOUND)#define DB_RETOK_REPPMSG(ret) ((ret) == 0 || \ (ret) == DB_REP_ISPERM || \ (ret) == DB_REP_NEWMASTER || \ (ret) == DB_REP_NEWSITE || \ (ret) == DB_REP_NOTPERM || \ (ret) == DB_REP_STARTUPDONE)/* Find a reasonable operation-not-supported error. */#ifdef EOPNOTSUPP#define DB_OPNOTSUP EOPNOTSUPP#else#ifdef ENOTSUP#define DB_OPNOTSUP ENOTSUP#else#define DB_OPNOTSUP EINVAL#endif#endif/******************************************************* * Files. *******************************************************//* * We use 1024 as the maximum path length. It's too hard to figure out what * the real path length is, as it was traditionally stored in <sys/param.h>, * and that file isn't always available. */#undef MAXPATHLEN#define MAXPATHLEN 1024#define PATH_DOT "." /* Current working directory. */ /* Path separator character(s). */#define PATH_SEPARATOR "@PATH_SEPARATOR@"/******************************************************* * Environment. *******************************************************//* Type passed to __db_appname(). */typedef enum { DB_APP_NONE=0, /* No type (region). */ DB_APP_DATA, /* Data file. */ DB_APP_LOG, /* Log file. */ DB_APP_TMP /* Temporary file. */} APPNAME;/* * CDB_LOCKING CDB product locking. * CRYPTO_ON Security has been configured.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -