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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: db_verify.h,v 1.26 2002/08/06 06:37:08 bostic Exp $
  8.  */
  9. #ifndef _DB_VERIFY_H_
  10. #define _DB_VERIFY_H_
  11. /*
  12.  * Structures and macros for the storage and retrieval of all information
  13.  * needed for inter-page verification of a database.
  14.  */
  15. /*
  16.  * EPRINT is the macro for error printing.  Takes as an arg the arg set
  17.  * for DB->err.
  18.  */
  19. #define EPRINT(x)
  20. do {
  21. if (!LF_ISSET(DB_SALVAGE))
  22. __db_err x;
  23. } while (0)
  24. /* For fatal type errors--i.e., verifier bugs. */
  25. #define TYPE_ERR_PRINT(dbenv, func, pgno, ptype)
  26.     EPRINT(((dbenv), "Page %lu: %s called on nonsensical page of type %lu", 
  27. (u_long)(pgno), (func), (u_long)(ptype)));
  28. /* Complain about a totally zeroed page where we don't expect one. */
  29. #define ZEROPG_ERR_PRINT(dbenv, pgno, str)    
  30.     do {    
  31.     EPRINT(((dbenv), "Page %lu: %s is of inappropriate type %lu",  
  32. (u_long)(pgno), str, (u_long)P_INVALID));    
  33.     EPRINT(((dbenv), "Page %lu: totally zeroed page",    
  34. (u_long)(pgno)));    
  35.     } while (0)
  36. /*
  37.  * Note that 0 is, in general, a valid pgno, despite equalling PGNO_INVALID;
  38.  * we have to test it separately where it's not appropriate.
  39.  */
  40. #define IS_VALID_PGNO(x) ((x) <= vdp->last_pgno)
  41. /*
  42.  * Flags understood by the btree structure checks (esp. __bam_vrfy_subtree).
  43.  * These share the same space as the global flags to __db_verify, and must not
  44.  * dip below 0x00010000.
  45.  */
  46. #define ST_DUPOK 0x00010000 /* Duplicates are acceptable. */
  47. #define ST_DUPSET 0x00020000 /* Subtree is in a duplicate tree. */
  48. #define ST_DUPSORT 0x00040000 /* Duplicates are sorted. */
  49. #define ST_IS_RECNO 0x00080000 /* Subtree is a recno. */
  50. #define ST_OVFL_LEAF 0x00100000 /* Overflow reffed from leaf page. */
  51. #define ST_RECNUM 0x00200000 /* Subtree has record numbering on. */
  52. #define ST_RELEN 0x00400000 /* Subtree has fixed-length records. */
  53. #define ST_TOPLEVEL 0x00800000 /* Subtree == entire tree */
  54. /*
  55.  * Flags understood by __bam_salvage and __db_salvage.  These need not share
  56.  * the same space with the __bam_vrfy_subtree flags, but must share with
  57.  * __db_verify.
  58.  */
  59. #define SA_SKIPFIRSTKEY 0x00080000
  60. /*
  61.  * VRFY_DBINFO is the fundamental structure;  it either represents the database
  62.  * of subdatabases, or the sole database if there are no subdatabases.
  63.  */
  64. struct __vrfy_dbinfo {
  65. /* Info about this database in particular. */
  66. DBTYPE type;
  67. /* List of subdatabase meta pages, if any. */
  68. LIST_HEAD(__subdbs, __vrfy_childinfo) subdbs;
  69. /* File-global info--stores VRFY_PAGEINFOs for each page. */
  70. DB *pgdbp;
  71. /* Child database--stores VRFY_CHILDINFOs of each page. */
  72. DB *cdbp;
  73. /* Page info structures currently in use. */
  74. LIST_HEAD(__activepips, __vrfy_pageinfo) activepips;
  75. /*
  76.  * DB we use to keep track of which pages are linked somehow
  77.  * during verification.  0 is the default, "unseen";  1 is seen.
  78.  */
  79. DB *pgset;
  80. /*
  81.  * This is a database we use during salvaging to keep track of which
  82.  * overflow and dup pages we need to come back to at the end and print
  83.  * with key "UNKNOWN".  Pages which print with a good key get set
  84.  * to SALVAGE_IGNORE;  others get set, as appropriate, to SALVAGE_LDUP,
  85.  * SALVAGE_LRECNODUP, SALVAGE_OVERFLOW for normal db overflow pages,
  86.  * and SALVAGE_BTREE, SALVAGE_LRECNO, and SALVAGE_HASH for subdb
  87.  * pages.
  88.  */
  89. #define SALVAGE_INVALID 0
  90. #define SALVAGE_IGNORE 1
  91. #define SALVAGE_LDUP 2
  92. #define SALVAGE_LRECNODUP 3
  93. #define SALVAGE_OVERFLOW 4
  94. #define SALVAGE_LBTREE 5
  95. #define SALVAGE_HASH 6
  96. #define SALVAGE_LRECNO 7
  97. DB *salvage_pages;
  98. db_pgno_t last_pgno;
  99. db_pgno_t pgs_remaining; /* For dbp->db_feedback(). */
  100. /*
  101.  * These are used during __bam_vrfy_subtree to keep track, while
  102.  * walking up and down the Btree structure, of the prev- and next-page
  103.  * chain of leaf pages and verify that it's intact.  Also, make sure
  104.  * that this chain contains pages of only one type.
  105.  */
  106. db_pgno_t prev_pgno;
  107. db_pgno_t next_pgno;
  108. u_int8_t leaf_type;
  109. /* Queue needs these to verify data pages in the first pass. */
  110. u_int32_t re_len;
  111. u_int32_t rec_page;
  112. #define SALVAGE_PRINTABLE 0x01 /* Output printable chars literally. */
  113. #define SALVAGE_PRINTHEADER 0x02 /* Print the unknown-key header. */
  114. #define SALVAGE_PRINTFOOTER 0x04 /* Print the unknown-key footer. */
  115. u_int32_t flags;
  116. }; /* VRFY_DBINFO */
  117. /*
  118.  * The amount of state information we need per-page is small enough that
  119.  * it's not worth the trouble to define separate structures for each
  120.  * possible type of page, and since we're doing verification with these we
  121.  * have to be open to the possibility that page N will be of a completely
  122.  * unexpected type anyway.  So we define one structure here with all the
  123.  * info we need for inter-page verification.
  124.  */
  125. struct __vrfy_pageinfo {
  126. u_int8_t type;
  127. u_int8_t bt_level;
  128. u_int8_t unused1;
  129. u_int8_t unused2;
  130. db_pgno_t pgno;
  131. db_pgno_t prev_pgno;
  132. db_pgno_t next_pgno;
  133. /* meta pages */
  134. db_pgno_t root;
  135. db_pgno_t free; /* Free list head. */
  136. db_indx_t entries; /* Actual number of entries. */
  137. u_int16_t unused;
  138. db_recno_t rec_cnt; /* Record count. */
  139. u_int32_t re_len; /* Record length. */
  140. u_int32_t bt_minkey;
  141. u_int32_t bt_maxkey;
  142. u_int32_t h_ffactor;
  143. u_int32_t h_nelem;
  144. /* overflow pages */
  145. /*
  146.  * Note that refcount is the refcount for an overflow page; pi_refcount
  147.  * is this structure's own refcount!
  148.  */
  149. u_int32_t refcount;
  150. u_int32_t olen;
  151. #define VRFY_DUPS_UNSORTED 0x0001 /* Have to flag the negative! */
  152. #define VRFY_HAS_DUPS 0x0002
  153. #define VRFY_HAS_DUPSORT 0x0004 /* Has the flag set. */
  154. #define VRFY_HAS_SUBDBS 0x0008
  155. #define VRFY_HAS_RECNUMS 0x0010
  156. #define VRFY_INCOMPLETE 0x0020 /* Meta or item order checks incomp. */
  157. #define VRFY_IS_ALLZEROES 0x0040 /* Hash page we haven't touched? */
  158. #define VRFY_IS_FIXEDLEN 0x0080
  159. #define VRFY_IS_RECNO 0x0100
  160. #define VRFY_IS_RRECNO 0x0200
  161. #define VRFY_OVFL_LEAFSEEN 0x0400
  162. u_int32_t flags;
  163. LIST_ENTRY(__vrfy_pageinfo) links;
  164. u_int32_t pi_refcount;
  165. }; /* VRFY_PAGEINFO */
  166. struct __vrfy_childinfo {
  167. db_pgno_t pgno;
  168. #define V_DUPLICATE 1 /* off-page dup metadata */
  169. #define V_OVERFLOW 2 /* overflow page */
  170. #define V_RECNO 3 /* btree internal or leaf page */
  171. u_int32_t type;
  172. db_recno_t nrecs; /* record count on a btree subtree */
  173. u_int32_t tlen; /* ovfl. item total size */
  174. LIST_ENTRY(__vrfy_childinfo) links;
  175. }; /* VRFY_CHILDINFO */
  176. #endif /* !_DB_VERIFY_H_ */