📄 bt_stat.c
字号:
top = NUM_ENT(h); inp = P_INP(dbp, h); switch (TYPE(h)) { case P_IBTREE: case P_IRECNO: ++sp->bt_int_pg; sp->bt_int_pgfree += P_FREESPACE(dbp, h); break; case P_LBTREE: if (top == 0) ++sp->bt_empty_pg; /* Correct for on-page duplicates and deleted items. */ for (indx = 0; indx < top; indx += P_INDX) { type = GET_BKEYDATA(dbp, h, indx + O_INDX)->type; /* Ignore deleted items. */ if (B_DISSET(type)) continue; /* Ignore duplicate keys. */ if (indx + P_INDX >= top || inp[indx] != inp[indx + P_INDX]) ++sp->bt_nkeys; /* Ignore off-page duplicates. */ if (B_TYPE(type) != B_DUPLICATE) ++sp->bt_ndata; } ++sp->bt_leaf_pg; sp->bt_leaf_pgfree += P_FREESPACE(dbp, h); break; case P_LRECNO: if (top == 0) ++sp->bt_empty_pg; /* * If walking a recno tree, then each of these items is a key. * Otherwise, we're walking an off-page duplicate set. */ if (dbp->type == DB_RECNO) { /* * Correct for deleted items in non-renumbering Recno * databases. */ if (F_ISSET(dbp, DB_AM_RENUMBER)) { sp->bt_nkeys += top; sp->bt_ndata += top; } else for (indx = 0; indx < top; indx += O_INDX) { type = GET_BKEYDATA(dbp, h, indx)->type; if (!B_DISSET(type)) { ++sp->bt_ndata; ++sp->bt_nkeys; } } ++sp->bt_leaf_pg; sp->bt_leaf_pgfree += P_FREESPACE(dbp, h); } else { sp->bt_ndata += top; ++sp->bt_dup_pg; sp->bt_dup_pgfree += P_FREESPACE(dbp, h); } break; case P_LDUP: if (top == 0) ++sp->bt_empty_pg; /* Correct for deleted items. */ for (indx = 0; indx < top; indx += O_INDX) if (!B_DISSET(GET_BKEYDATA(dbp, h, indx)->type)) ++sp->bt_ndata; ++sp->bt_dup_pg; sp->bt_dup_pgfree += P_FREESPACE(dbp, h); break; case P_OVERFLOW: ++sp->bt_over_pg; sp->bt_over_pgfree += P_OVFLSPACE(dbp, dbp->pgsize, h); break; default: return (__db_pgfmt(dbp->dbenv, h->pgno)); } return (0);}/* * __bam_print_cursor -- * Display the current internal cursor. * * PUBLIC: void __bam_print_cursor __P((DBC *)); */void__bam_print_cursor(dbc) DBC *dbc;{ static const FN fn[] = { { C_DELETED, "C_DELETED" }, { C_RECNUM, "C_RECNUM" }, { C_RENUMBER, "C_RENUMBER" }, { 0, NULL } }; DB_ENV *dbenv; BTREE_CURSOR *cp; dbenv = dbc->dbp->dbenv; cp = (BTREE_CURSOR *)dbc->internal; STAT_ULONG("Overflow size", cp->ovflsize); if (dbc->dbtype == DB_RECNO) STAT_ULONG("Recno", cp->recno); STAT_ULONG("Order", cp->order); __db_prflags(dbenv, NULL, cp->flags, fn, NULL, "\tInternal Flags");}#else /* !HAVE_STATISTICS */int__bam_stat(dbc, spp, flags) DBC *dbc; void *spp; u_int32_t flags;{ COMPQUIET(spp, NULL); COMPQUIET(flags, 0); return (__db_stat_not_built(dbc->dbp->dbenv));}int__bam_stat_print(dbc, flags) DBC *dbc; u_int32_t flags;{ COMPQUIET(flags, 0); return (__db_stat_not_built(dbc->dbp->dbenv));}#endif/* * __bam_key_range -- * Return proportion of keys relative to given key. The numbers are * slightly skewed due to on page duplicates. * * PUBLIC: int __bam_key_range __P((DBC *, DBT *, DB_KEY_RANGE *, u_int32_t)); */int__bam_key_range(dbc, dbt, kp, flags) DBC *dbc; DBT *dbt; DB_KEY_RANGE *kp; u_int32_t flags;{ BTREE_CURSOR *cp; EPG *sp; double factor; int exact, ret; COMPQUIET(flags, 0); if ((ret = __bam_search(dbc, PGNO_INVALID, dbt, S_STK_ONLY, 1, NULL, &exact)) != 0) return (ret); cp = (BTREE_CURSOR *)dbc->internal; kp->less = kp->greater = 0.0; factor = 1.0; /* Correct the leaf page. */ cp->csp->entries /= 2; cp->csp->indx /= 2; for (sp = cp->sp; sp <= cp->csp; ++sp) { /* * At each level we know that pages greater than indx contain * keys greater than what we are looking for and those less * than indx are less than. The one pointed to by indx may * have some less, some greater or even equal. If indx is * equal to the number of entries, then the key is out of range * and everything is less. */ if (sp->indx == 0) kp->greater += factor * (sp->entries - 1)/sp->entries; else if (sp->indx == sp->entries) kp->less += factor; else { kp->less += factor * sp->indx / sp->entries; kp->greater += factor * ((sp->entries - sp->indx) - 1) / sp->entries; } factor *= 1.0/sp->entries; } /* * If there was an exact match then assign 1 n'th to the key itself. * Otherwise that factor belongs to those greater than the key, unless * the key was out of range. */ if (exact) kp->equal = factor; else { if (kp->less != 1) kp->greater += factor; kp->equal = 0; } BT_STK_CLR(cp); return (0);}/* * __bam_traverse -- * Walk a Btree database. * * PUBLIC: int __bam_traverse __P((DBC *, db_lockmode_t, * PUBLIC: db_pgno_t, int (*)(DB *, PAGE *, void *, int *), void *)); */int__bam_traverse(dbc, mode, root_pgno, callback, cookie) DBC *dbc; db_lockmode_t mode; db_pgno_t root_pgno; int (*callback)__P((DB *, PAGE *, void *, int *)); void *cookie;{ BINTERNAL *bi; BKEYDATA *bk; DB *dbp; DB_LOCK lock; DB_MPOOLFILE *mpf; PAGE *h; RINTERNAL *ri; db_indx_t indx, *inp; int already_put, ret, t_ret; dbp = dbc->dbp; mpf = dbp->mpf; already_put = 0; if ((ret = __db_lget(dbc, 0, root_pgno, mode, 0, &lock)) != 0) return (ret); if ((ret = __memp_fget(mpf, &root_pgno, 0, &h)) != 0) { (void)__TLPUT(dbc, lock); return (ret); } switch (TYPE(h)) { case P_IBTREE: for (indx = 0; indx < NUM_ENT(h); indx += O_INDX) { bi = GET_BINTERNAL(dbp, h, indx); if (B_TYPE(bi->type) == B_OVERFLOW && (ret = __db_traverse_big(dbp, ((BOVERFLOW *)bi->data)->pgno, callback, cookie)) != 0) goto err; if ((ret = __bam_traverse( dbc, mode, bi->pgno, callback, cookie)) != 0) goto err; } break; case P_IRECNO: for (indx = 0; indx < NUM_ENT(h); indx += O_INDX) { ri = GET_RINTERNAL(dbp, h, indx); if ((ret = __bam_traverse( dbc, mode, ri->pgno, callback, cookie)) != 0) goto err; } break; case P_LBTREE: inp = P_INP(dbp, h); for (indx = 0; indx < NUM_ENT(h); indx += P_INDX) { bk = GET_BKEYDATA(dbp, h, indx); if (B_TYPE(bk->type) == B_OVERFLOW && (indx + P_INDX >= NUM_ENT(h) || inp[indx] != inp[indx + P_INDX])) { if ((ret = __db_traverse_big(dbp, GET_BOVERFLOW(dbp, h, indx)->pgno, callback, cookie)) != 0) goto err; } bk = GET_BKEYDATA(dbp, h, indx + O_INDX); if (B_TYPE(bk->type) == B_DUPLICATE && (ret = __bam_traverse(dbc, mode, GET_BOVERFLOW(dbp, h, indx + O_INDX)->pgno, callback, cookie)) != 0) goto err; if (B_TYPE(bk->type) == B_OVERFLOW && (ret = __db_traverse_big(dbp, GET_BOVERFLOW(dbp, h, indx + O_INDX)->pgno, callback, cookie)) != 0) goto err; } break; case P_LDUP: case P_LRECNO: for (indx = 0; indx < NUM_ENT(h); indx += O_INDX) { bk = GET_BKEYDATA(dbp, h, indx); if (B_TYPE(bk->type) == B_OVERFLOW && (ret = __db_traverse_big(dbp, GET_BOVERFLOW(dbp, h, indx)->pgno, callback, cookie)) != 0) goto err; } break; default: return (__db_pgfmt(dbp->dbenv, h->pgno)); } ret = callback(dbp, h, cookie, &already_put);err: if (!already_put && (t_ret = __memp_fput(mpf, h, 0)) != 0 && ret == 0) ret = t_ret; if ((t_ret = __TLPUT(dbc, lock)) != 0 && ret == 0) ret = t_ret; return (ret);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -