db_verify.h

Go to the documentation of this file.
00001 /*-
00002  * See the file LICENSE for redistribution information.
00003  *
00004  * Copyright (c) 1999, 2000
00005  *      Sleepycat Software.  All rights reserved.
00006  *
00007  * $Id: db__verify_8h-source.html,v 1.1 2008/06/08 10:18:23 sebdiaz Exp $
00008  */
00009 
00010 #ifndef _DB_VERIFY_H
00011 #define _DB_VERIFY_H_
00012 
00013 /*
00014  * Structures and macros for the storage and retrieval of all information
00015  * needed for inter-page verification of a database.
00016  */
00017 
00018 /*
00019  * EPRINT is the macro for error printing.  Takes as an arg the arg set
00020  * for DB->err.
00021  */
00022 #define EPRINT(x)                                                       \
00023         do {                                                            \
00024                 if (!LF_ISSET(DB_SALVAGE))                              \
00025                         CDB___db_err x;                                 \
00026         } while (0)
00027 
00028 #define TYPE_ERR_PRINT(dbp, func, pgno, type)                           \
00029     EPRINT(((dbp), "%s called on nonsensical page %lu of type %lu",     \
00030         (func), (u_long)(pgno), (u_long)(type)));
00031 
00032 /* Is x a power of two?  (Tests true for zero, which doesn't matter here.) */
00033 #define POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0)
00034 
00035 #define IS_VALID_PAGESIZE(x)                                            \
00036         (POWER_OF_TWO(x) && (x) >= DB_MIN_PGSIZE && ((x) <= DB_MAX_PGSIZE))
00037 
00038 /*
00039  * Note that 0 is, in general, a valid pgno, despite equalling PGNO_INVALID;
00040  * we have to test it separately where it's not appropriate.
00041  */
00042 #define IS_VALID_PGNO(x)        ((x) <= vdp->last_pgno)
00043 
00044 /*
00045  * Flags understood by the btree structure checks (esp. CDB___bam_vrfy_subtree).
00046  * These share the same space as the global flags to CDB___db_verify, and must not
00047  * dip below 0x00010000.
00048  */
00049 #define ST_DUPOK        0x00010000
00050 #define ST_DUPSORT      0x00020000
00051 #define ST_IS_RECNO     0x00040000
00052 #define ST_OVFL_LEAF    0x00080000      /* Overflow reffed from leaf page. */
00053 #define ST_RECNUM       0x00100000
00054 #define ST_RELEN        0x00200000
00055 #define ST_TOPLEVEL     0x00400000      /* subtree == entire tree */
00056 
00057 /*
00058  * Flags understood by CDB___bam_salvage and CDB___db_salvage.  These need not share
00059  * the same space with the CDB___bam_vrfy_subtree flags, but must share with
00060  * CDB___db_verify.
00061  */
00062 #define SA_HASDUPS      0x00010000
00063 #define SA_MARKDATAPGS  0x00020000
00064 #define SA_PRINTHEADER  0x00040000
00065 #define SA_SKIPFIRSTKEY 0x00080000
00066 
00067 /*
00068  * VRFY_DBINFO is the fundamental structure;  it either represents the database
00069  * of subdatabases, or the sole database if there are no subdatabases.
00070  */
00071 struct __vrfy_dbinfo {
00072         /* Info about this database in particular. */
00073         DBTYPE          type;
00074 
00075         /* List of subdatabase meta pages, if any. */
00076         LIST_HEAD(__subdbs, __vrfy_childinfo) subdbs;
00077 
00078         /* File-global info--stores VRFY_PAGEINFOs for each page. */
00079         DB *pgdbp;
00080 
00081         /* Child database--stores VRFY_CHILDINFOs of each page. */
00082         DB *cdbp;
00083 
00084         /* Page info structures currently in use. */
00085         LIST_HEAD(__activepips, __vrfy_pageinfo) activepips;
00086 
00087         /*
00088          * DB we use to keep track of which pages are linked somehow
00089          * during verification.  0 is the default, "unseen";  1 is seen.
00090          */
00091         DB *pgset;
00092 
00093         /*
00094          * This is a database we use during salvaging to keep track of which
00095          * overflow and dup pages we need to come back to at the end and print
00096          * with key "UNKNOWN".  Pages which print with a good key get set
00097          * to SALVAGE_IGNORE;  others get set, as appropriate, to SALVAGE_LDUP,
00098          * SALVAGE_LRECNODUP, SALVAGE_OVERFLOW for normal db overflow pages,
00099          * and SALVAGE_BTREE, SALVAGE_LRECNO, and SALVAGE_HASH for subdb
00100          * pages.
00101          */
00102 #define SALVAGE_INVALID         0
00103 #define SALVAGE_IGNORE          1
00104 #define SALVAGE_LDUP            2
00105 #define SALVAGE_LRECNODUP       3
00106 #define SALVAGE_OVERFLOW        4
00107 #define SALVAGE_LBTREE          5
00108 #define SALVAGE_HASH            6
00109 #define SALVAGE_LRECNO          7
00110         DB *salvage_pages;
00111 
00112         db_pgno_t       last_pgno;
00113 
00114         /* Queue needs these to verify data pages in the first pass. */
00115         u_int32_t       re_len;
00116         u_int32_t       rec_page;
00117 
00118 #define SALVAGE_PRINTHEADER     0x01
00119 #define SALVAGE_PRINTFOOTER     0x02
00120         u_int32_t       flags;
00121 }; /* VRFY_DBINFO */
00122 
00123 /*
00124  * The amount of state information we need per-page is small enough that
00125  * it's not worth the trouble to define separate structures for each
00126  * possible type of page, and since we're doing verification with these we
00127  * have to be open to the possibility that page N will be of a completely
00128  * unexpected type anyway.  So we define one structure here with all the
00129  * info we need for inter-page verification.
00130  */
00131 struct __vrfy_pageinfo {
00132         u_int8_t        type;
00133         u_int8_t        bt_level;
00134         u_int8_t        unused1;
00135         u_int8_t        unused2;
00136         db_pgno_t       pgno;
00137         db_pgno_t       prev_pgno;
00138         db_pgno_t       next_pgno;
00139 
00140         /* meta pages */
00141         db_pgno_t       root;
00142         db_pgno_t       free;           /* Free list head. */
00143 
00144         db_indx_t       entries;        /* Actual number of entries. */
00145         u_int16_t       unused;
00146         db_recno_t      rec_cnt;        /* Record count. */
00147         u_int32_t       re_len;         /* Record length. */
00148         u_int32_t       bt_minkey;
00149         u_int32_t       bt_maxkey;
00150         u_int32_t       h_ffactor;
00151         u_int32_t       h_nelem;
00152 
00153         /* overflow pages */
00154         /*
00155          * Note that refcount is the refcount for an overflow page; pi_refcount
00156          * is this structure's own refcount!
00157          */
00158         u_int32_t       refcount;
00159         u_int32_t       olen;
00160 
00161 #define VRFY_DUPS_UNSORTED      0x0001  /* Have to flag the negative! */
00162 #define VRFY_HAS_DUPS           0x0002
00163 #define VRFY_HAS_DUPSORT        0x0004  /* Has the flag set. */
00164 #define VRFY_HAS_SUBDBS         0x0008
00165 #define VRFY_HAS_RECNUMS        0x0010
00166 #define VRFY_INCOMPLETE         0x0020  /* Meta or item order checks incomp. */
00167 #define VRFY_IS_ALLZEROES       0x0040  /* Hash page we haven't touched? */
00168 #define VRFY_IS_FIXEDLEN        0x0080
00169 #define VRFY_IS_RECNO           0x0100
00170 #define VRFY_IS_RRECNO          0x0200
00171 #define VRFY_OVFL_LEAFSEEN      0x0400
00172         u_int32_t       flags;
00173 
00174         LIST_ENTRY(__vrfy_pageinfo) links;
00175         u_int32_t       pi_refcount;
00176 }; /* VRFY_PAGEINFO */
00177 
00178 struct __vrfy_childinfo {
00179         db_pgno_t       pgno;
00180 
00181 #define V_DUPLICATE     1               /* off-page dup metadata */
00182 #define V_OVERFLOW      2               /* overflow page */
00183 #define V_RECNO         3               /* btree internal or leaf page */
00184         u_int32_t       type;
00185         db_recno_t      nrecs;          /* record count on a btree subtree */
00186         u_int32_t       tlen;           /* ovfl. item total size */
00187 
00188         LIST_ENTRY(__vrfy_childinfo) links;
00189 }; /* VRFY_CHILDINFO */
00190 
00191 #endif /* _DB_VERIFY_H_ */

Generated on Sun Jun 8 10:56:37 2008 for GNUmifluz by  doxygen 1.5.5