⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bt_stat.c

📁 这是国外的resip协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996-2004 *	Sleepycat Software.  All rights reserved. * * $Id: bt_stat.c,v 11.78 2004/09/22 03:31:26 bostic Exp $ */#include "db_config.h"#ifndef NO_SYSTEM_INCLUDES#include <sys/types.h>#include <ctype.h>#include <string.h>#endif#include "db_int.h"#include "dbinc/db_page.h"#include "dbinc/db_shash.h"#include "dbinc/btree.h"#include "dbinc/lock.h"#include "dbinc/mp.h"#ifdef HAVE_STATISTICS/* * __bam_stat -- *	Gather/print the btree statistics * * PUBLIC: int __bam_stat __P((DBC *, void *, u_int32_t)); */int__bam_stat(dbc, spp, flags)	DBC *dbc;	void *spp;	u_int32_t flags;{	BTMETA *meta;	BTREE *t;	BTREE_CURSOR *cp;	DB *dbp;	DB_BTREE_STAT *sp;	DB_ENV *dbenv;	DB_LOCK lock, metalock;	DB_MPOOLFILE *mpf;	PAGE *h;	db_pgno_t pgno;	int ret, t_ret, write_meta;	dbp = dbc->dbp;	dbenv = dbp->dbenv;	meta = NULL;	t = dbp->bt_internal;	sp = NULL;	LOCK_INIT(metalock);	LOCK_INIT(lock);	mpf = dbp->mpf;	h = NULL;	ret = write_meta = 0;	cp = (BTREE_CURSOR *)dbc->internal;	/* Allocate and clear the structure. */	if ((ret = __os_umalloc(dbenv, sizeof(*sp), &sp)) != 0)		goto err;	memset(sp, 0, sizeof(*sp));	/* Get the metadata page for the entire database. */	pgno = PGNO_BASE_MD;	if ((ret = __db_lget(dbc, 0, pgno, DB_LOCK_READ, 0, &metalock)) != 0)		goto err;	if ((ret = __memp_fget(mpf, &pgno, 0, &meta)) != 0)		goto err;	if (flags == DB_RECORDCOUNT || flags == DB_CACHED_COUNTS)		flags = DB_FAST_STAT;	if (flags == DB_FAST_STAT)		goto meta_only;	/* Walk the metadata free list, counting pages. */	for (sp->bt_free = 0, pgno = meta->dbmeta.free; pgno != PGNO_INVALID;) {		++sp->bt_free;		if ((ret = __memp_fget(mpf, &pgno, 0, &h)) != 0)			goto err;		pgno = h->next_pgno;		if ((ret = __memp_fput(mpf, h, 0)) != 0)			goto err;		h = NULL;	}	/* Get the root page. */	pgno = cp->root;	if ((ret = __db_lget(dbc, 0, pgno, DB_LOCK_READ, 0, &lock)) != 0)		goto err;	if ((ret = __memp_fget(mpf, &pgno, 0, &h)) != 0)		goto err;	/* Get the levels from the root page. */	sp->bt_levels = h->level;	/* Discard the root page. */	ret = __memp_fput(mpf, h, 0);	h = NULL;	if ((t_ret = __LPUT(dbc, lock)) != 0 && ret == 0)		ret = t_ret;	if (ret != 0)		goto err;	/* Walk the tree. */	if ((ret = __bam_traverse(dbc,	    DB_LOCK_READ, cp->root, __bam_stat_callback, sp)) != 0)		goto err;	/*	 * Get the subdatabase metadata page if it's not the same as the	 * one we already have.	 */	write_meta = !F_ISSET(dbp, DB_AM_RDONLY);meta_only:	if (t->bt_meta != PGNO_BASE_MD || write_meta != 0) {		ret = __memp_fput(mpf, meta, 0);		meta = NULL;		if ((t_ret = __LPUT(dbc, metalock)) != 0 && ret == 0)			ret = t_ret;		if (ret != 0)			goto err;		if ((ret = __db_lget(dbc,		    0, t->bt_meta, write_meta == 0 ?		    DB_LOCK_READ : DB_LOCK_WRITE, 0, &metalock)) != 0)			goto err;		if ((ret = __memp_fget(mpf, &t->bt_meta, 0, &meta)) != 0)			goto err;	}	if (flags == DB_FAST_STAT) {		if (dbp->type == DB_RECNO ||		    (dbp->type == DB_BTREE && F_ISSET(dbp, DB_AM_RECNUM))) {			if ((ret = __db_lget(dbc, 0,			    cp->root, DB_LOCK_READ, 0, &lock)) != 0)				goto err;			if ((ret = __memp_fget(mpf, &cp->root, 0, &h)) != 0)				goto err;			sp->bt_nkeys = RE_NREC(h);		} else			sp->bt_nkeys = meta->dbmeta.key_count;		sp->bt_ndata = dbp->type == DB_RECNO ?		   sp->bt_nkeys : meta->dbmeta.record_count;	}	/* Get metadata page statistics. */	sp->bt_metaflags = meta->dbmeta.flags;	sp->bt_maxkey = meta->maxkey;	sp->bt_minkey = meta->minkey;	sp->bt_re_len = meta->re_len;	sp->bt_re_pad = meta->re_pad;	sp->bt_pagesize = meta->dbmeta.pagesize;	sp->bt_magic = meta->dbmeta.magic;	sp->bt_version = meta->dbmeta.version;	if (write_meta != 0) {		meta->dbmeta.key_count = sp->bt_nkeys;		meta->dbmeta.record_count = sp->bt_ndata;	}	*(DB_BTREE_STAT **)spp = sp;err:	/* Discard the second page. */	if ((t_ret = __LPUT(dbc, lock)) != 0 && ret == 0)		ret = t_ret;	if (h != NULL && (t_ret = __memp_fput(mpf, h, 0)) != 0 && ret == 0)		ret = t_ret;	/* Discard the metadata page. */	if ((t_ret = __LPUT(dbc, metalock)) != 0 && ret == 0)		ret = t_ret;	if (meta != NULL && (t_ret = __memp_fput(	    mpf, meta, write_meta == 0 ? 0 : DB_MPOOL_DIRTY)) != 0 && ret == 0)		ret = t_ret;	if (ret != 0 && sp != NULL) {		__os_ufree(dbenv, sp);		*(DB_BTREE_STAT **)spp = NULL;	}	return (ret);}/* * __bam_stat_print -- *	Display btree/recno statistics. * * PUBLIC: int __bam_stat_print __P((DBC *, u_int32_t)); */int__bam_stat_print(dbc, flags)	DBC *dbc;	u_int32_t flags;{	static const FN fn[] = {		{ BTM_DUP,	"duplicates" },		{ BTM_RECNO,	"recno" },		{ BTM_RECNUM,	"record-numbers" },		{ BTM_FIXEDLEN,	"fixed-length" },		{ BTM_RENUMBER,	"renumber" },		{ BTM_SUBDB,	"multiple-databases" },		{ BTM_DUPSORT,	"sorted duplicates" },		{ 0,		NULL }	};	DB *dbp;	DB_BTREE_STAT *sp;	DB_ENV *dbenv;	int lorder, ret;	const char *s;	dbp = dbc->dbp;	dbenv = dbp->dbenv;	if ((ret = __bam_stat(dbc, &sp, 0)) != 0)		return (ret);	if (LF_ISSET(DB_STAT_ALL)) {		__db_msg(dbenv, "%s", DB_GLOBAL(db_line));		__db_msg(dbenv, "Default Btree/Recno database information:");	}	__db_msg(dbenv, "%lx\tBtree magic number", (u_long)sp->bt_magic);	__db_msg(dbenv, "%lu\tBtree version number", (u_long)sp->bt_version);	(void)__db_get_lorder(dbp, &lorder);	switch (lorder) {	case 1234:		s = "Little-endian";		break;	case 4321:		s = "Big-endian";		break;	default:		s = "Unrecognized byte order";		break;	}	__db_msg(dbenv, "%s\tByte order", s);	__db_prflags(dbenv, NULL, sp->bt_metaflags, fn, NULL, "\tFlags");	if (dbp->type == DB_BTREE) {#ifdef NOT_IMPLEMENTED		__db_dl(dbenv, "Maximum keys per-page", (u_long)sp->bt_maxkey);#endif		__db_dl(dbenv, "Minimum keys per-page", (u_long)sp->bt_minkey);	}	if (dbp->type == DB_RECNO) {		__db_dl(dbenv,		    "Fixed-length record size", (u_long)sp->bt_re_len);		__db_dl(dbenv,		    "%#x\tFixed-length record pad", (u_int)sp->bt_re_pad);	}	__db_dl(dbenv,	    "Underlying database page size", (u_long)sp->bt_pagesize);	__db_dl(dbenv, "Number of levels in the tree", (u_long)sp->bt_levels);	__db_dl(dbenv, dbp->type == DB_BTREE ?	    "Number of unique keys in the tree" :	    "Number of records in the tree", (u_long)sp->bt_nkeys);	__db_dl(dbenv,	    "Number of data items in the tree", (u_long)sp->bt_ndata);	__db_dl(dbenv,	    "Number of tree internal pages", (u_long)sp->bt_int_pg);	__db_dl_pct(dbenv,	    "Number of bytes free in tree internal pages",	    (u_long)sp->bt_int_pgfree,	    DB_PCT_PG(sp->bt_int_pgfree, sp->bt_int_pg, sp->bt_pagesize), "ff");	__db_dl(dbenv,	    "Number of tree leaf pages", (u_long)sp->bt_leaf_pg);	__db_dl_pct(dbenv, "Number of bytes free in tree leaf pages",	    (u_long)sp->bt_leaf_pgfree, DB_PCT_PG(	    sp->bt_leaf_pgfree, sp->bt_leaf_pg, sp->bt_pagesize), "ff");	__db_dl(dbenv,	    "Number of tree duplicate pages", (u_long)sp->bt_dup_pg);	__db_dl_pct(dbenv,	    "Number of bytes free in tree duplicate pages",	    (u_long)sp->bt_dup_pgfree,	    DB_PCT_PG(sp->bt_dup_pgfree, sp->bt_dup_pg, sp->bt_pagesize), "ff");	__db_dl(dbenv,	    "Number of tree overflow pages", (u_long)sp->bt_over_pg);	__db_dl_pct(dbenv, "Number of bytes free in tree overflow pages",	    (u_long)sp->bt_over_pgfree, DB_PCT_PG(	    sp->bt_over_pgfree, sp->bt_over_pg, sp->bt_pagesize), "ff");	__db_dl(dbenv, "Number of empty pages", (u_long)sp->bt_empty_pg);	__db_dl(dbenv, "Number of pages on the free list", (u_long)sp->bt_free);	__os_ufree(dbenv, sp);	return (0);}/* * __bam_stat_callback -- *	Statistics callback. * * PUBLIC: int __bam_stat_callback __P((DB *, PAGE *, void *, int *)); */int__bam_stat_callback(dbp, h, cookie, putp)	DB *dbp;	PAGE *h;	void *cookie;	int *putp;{	DB_BTREE_STAT *sp;	db_indx_t indx, *inp, top;	u_int8_t type;	sp = cookie;	*putp = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -