📄 db_pr.c
字号:
DB_MSGBUF_FLUSH(dbenv, &mb); switch (TYPE(h)) { case P_BTREEMETA: return (__db_bmeta(dbp, (BTMETA *)h, flags)); case P_HASHMETA: return (__db_hmeta(dbp, (HMETA *)h, flags)); case P_QAMMETA: return (__db_qmeta(dbp, (QMETA *)h, flags)); case P_QAMDATA: /* Should be meta->start. */ if (!LF_ISSET(DB_PR_PAGE)) return (0); qlen = ((QUEUE *)dbp->q_internal)->re_len; recno = (h->pgno - 1) * QAM_RECNO_PER_PAGE(dbp) + 1; i = 0; qep = (QAMDATA *)((u_int8_t *)h + pagesize - qlen); for (qp = QAM_GET_RECORD(dbp, h, i); qp < qep; recno++, i++, qp = QAM_GET_RECORD(dbp, h, i)) { if (!F_ISSET(qp, QAM_SET)) continue; __db_msgadd(dbenv, &mb, "%s", F_ISSET(qp, QAM_VALID) ? "\t" : " D"); __db_msgadd(dbenv, &mb, "[%03lu] %4lu ", (u_long)recno, (u_long)((u_int8_t *)qp - (u_int8_t *)h)); __db_pr(dbenv, &mb, qp->data, qlen); } return (0); default: break; } /* LSN. */ if (LF_ISSET(DB_PR_RECOVERYTEST)) __db_msg(dbenv, " (lsn.file: %lu lsn.offset: %lu)", (u_long)LSN(h).file, (u_long)LSN(h).offset); s = "\t"; if (TYPE(h) != P_IBTREE && TYPE(h) != P_IRECNO) { __db_msgadd(dbenv, &mb, "%sprev: %4lu next: %4lu", s, (u_long)PREV_PGNO(h), (u_long)NEXT_PGNO(h)); s = " "; } if (TYPE(h) == P_OVERFLOW) { __db_msgadd(dbenv, &mb, "%sref cnt: %4lu ", s, (u_long)OV_REF(h)); __db_pr(dbenv, &mb, (u_int8_t *)h + P_OVERHEAD(dbp), OV_LEN(h)); return (0); } __db_msgadd(dbenv, &mb, "%sentries: %4lu", s, (u_long)NUM_ENT(h)); __db_msgadd(dbenv, &mb, " offset: %4lu", (u_long)HOFFSET(h)); DB_MSGBUF_FLUSH(dbenv, &mb); if (TYPE(h) == P_INVALID || !LF_ISSET(DB_PR_PAGE)) return (0); ret = 0; inp = P_INP(dbp, h); for (i = 0; i < NUM_ENT(h); i++) { if ((uintptr_t)(P_ENTRY(dbp, h, i) - (u_int8_t *)h) < (uintptr_t)(P_OVERHEAD(dbp)) || (size_t)(P_ENTRY(dbp, h, i) - (u_int8_t *)h) >= pagesize) { __db_msg(dbenv, "ILLEGAL PAGE OFFSET: indx: %lu of %lu", (u_long)i, (u_long)inp[i]); ret = EINVAL; continue; } deleted = 0; switch (TYPE(h)) { case P_HASH: case P_IBTREE: case P_IRECNO: sp = P_ENTRY(dbp, h, i); break; case P_LBTREE: sp = P_ENTRY(dbp, h, i); deleted = i % 2 == 0 && B_DISSET(GET_BKEYDATA(dbp, h, i + O_INDX)->type); break; case P_LDUP: case P_LRECNO: sp = P_ENTRY(dbp, h, i); deleted = B_DISSET(GET_BKEYDATA(dbp, h, i)->type); break; default: goto type_err; } __db_msgadd(dbenv, &mb, "%s", deleted ? " D" : "\t"); __db_msgadd( dbenv, &mb, "[%03lu] %4lu ", (u_long)i, (u_long)inp[i]); switch (TYPE(h)) { case P_HASH: hk = sp; switch (HPAGE_PTYPE(hk)) { case H_OFFDUP: memcpy(&pgno, HOFFDUP_PGNO(hk), sizeof(db_pgno_t)); __db_msgadd(dbenv, &mb, "%4lu [offpage dups]", (u_long)pgno); DB_MSGBUF_FLUSH(dbenv, &mb); break; case H_DUPLICATE: /* * If this is the first item on a page, then * we cannot figure out how long it is, so * we only print the first one in the duplicate * set. */ if (i != 0) len = LEN_HKEYDATA(dbp, h, 0, i); else len = 1; __db_msgadd(dbenv, &mb, "Duplicates:"); DB_MSGBUF_FLUSH(dbenv, &mb); for (p = HKEYDATA_DATA(hk), ep = p + len; p < ep;) { memcpy(&dlen, p, sizeof(db_indx_t)); p += sizeof(db_indx_t); __db_msgadd(dbenv, &mb, "\t\t"); __db_pr(dbenv, &mb, p, dlen); p += sizeof(db_indx_t) + dlen; } break; case H_KEYDATA: __db_pr(dbenv, &mb, HKEYDATA_DATA(hk), LEN_HKEYDATA(dbp, h, i == 0 ? pagesize : 0, i)); break; case H_OFFPAGE: memcpy(&a_hkd, hk, HOFFPAGE_SIZE); __db_msgadd(dbenv, &mb, "overflow: total len: %4lu page: %4lu", (u_long)a_hkd.tlen, (u_long)a_hkd.pgno); DB_MSGBUF_FLUSH(dbenv, &mb); break; default: DB_MSGBUF_FLUSH(dbenv, &mb); __db_msg(dbenv, "ILLEGAL HASH PAGE TYPE: %lu", (u_long)HPAGE_PTYPE(hk)); ret = EINVAL; break; } break; case P_IBTREE: bi = sp; __db_msgadd(dbenv, &mb, "count: %4lu pgno: %4lu type: %4lu", (u_long)bi->nrecs, (u_long)bi->pgno, (u_long)bi->type); switch (B_TYPE(bi->type)) { case B_KEYDATA: __db_pr(dbenv, &mb, bi->data, bi->len); break; case B_DUPLICATE: case B_OVERFLOW: __db_proff(dbenv, &mb, bi->data); break; default: DB_MSGBUF_FLUSH(dbenv, &mb); __db_msg(dbenv, "ILLEGAL BINTERNAL TYPE: %lu", (u_long)B_TYPE(bi->type)); ret = EINVAL; break; } break; case P_IRECNO: ri = sp; __db_msgadd(dbenv, &mb, "entries %4lu pgno %4lu", (u_long)ri->nrecs, (u_long)ri->pgno); DB_MSGBUF_FLUSH(dbenv, &mb); break; case P_LBTREE: case P_LDUP: case P_LRECNO: bk = sp; switch (B_TYPE(bk->type)) { case B_KEYDATA: __db_pr(dbenv, &mb, bk->data, bk->len); break; case B_DUPLICATE: case B_OVERFLOW: __db_proff(dbenv, &mb, bk); break; default: DB_MSGBUF_FLUSH(dbenv, &mb); __db_msg(dbenv, "ILLEGAL DUPLICATE/LBTREE/LRECNO TYPE: %lu", (u_long)B_TYPE(bk->type)); ret = EINVAL; break; } break; default:type_err: DB_MSGBUF_FLUSH(dbenv, &mb); __db_msg(dbenv, "ILLEGAL PAGE TYPE: %lu", (u_long)TYPE(h)); ret = EINVAL; continue; } } return (ret);}/* * __db_pr -- * Print out a data element. * * PUBLIC: void __db_pr __P((DB_ENV *, DB_MSGBUF *, u_int8_t *, u_int32_t)); */void__db_pr(dbenv, mbp, p, len) DB_ENV *dbenv; DB_MSGBUF *mbp; u_int8_t *p; u_int32_t len;{ u_int32_t i; __db_msgadd(dbenv, mbp, "len: %3lu", (u_long)len); if (len != 0) { __db_msgadd(dbenv, mbp, " data: "); for (i = len <= 20 ? len : 20; i > 0; --i, ++p) { if (isprint((int)*p) || *p == '\n') __db_msgadd(dbenv, mbp, "%c", *p); else __db_msgadd(dbenv, mbp, "%#.2x", (u_int)*p); } if (len > 20) __db_msgadd(dbenv, mbp, "..."); } DB_MSGBUF_FLUSH(dbenv, mbp);}/* * __db_proff -- * Print out an off-page element. */static void__db_proff(dbenv, mbp, vp) DB_ENV *dbenv; DB_MSGBUF *mbp; void *vp;{ BOVERFLOW *bo; bo = vp; switch (B_TYPE(bo->type)) { case B_OVERFLOW: __db_msgadd(dbenv, mbp, "overflow: total len: %4lu page: %4lu", (u_long)bo->tlen, (u_long)bo->pgno); break; case B_DUPLICATE: __db_msgadd( dbenv, mbp, "duplicate: page: %4lu", (u_long)bo->pgno); break; default: /* NOTREACHED */ break; } DB_MSGBUF_FLUSH(dbenv, mbp);}/* * __db_prflags -- * Print out flags values. * * PUBLIC: void __db_prflags __P((DB_ENV *, DB_MSGBUF *, * PUBLIC: u_int32_t, const FN *, const char *, const char *)); */void__db_prflags(dbenv, mbp, flags, fn, prefix, suffix) DB_ENV *dbenv; DB_MSGBUF *mbp; u_int32_t flags; FN const *fn; const char *prefix, *suffix;{ DB_MSGBUF mb; const FN *fnp; int found, standalone; const char *sep; /* * If it's a standalone message, output the suffix (which will be the * label), regardless of whether we found anything or not, and flush * the line. */ if (mbp == NULL) { standalone = 1; mbp = &mb; DB_MSGBUF_INIT(mbp); } else standalone = 0; sep = prefix == NULL ? "" : prefix; for (found = 0, fnp = fn; fnp->mask != 0; ++fnp) if (LF_ISSET(fnp->mask)) { __db_msgadd(dbenv, mbp, "%s%s", sep, fnp->name); sep = ", "; found = 1; } if ((standalone || found) && suffix != NULL) __db_msgadd(dbenv, mbp, "%s", suffix); if (standalone) DB_MSGBUF_FLUSH(dbenv, mbp);}/* * __db_lockmode_to_string -- * Return the name of the lock mode. * * PUBLIC: const char * __db_lockmode_to_string __P((db_lockmode_t)); */const char *__db_lockmode_to_string(mode) db_lockmode_t mode;{ switch (mode) { case DB_LOCK_NG: return ("Not granted"); case DB_LOCK_READ: return ("Shared/read"); case DB_LOCK_WRITE: return ("Exclusive/write"); case DB_LOCK_WAIT: return ("Wait for event"); case DB_LOCK_IWRITE: return ("Intent exclusive/write"); case DB_LOCK_IREAD: return ("Intent shared/read"); case DB_LOCK_IWR: return ("Intent to read/write"); case DB_LOCK_DIRTY: return ("Dirty read"); case DB_LOCK_WWRITE: return ("Was written"); default: break; } return ("UNKNOWN LOCK MODE");}/* * __db_pagetype_to_string -- * Return the name of the specified page type. */static const char *__db_pagetype_to_string(type) u_int32_t type;{ char *s; s = NULL; switch (type) { case P_BTREEMETA: s = "btree metadata"; break; case P_LDUP: s = "duplicate"; break; case P_HASH: s = "hash"; break; case P_HASHMETA: s = "hash metadata"; break; case P_IBTREE: s = "btree internal"; break; case P_INVALID: s = "invalid"; break; case P_IRECNO: s = "recno internal"; break; case P_LBTREE: s = "btree leaf"; break; case P_LRECNO: s = "recno leaf"; break; case P_OVERFLOW: s = "overflow"; break; case P_QAMMETA: s = "queue metadata"; break; case P_QAMDATA: s = "queue"; break; default: /* Just return a NULL. */ break; } return (s);}#else /* !HAVE_STATISTICS *//* * __db_dumptree -- * Dump the tree to a file. * * PUBLIC: int __db_dumptree __P((DB *, char *, char *)); */int__db_dumptree(dbp, op, name) DB *dbp; char *op, *name;{ COMPQUIET(op, NULL); COMPQUIET(name, NULL); return (__db_stat_not_built(dbp->dbenv));}/* * __db_get_flags_fn -- * Return the __db_flags_fn array. * * PUBLIC: const FN * __db_get_flags_fn __P((void)); */const FN *__db_get_flags_fn(){ static const FN __db_flags_fn[] = { { 0, NULL } }; /* * !!! * The Tcl API uses this interface, stub it off. */ return (__db_flags_fn);}#endif/* * __db_dump_pp -- * DB->dump pre/post processing. * * PUBLIC: int __db_dump_pp __P((DB *, const char *, * PUBLIC: int (*)(void *, const void *), void *, int, int)); */int__db_dump_pp(dbp, subname, callback, handle, pflag, keyflag) DB *dbp; const char *subname; int (*callback) __P((void *, const void *)); void *handle; int pflag, keyflag;{ DB_ENV *dbenv; int handle_check, ret; dbenv = dbp->dbenv; PANIC_CHECK(dbenv); DB_ILLEGAL_BEFORE_OPEN(dbp, "DB->dump"); /* Check for replication block. */ handle_check = IS_REPLICATED(dbenv, dbp); if (handle_check && (ret = __db_rep_enter(dbp, 1, 0, 1)) != 0) return (ret); ret = __db_dump(dbp, subname, callback, handle, pflag, keyflag); /* Release replication block. */ if (handle_check) __env_db_rep_exit(dbenv); return (0);}/* * __db_dump -- * DB->dump. * * PUBLIC: int __db_dump __P((DB *, const char *, * PUBLIC: int (*)(void *, const void *), void *, int, int)); */int__db_dump(dbp, subname, callback, handle, pflag, keyflag) DB *dbp; const char *subname; int (*callback) __P((void *, const void *)); void *handle; int pflag, keyflag;{ DB_ENV *dbenv; DBC *dbcp; DBT key, data; DBT keyret, dataret; db_recno_t recno; int is_recno, ret, t_ret; void *pointer; dbenv = dbp->dbenv; if ((ret = __db_prheader( dbp, subname, pflag, keyflag, handle, callback, NULL, 0)) != 0) return (ret); /* * Get a cursor and step through the database, printing out each * key/data pair. */ if ((ret = __db_cursor(dbp, NULL, &dbcp, 0)) != 0) return (ret); memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); if ((ret = __os_malloc(dbenv, 1024 * 1024, &data.data)) != 0) goto err; data.ulen = 1024 * 1024; data.flags = DB_DBT_USERMEM; is_recno = (dbp->type == DB_RECNO || dbp->type == DB_QUEUE); keyflag = is_recno ? keyflag : 1; if (is_recno) { keyret.data = &recno; keyret.size = sizeof(recno); }retry: while ((ret = __db_c_get(dbcp, &key, &data, DB_NEXT | DB_MULTIPLE_KEY)) == 0) { DB_MULTIPLE_INIT(pointer, &data); for (;;) { if (is_recno) DB_MULTIPLE_RECNO_NEXT(pointer, &data,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -