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

📄 bt_stat.c

📁 这是国外的resip协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -