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

📄 db_pr.c

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