db_int.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:16k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: db_int.in,v 11.106 2002/09/10 02:48:08 bostic Exp $
  8.  */
  9. #ifndef _DB_INTERNAL_H_
  10. #define _DB_INTERNAL_H_
  11. /*******************************************************
  12.  * System includes, db.h, a few general DB includes.  The DB includes are
  13.  * here because it's OK if db_int.h includes queue structure declarations.
  14.  *******************************************************/
  15. #ifndef NO_SYSTEM_INCLUDES
  16. #if defined(__STDC__) || defined(__cplusplus)
  17. #include <stdarg.h>
  18. #else
  19. #include <varargs.h>
  20. #endif
  21. #include <errno.h>
  22. #endif
  23. #include "db.h"
  24. #include "dbinc/queue.h"
  25. #include "dbinc/shqueue.h"
  26. #if defined(__cplusplus)
  27. extern "C" {
  28. #endif
  29. /*******************************************************
  30.  * General purpose constants and macros.
  31.  *******************************************************/
  32. #define UINT16_T_MAX     0xffff /* Maximum 16 bit unsigned. */
  33. #define UINT32_T_MAX 0xffffffff /* Maximum 32 bit unsigned. */
  34. #define MEGABYTE 1048576
  35. #define GIGABYTE 1073741824
  36. #define MS_PER_SEC 1000 /* Milliseconds in a second. */
  37. #define USEC_PER_MS 1000 /* Microseconds in a millisecond. */
  38. #define RECNO_OOB 0 /* Illegal record number. */
  39. /* Test for a power-of-two (tests true for zero, which doesn't matter here). */
  40. #define POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0)
  41. /* Test for valid page sizes. */
  42. #define DB_MIN_PGSIZE 0x000200 /* Minimum page size (512). */
  43. #define DB_MAX_PGSIZE 0x010000 /* Maximum page size (65536). */
  44. #define IS_VALID_PAGESIZE(x)
  45. (POWER_OF_TWO(x) && (x) >= DB_MIN_PGSIZE && ((x) <= DB_MAX_PGSIZE))
  46. /* Minimum number of pages cached, by default. */
  47. #define DB_MINPAGECACHE 16
  48. /*
  49.  * If we are unable to determine the underlying filesystem block size, use
  50.  * 8K on the grounds that most OS's use less than 8K for a VM page size.
  51.  */
  52. #define DB_DEF_IOSIZE (8 * 1024)
  53. /*
  54.  * Aligning items to particular sizes or in pages or memory.
  55.  *
  56.  * db_align_t --
  57.  * Largest integral type, used to align structures in memory.  We don't store
  58.  * floating point types in structures, so integral types should be sufficient
  59.  * (and we don't have to worry about systems that store floats in other than
  60.  * power-of-2 numbers of bytes).  Additionally this fixes compiler that rewrite
  61.  * structure assignments and ANSI C memcpy calls to be in-line instructions
  62.  * that happen to require alignment.  Note: this alignment isn't sufficient for
  63.  * mutexes, which depend on things like cache line alignment.  Mutex alignment
  64.  * is handled separately, in mutex.h.
  65.  *
  66.  * db_alignp_t --
  67.  * Integral type that's the same size as a pointer.  There are places where
  68.  * DB modifies pointers by discarding the bottom bits to guarantee alignment.
  69.  * We can't use db_align_t, it may be larger than the pointer, and compilers
  70.  * get upset about that.  So far we haven't run on any machine where there
  71.  * isn't an integral type the same size as a pointer -- here's hoping.
  72.  */
  73. typedef unsigned long long db_align_t;
  74. typedef unsigned int db_alignp_t;
  75. /* Align an integer to a specific boundary. */
  76. #undef ALIGN
  77. #define ALIGN(v, bound) (((v) + (bound) - 1) & ~(((db_align_t)bound) - 1))
  78. /*
  79.  * Print an address as a u_long (a u_long is the largest type we can print
  80.  * portably).  Most 64-bit systems have made longs 64-bits, so this should
  81.  * work.
  82.  */
  83. #define P_TO_ULONG(p) ((u_long)(db_alignp_t)(p))
  84. /*
  85.  * Convert a pointer to a small integral value.
  86.  *
  87.  * The (u_int16_t)(db_alignp_t) cast avoids warnings: the (db_alignp_t) cast
  88.  * converts the value to an integral type, and the (u_int16_t) cast converts
  89.  * it to a small integral type so we don't get complaints when we assign the
  90.  * final result to an integral type smaller than db_alignp_t.
  91.  */
  92. #define P_TO_UINT32(p) ((u_int32_t)(db_alignp_t)(p))
  93. #define P_TO_UINT16(p) ((u_int16_t)(db_alignp_t)(p))
  94. /*
  95.  * There are several on-page structures that are declared to have a number of
  96.  * fields followed by a variable length array of items.  The structure size
  97.  * without including the variable length array or the address of the first of
  98.  * those elements can be found using SSZ.
  99.  *
  100.  * This macro can also be used to find the offset of a structure element in a
  101.  * structure.  This is used in various places to copy structure elements from
  102.  * unaligned memory references, e.g., pointers into a packed page.
  103.  *
  104.  * There are two versions because compilers object if you take the address of
  105.  * an array.
  106.  */
  107. #undef SSZ
  108. #define SSZ(name, field)  P_TO_UINT16(&(((name *)0)->field))
  109. #undef SSZA
  110. #define SSZA(name, field) P_TO_UINT16(&(((name *)0)->field[0]))
  111. /* Structure used to print flag values. */
  112. typedef struct __fn {
  113. u_int32_t mask; /* Flag value. */
  114. const char *name; /* Flag name. */
  115. } FN;
  116. /* Set, clear and test flags. */
  117. #define FLD_CLR(fld, f) (fld) &= ~(f)
  118. #define FLD_ISSET(fld, f) ((fld) & (f))
  119. #define FLD_SET(fld, f) (fld) |= (f)
  120. #define F_CLR(p, f) (p)->flags &= ~(f)
  121. #define F_ISSET(p, f) ((p)->flags & (f))
  122. #define F_SET(p, f) (p)->flags |= (f)
  123. #define LF_CLR(f) ((flags) &= ~(f))
  124. #define LF_ISSET(f) ((flags) & (f))
  125. #define LF_SET(f) ((flags) |= (f))
  126. /* Display separator string. */
  127. #undef DB_LINE
  128. #define DB_LINE "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="
  129. /* Unused, or not-used-yet variable.  "Shut that bloody compiler up!" */
  130. #define COMPQUIET(n, v) (n) = (v)
  131. /*******************************************************
  132.  * API return values
  133.  *******************************************************/
  134.  /*
  135.   * Return values that are OK for each different call.  Most calls have
  136.   * a standard 'return of 0 is only OK value', but some, like db->get
  137.   * have DB_NOTFOUND as a return value, but it really isn't an error.
  138.   */
  139. #define DB_RETOK_STD(ret) ((ret) == 0)
  140. #define DB_RETOK_DBCDEL(ret) ((ret) == 0 || (ret) == DB_KEYEMPTY || 
  141.     (ret) == DB_NOTFOUND)
  142. #define DB_RETOK_DBCGET(ret) DB_RETOK_DBGET(ret)
  143. #define DB_RETOK_DBCPUT(ret) ((ret) == 0 || (ret) == DB_KEYEXIST || 
  144.     (ret) == DB_NOTFOUND)
  145. #define DB_RETOK_DBDEL(ret) ((ret) == 0 || (ret) == DB_NOTFOUND)
  146. #define DB_RETOK_DBGET(ret) ((ret) == 0 || (ret) == DB_KEYEMPTY || 
  147.     (ret) == DB_NOTFOUND)
  148. #define DB_RETOK_DBPUT(ret) ((ret) == 0 || (ret) == DB_KEYEXIST)
  149. #define DB_RETOK_LGGET(ret) ((ret) == 0 || (ret) == DB_NOTFOUND)
  150. #define DB_RETOK_MPGET(ret) ((ret) == 0 || (ret) == DB_PAGE_NOTFOUND)
  151. #define DB_RETOK_REPPMSG(ret) ((ret) == 0 || (ret) == DB_REP_NEWMASTER || 
  152.     (ret) == DB_REP_NEWSITE)
  153. /*******************************************************
  154.  * Files.
  155.  *******************************************************/
  156.  /*
  157.   * We use 1024 as the maximum path length.  It's too hard to figure out what
  158.   * the real path length is, as it was traditionally stored in <sys/param.h>,
  159.   * and that file isn't always available.
  160.   */
  161. #undef MAXPATHLEN
  162. #define MAXPATHLEN 1024
  163. #define PATH_DOT "." /* Current working directory. */
  164. #define PATH_SEPARATOR "/" /* Path separator character(s). */
  165. /*
  166.  * Flags understood by __os_open.
  167.  */
  168. #define DB_OSO_CREATE 0x0001 /* POSIX: O_CREAT */
  169. #define DB_OSO_DIRECT 0x0002 /* Don't buffer the file in the OS. */
  170. #define DB_OSO_EXCL 0x0004 /* POSIX: O_EXCL */
  171. #define DB_OSO_LOG 0x0008 /* Opening a log file. */
  172. #define DB_OSO_RDONLY 0x0010 /* POSIX: O_RDONLY */
  173. #define DB_OSO_REGION 0x0020 /* Opening a region file. */
  174. #define DB_OSO_SEQ 0x0040 /* Expected sequential access. */
  175. #define DB_OSO_TEMP 0x0080 /* Remove after last close. */
  176. #define DB_OSO_TRUNC 0x0100 /* POSIX: O_TRUNC */
  177. /*
  178.  * Seek options understood by __os_seek.
  179.  */
  180. typedef enum {
  181. DB_OS_SEEK_CUR, /* POSIX: SEEK_CUR */
  182. DB_OS_SEEK_END, /* POSIX: SEEK_END */
  183. DB_OS_SEEK_SET /* POSIX: SEEK_SET */
  184. } DB_OS_SEEK;
  185. /*******************************************************
  186.  * Environment.
  187.  *******************************************************/
  188. /* Type passed to __db_appname(). */
  189. typedef enum {
  190. DB_APP_NONE=0, /* No type (region). */
  191. DB_APP_DATA, /* Data file. */
  192. DB_APP_LOG, /* Log file. */
  193. DB_APP_TMP /* Temporary file. */
  194. } APPNAME;
  195. /*
  196.  * CDB_LOCKING CDB product locking.
  197.  * CRYPTO_ON Security has been configured.
  198.  * LOCKING_ON Locking has been configured.
  199.  * LOGGING_ON Logging has been configured.
  200.  * MPOOL_ON Memory pool has been configured.
  201.  * RPC_ON RPC has been configured.
  202.  * TXN_ON Transactions have been configured.
  203.  */
  204. #define CDB_LOCKING(dbenv) F_ISSET(dbenv, DB_ENV_CDB)
  205. #define CRYPTO_ON(dbenv) ((dbenv)->crypto_handle != NULL)
  206. #define LOCKING_ON(dbenv) ((dbenv)->lk_handle != NULL)
  207. #define LOGGING_ON(dbenv) ((dbenv)->lg_handle != NULL)
  208. #define MPOOL_ON(dbenv) ((dbenv)->mp_handle != NULL)
  209. #define RPC_ON(dbenv) ((dbenv)->cl_handle != NULL)
  210. #define TXN_ON(dbenv) ((dbenv)->tx_handle != NULL)
  211. /*
  212.  * STD_LOCKING Standard locking, that is, locking was configured and CDB
  213.  * was not.  We do not do locking in off-page duplicate trees,
  214.  * so we check for that in the cursor first.
  215.  */
  216. #define STD_LOCKING(dbc)
  217. (!F_ISSET(dbc, DBC_OPD) &&
  218.     !CDB_LOCKING((dbc)->dbp->dbenv) && LOCKING_ON((dbc)->dbp->dbenv))
  219. /*
  220.  * IS_RECOVERING: The system is running recovery.
  221.  */
  222. #define IS_RECOVERING(dbenv)
  223. (LOGGING_ON(dbenv) &&
  224.     F_ISSET((DB_LOG *)(dbenv)->lg_handle, DBLOG_RECOVER))
  225. /* Initialization methods are often illegal before/after open is called. */
  226. #define ENV_ILLEGAL_AFTER_OPEN(dbenv, name)
  227. if (F_ISSET((dbenv), DB_ENV_OPEN_CALLED))
  228. return (__db_mi_open(dbenv, name, 1));
  229. #define ENV_ILLEGAL_BEFORE_OPEN(dbenv, name)
  230. if (!F_ISSET((dbenv), DB_ENV_OPEN_CALLED))
  231. return (__db_mi_open(dbenv, name, 0));
  232. /* We're not actually user hostile, honest. */
  233. #define ENV_REQUIRES_CONFIG(dbenv, handle, i, flags)
  234. if (handle == NULL)
  235. return (__db_env_config(dbenv, i, flags));
  236. /*******************************************************
  237.  * Database Access Methods.
  238.  *******************************************************/
  239. /*
  240.  * DB_IS_THREADED --
  241.  * The database handle is free-threaded (was opened with DB_THREAD).
  242.  */
  243. #define DB_IS_THREADED(dbp)
  244. ((dbp)->mutexp != NULL)
  245. /* Initialization methods are often illegal before/after open is called. */
  246. #define DB_ILLEGAL_AFTER_OPEN(dbp, name)
  247. if (F_ISSET((dbp), DB_AM_OPEN_CALLED))
  248. return (__db_mi_open((dbp)->dbenv, name, 1));
  249. #define DB_ILLEGAL_BEFORE_OPEN(dbp, name)
  250. if (!F_ISSET((dbp), DB_AM_OPEN_CALLED))
  251. return (__db_mi_open((dbp)->dbenv, name, 0));
  252. /* Some initialization methods are illegal if environment isn't local. */
  253. #define DB_ILLEGAL_IN_ENV(dbp, name)
  254. if (!F_ISSET((dbp)->dbenv, DB_ENV_DBLOCAL))
  255. return (__db_mi_env((dbp)->dbenv, name));
  256. #define DB_ILLEGAL_METHOD(dbp, flags) {
  257. int __ret;
  258. if ((__ret = __dbh_am_chk(dbp, flags)) != 0)
  259. return (__ret);
  260. }
  261. /*
  262.  * Common DBC->internal fields.  Each access method adds additional fields
  263.  * to this list, but the initial fields are common.
  264.  */
  265. #define __DBC_INTERNAL
  266. DBC  *opd; /* Off-page duplicate cursor. */
  267. void  *page; /* Referenced page. */
  268. db_pgno_t root; /* Tree root. */
  269. db_pgno_t pgno; /* Referenced page number. */
  270. db_indx_t indx; /* Referenced key item index. */
  271. DB_LOCK lock; /* Cursor lock. */
  272. db_lockmode_t lock_mode; /* Lock mode. */
  273. struct __dbc_internal {
  274. __DBC_INTERNAL
  275. };
  276. /* Actions that __db_master_update can take. */
  277. typedef enum { MU_REMOVE, MU_RENAME, MU_OPEN } mu_action;
  278. /*
  279.  * Access-method-common macro for determining whether a cursor
  280.  * has been initialized.
  281.  */
  282. #define IS_INITIALIZED(dbc) ((dbc)->internal->pgno != PGNO_INVALID)
  283. /* Free the callback-allocated buffer, if necessary, hanging off of a DBT. */
  284. #define FREE_IF_NEEDED(sdbp, dbt)
  285. if (F_ISSET((dbt), DB_DBT_APPMALLOC)) {
  286. __os_ufree((sdbp)->dbenv, (dbt)->data);
  287. F_CLR((dbt), DB_DBT_APPMALLOC);
  288. }
  289. /*
  290.  * Use memory belonging to object "owner" to return the results of
  291.  * any no-DBT-flag get ops on cursor "dbc".
  292.  */
  293. #define SET_RET_MEM(dbc, owner)
  294. do {
  295. (dbc)->rskey = &(owner)->my_rskey;
  296. (dbc)->rkey = &(owner)->my_rkey;
  297. (dbc)->rdata = &(owner)->my_rdata;
  298. } while (0)
  299. /* Use the return-data memory src is currently set to use in dest as well. */
  300. #define COPY_RET_MEM(src, dest)
  301. do {
  302. (dest)->rskey = (src)->rskey;
  303. (dest)->rkey = (src)->rkey;
  304. (dest)->rdata = (src)->rdata;
  305. } while (0)
  306. /* Reset the returned-memory pointers to their defaults. */
  307. #define RESET_RET_MEM(dbc)
  308. do {
  309. (dbc)->rskey = &(dbc)->my_rskey;
  310. (dbc)->rkey = &(dbc)->my_rkey;
  311. (dbc)->rdata = &(dbc)->my_rdata;
  312. } while (0)
  313. /*******************************************************
  314.  * Mpool.
  315.  *******************************************************/
  316. /*
  317.  * File types for DB access methods.  Negative numbers are reserved to DB.
  318.  */
  319. #define DB_FTYPE_SET -1 /* Call pgin/pgout functions. */
  320. #define DB_FTYPE_NOTSET  0 /* Don't call... */
  321. /* Structure used as the DB pgin/pgout pgcookie. */
  322. typedef struct __dbpginfo {
  323. size_t db_pagesize; /* Underlying page size. */
  324. u_int32_t flags; /* Some DB_AM flags needed. */
  325. DBTYPE  type; /* DB type */
  326. } DB_PGINFO;
  327. /*******************************************************
  328.  * Log.
  329.  *******************************************************/
  330. /* Initialize an LSN to 'zero'. */
  331. #define ZERO_LSN(LSN) do {
  332. (LSN).file = 0;
  333. (LSN).offset = 0;
  334. } while (0)
  335. #define IS_ZERO_LSN(LSN) ((LSN).file == 0)
  336. #define IS_INIT_LSN(LSN) ((LSN).file == 1 && (LSN).offset == 0)
  337. #define INIT_LSN(LSN) do {
  338. (LSN).file = 1;
  339. (LSN).offset = 0;
  340. } while (0)
  341. #define MAX_LSN(LSN) do {
  342. (LSN).file = UINT32_T_MAX;
  343. (LSN).offset = UINT32_T_MAX;
  344. } while (0)
  345. #define IS_MAX_LSN(LSN) 
  346. ((LSN).file == UINT32_T_MAX && (LSN).offset == UINT32_T_MAX)
  347. /* If logging is turned off, smash the lsn. */
  348. #define LSN_NOT_LOGGED(LSN) do {
  349. (LSN).file = 0;
  350. (LSN).offset = 1;
  351. } while (0)
  352. #define IS_NOT_LOGGED_LSN(LSN) 
  353. ((LSN).file == 0 && (LSN).offset == 1)
  354. /*
  355.  * Test if the environment is currently logging changes.  If we're in
  356.  * recovery or we're a replication client, we don't need to log changes
  357.  * because they're already in the log, even though we have a fully functional
  358.  * log system.
  359.  */
  360. #define DBENV_LOGGING(dbenv)
  361. (LOGGING_ON(dbenv) && !F_ISSET((dbenv), DB_ENV_REP_CLIENT) &&
  362.     (!IS_RECOVERING(dbenv)))
  363. /*
  364.  * Test if we need to log a change.  Note that the DBC_RECOVER flag is set
  365.  * when we're in abort, as well as during recovery;  thus DBC_LOGGING may be
  366.  * false for a particular dbc even when DBENV_LOGGING is true.
  367.  *
  368.  * We explicitly use LOGGING_ON/DB_ENV_REP_CLIENT here because we don't
  369.  * want to have to pull in the log headers, which IS_RECOVERING (and thus
  370.  * DBENV_LOGGING) rely on, and because DBC_RECOVER should be set anytime
  371.  * IS_RECOVERING would be true.
  372.  */
  373. #define DBC_LOGGING(dbc)
  374. (LOGGING_ON((dbc)->dbp->dbenv) && !F_ISSET((dbc), DBC_RECOVER) && 
  375.  !F_ISSET((dbc)->dbp->dbenv, DB_ENV_REP_CLIENT))
  376. /*******************************************************
  377.  * Txn.
  378.  *******************************************************/
  379. #define DB_NONBLOCK(C) ((C)->txn != NULL && F_ISSET((C)->txn, TXN_NOWAIT))
  380. #define IS_SUBTRANSACTION(txn)
  381. ((txn) != NULL && (txn)->parent != NULL)
  382. /*******************************************************
  383.  * Crypto.
  384.  *******************************************************/
  385. #define DB_IV_BYTES     16 /* Bytes per IV */
  386. #define DB_MAC_KEY 20 /* Bytes per MAC checksum */
  387. /*******************************************************
  388.  * Forward structure declarations.
  389.  *******************************************************/
  390. struct __db_reginfo_t; typedef struct __db_reginfo_t REGINFO;
  391. struct __db_txnhead; typedef struct __db_txnhead DB_TXNHEAD;
  392. struct __db_txnlist; typedef struct __db_txnlist DB_TXNLIST;
  393. struct __vrfy_childinfo; typedef struct __vrfy_childinfo VRFY_CHILDINFO;
  394. struct __vrfy_dbinfo;   typedef struct __vrfy_dbinfo VRFY_DBINFO;
  395. struct __vrfy_pageinfo; typedef struct __vrfy_pageinfo VRFY_PAGEINFO;
  396. #if defined(__cplusplus)
  397. }
  398. #endif
  399. /*******************************************************
  400.  * Remaining general DB includes.
  401.  *******************************************************/
  402. #include "dbinc/globals.h"
  403. #include "dbinc/debug.h"
  404. #include "dbinc/mutex.h"
  405. #include "dbinc/region.h"
  406. #include "dbinc_auto/mutex_ext.h" /* XXX: Include after region.h. */
  407. #include "dbinc_auto/env_ext.h"
  408. #include "dbinc/os.h"
  409. #include "dbinc_auto/clib_ext.h"
  410. #include "dbinc_auto/common_ext.h"
  411. #endif /* !_DB_INTERNAL_H_ */