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

📄 bt_rec.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* Need to undo update described. */		if ((ret = __bam_adjindx(dbc,		    pagep, argp->indx, argp->indx_copy, !argp->is_insert)) != 0)			goto out;		LSN(pagep) = argp->lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __bam_cadjust_recover -- *	Recovery function for the adjust of a count change in an internal *	page. * * PUBLIC: int __bam_cadjust_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_cadjust_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_cadjust_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	int cmp_n, cmp_p, modified, ret;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__bam_cadjust_print);	REC_INTRO(__bam_cadjust_read, 1);	/* Get the page; if it never existed and we're undoing, we're done. */	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op))			goto done;		__db_pgerr(file_dbp, argp->pgno, ret);		goto out;	}	modified = 0;	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->lsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		if (IS_BTREE_PAGE(pagep)) {			GET_BINTERNAL(file_dbp, pagep, argp->indx)->nrecs +=			    argp->adjust;			if (argp->opflags & CAD_UPDATEROOT)				RE_NREC_ADJ(pagep, argp->adjust);		} else {			GET_RINTERNAL(file_dbp, pagep, argp->indx)->nrecs +=			    argp->adjust;			if (argp->opflags & CAD_UPDATEROOT)				RE_NREC_ADJ(pagep, argp->adjust);		}		LSN(pagep) = *lsnp;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		if (IS_BTREE_PAGE(pagep)) {			GET_BINTERNAL(file_dbp, pagep, argp->indx)->nrecs -=			    argp->adjust;			if (argp->opflags & CAD_UPDATEROOT)				RE_NREC_ADJ(pagep, -(argp->adjust));		} else {			GET_RINTERNAL(file_dbp, pagep, argp->indx)->nrecs -=			    argp->adjust;			if (argp->opflags & CAD_UPDATEROOT)				RE_NREC_ADJ(pagep, -(argp->adjust));		}		LSN(pagep) = argp->lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __bam_cdel_recover -- *	Recovery function for the intent-to-delete of a cursor record. * * PUBLIC: int __bam_cdel_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_cdel_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_cdel_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	u_int32_t indx;	int cmp_n, cmp_p, modified, ret;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__bam_cdel_print);	REC_INTRO(__bam_cdel_read, 1);	/* Get the page; if it never existed and we're undoing, we're done. */	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op))			goto done;		__db_pgerr(file_dbp, argp->pgno, ret);		goto out;	}	modified = 0;	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->lsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		indx = argp->indx + (TYPE(pagep) == P_LBTREE ? O_INDX : 0);		B_DSET(GET_BKEYDATA(file_dbp, pagep, indx)->type);		LSN(pagep) = *lsnp;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		indx = argp->indx + (TYPE(pagep) == P_LBTREE ? O_INDX : 0);		B_DCLR(GET_BKEYDATA(file_dbp, pagep, indx)->type);		(void)__bam_ca_delete(file_dbp, argp->pgno, argp->indx, 0);		LSN(pagep) = argp->lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __bam_repl_recover -- *	Recovery function for page item replacement. * * PUBLIC: int __bam_repl_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_repl_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_repl_args *argp;	BKEYDATA *bk;	DB *file_dbp;	DBC *dbc;	DBT dbt;	DB_MPOOLFILE *mpf;	PAGE *pagep;	int cmp_n, cmp_p, modified, ret;	u_int8_t *p;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__bam_repl_print);	REC_INTRO(__bam_repl_read, 1);	/* Get the page; if it never existed and we're undoing, we're done. */	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op))			goto done;		__db_pgerr(file_dbp, argp->pgno, ret);		goto out;	}	bk = GET_BKEYDATA(file_dbp, pagep, argp->indx);	modified = 0;	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->lsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/*		 * Need to redo update described.		 *		 * Re-build the replacement item.		 */		memset(&dbt, 0, sizeof(dbt));		dbt.size = argp->prefix + argp->suffix + argp->repl.size;		if ((ret = __os_malloc(dbenv, dbt.size, &dbt.data)) != 0)			goto out;		p = dbt.data;		memcpy(p, bk->data, argp->prefix);		p += argp->prefix;		memcpy(p, argp->repl.data, argp->repl.size);		p += argp->repl.size;		memcpy(p, bk->data + (bk->len - argp->suffix), argp->suffix);		ret = __bam_ritem(dbc, pagep, argp->indx, &dbt);		__os_free(dbenv, dbt.data);		if (ret != 0)			goto out;		LSN(pagep) = *lsnp;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/*		 * Need to undo update described.		 *		 * Re-build the original item.		 */		memset(&dbt, 0, sizeof(dbt));		dbt.size = argp->prefix + argp->suffix + argp->orig.size;		if ((ret = __os_malloc(dbenv, dbt.size, &dbt.data)) != 0)			goto out;		p = dbt.data;		memcpy(p, bk->data, argp->prefix);		p += argp->prefix;		memcpy(p, argp->orig.data, argp->orig.size);		p += argp->orig.size;		memcpy(p, bk->data + (bk->len - argp->suffix), argp->suffix);		ret = __bam_ritem(dbc, pagep, argp->indx, &dbt);		__os_free(dbenv, dbt.data);		if (ret != 0)			goto out;		/* Reset the deleted flag, if necessary. */		if (argp->isdeleted)			B_DSET(GET_BKEYDATA(file_dbp, pagep, argp->indx)->type);		LSN(pagep) = argp->lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __bam_root_recover -- *	Recovery function for setting the root page on the meta-data page. * * PUBLIC: int __bam_root_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_root_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_root_args *argp;	BTMETA *meta;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	int cmp_n, cmp_p, modified, ret;	meta = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__bam_root_print);	REC_INTRO(__bam_root_read, 0);	if ((ret = mpf->get(mpf, &argp->meta_pgno, 0, &meta)) != 0) {		/* The metadata page must always exist on redo. */		if (DB_REDO(op)) {			__db_pgerr(file_dbp, argp->meta_pgno, ret);			goto out;		} else			goto done;	}	modified = 0;	cmp_n = log_compare(lsnp, &LSN(meta));	cmp_p = log_compare(&LSN(meta), &argp->meta_lsn);	CHECK_LSN(op, cmp_p, &LSN(meta), &argp->meta_lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		meta->root = argp->root_pgno;		meta->dbmeta.lsn = *lsnp;		((BTREE *)file_dbp->bt_internal)->bt_root = meta->root;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Nothing to undo except lsn. */		meta->dbmeta.lsn = argp->meta_lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, meta, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	meta = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (meta != NULL)		(void)mpf->put(mpf, meta, 0);	REC_CLOSE;}/* * __bam_curadj_recover -- *	Transaction abort function to undo cursor adjustments. *	This should only be triggered by subtransaction aborts. * * PUBLIC: int __bam_curadj_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_curadj_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_curadj_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	int ret;	COMPQUIET(info, NULL);	REC_PRINT(__bam_curadj_print);	REC_INTRO(__bam_curadj_read, 0);	ret = 0;	if (op != DB_TXN_ABORT)		goto done;	switch(argp->mode) {	case DB_CA_DI:		if ((ret = __bam_ca_di(dbc, argp->from_pgno,		    argp->from_indx, -(int)argp->first_indx)) != 0)			goto out;		break;	case DB_CA_DUP:		if ((ret = __bam_ca_undodup(file_dbp, argp->first_indx,		    argp->from_pgno, argp->from_indx, argp->to_indx)) != 0)			goto out;		break;	case DB_CA_RSPLIT:		if ((ret =		    __bam_ca_rsplit(dbc, argp->to_pgno, argp->from_pgno)) != 0)			goto out;		break;	case DB_CA_SPLIT:		__bam_ca_undosplit(file_dbp, argp->from_pgno,		    argp->to_pgno, argp->left_pgno, argp->from_indx);		break;	}done:	*lsnp = argp->prev_lsn;out:	REC_CLOSE;}/* * __bam_rcuradj_recover -- *	Transaction abort function to undo cursor adjustments in rrecno. *	This should only be triggered by subtransaction aborts. * * PUBLIC: int __bam_rcuradj_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__bam_rcuradj_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__bam_rcuradj_args *argp;	BTREE_CURSOR *cp;	DB *file_dbp;	DBC *dbc, *rdbc;	DB_MPOOLFILE *mpf;	int ret, t_ret;	COMPQUIET(info, NULL);	rdbc = NULL;	REC_PRINT(__bam_rcuradj_print);	REC_INTRO(__bam_rcuradj_read, 0);	ret = t_ret = 0;	if (op != DB_TXN_ABORT)		goto done;	/*	 * We don't know whether we're in an offpage dup set, and	 * thus don't know whether the dbc REC_INTRO has handed us is	 * of a reasonable type.  It's certainly unset, so if this is	 * an offpage dup set, we don't have an OPD cursor.  The	 * simplest solution is just to allocate a whole new cursor	 * for our use;  we're only really using it to hold pass some	 * state into __ram_ca, and this way we don't need to make	 * this function know anything about how offpage dups work.	 */	if ((ret =	    __db_icursor(file_dbp,		NULL, DB_RECNO, argp->root, 0, DB_LOCK_INVALIDID, &rdbc)) != 0)		goto out;	cp = (BTREE_CURSOR *)rdbc->internal;	F_SET(cp, C_RENUMBER);	cp->recno = argp->recno;	switch(argp->mode) {	case CA_DELETE:		/*		 * The way to undo a delete is with an insert.  Since		 * we're undoing it, the delete flag must be set.		 */		F_SET(cp, C_DELETED);		F_SET(cp, C_RENUMBER);	/* Just in case. */		cp->order = argp->order;		__ram_ca(rdbc, CA_ICURRENT);		break;	case CA_IAFTER:	case CA_IBEFORE:	case CA_ICURRENT:		/*		 * The way to undo an insert is with a delete.  The delete		 * flag is unset to start with.		 */		F_CLR(cp, C_DELETED);		cp->order = INVALID_ORDER;		__ram_ca(rdbc, CA_DELETE);		break;	}done:	*lsnp = argp->prev_lsn;out:	if (rdbc != NULL && (t_ret = rdbc->c_close(rdbc)) != 0 && ret == 0)		ret = t_ret;	REC_CLOSE;}

⌨️ 快捷键说明

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