コード例 #1
0
ファイル: trx0undo.c プロジェクト: OPSF/uClinux
/***************************************************************************
Gets the previous record in an undo log from the previous page. */
static
trx_undo_rec_t*
trx_undo_get_prev_rec_from_prev_page(
/*=================================*/
				/* out: undo log record, the page s-latched,
				NULL if none */
	trx_undo_rec_t*	rec,	/* in: undo record */
	ulint		page_no,/* in: undo log header page number */
	ulint		offset,	/* in: undo log header offset on page */
	mtr_t*		mtr)	/* in: mtr */
{
	ulint	prev_page_no;
	page_t* prev_page;
	page_t*	undo_page;

	undo_page = buf_frame_align(rec);
	
	prev_page_no = flst_get_prev_addr(undo_page + TRX_UNDO_PAGE_HDR
						+ TRX_UNDO_PAGE_NODE, mtr)
					.page;

	if (prev_page_no == FIL_NULL) {

		return(NULL);
	}

	prev_page = trx_undo_page_get_s_latched(
					buf_frame_get_space_id(undo_page),
					prev_page_no, mtr);

	return(trx_undo_page_get_last_rec(prev_page, page_no, offset));
}
コード例 #2
0
ファイル: btr0pcur.c プロジェクト: isleon/Jaxer
void
btr_pcur_move_to_next_page(
/*=======================*/
	btr_pcur_t*	cursor,	/* in: persistent cursor; must be on the
				last record of the current page */
	mtr_t*		mtr)	/* in: mtr */
{
	ulint	next_page_no;
	ulint	space;
	page_t*	page;
	page_t*	next_page;

	ut_a(cursor->pos_state == BTR_PCUR_IS_POSITIONED);	
	ut_ad(cursor->latch_mode != BTR_NO_LATCHES);
	ut_ad(btr_pcur_is_after_last_on_page(cursor, mtr));	

	cursor->old_stored = BTR_PCUR_OLD_NOT_STORED;
	
	page = btr_pcur_get_page(cursor);

	next_page_no = btr_page_get_next(page, mtr);
	space = buf_frame_get_space_id(page);

	ut_ad(next_page_no != FIL_NULL);	

	next_page = btr_page_get(space, next_page_no, cursor->latch_mode, mtr);
	ut_a(page_is_comp(next_page) == page_is_comp(page));
	buf_block_align(next_page)->check_index_page_at_flush = TRUE;

	btr_leaf_page_release(page, cursor->latch_mode, mtr);
	
	page_cur_set_before_first(next_page, btr_pcur_get_page_cur(cursor));

	page_check_dir(next_page);
}
コード例 #3
0
ファイル: trx0undo.c プロジェクト: OPSF/uClinux
/***************************************************************************
Gets the next record in an undo log from the next page. */
static
trx_undo_rec_t*
trx_undo_get_next_rec_from_next_page(
/*=================================*/
			/* out: undo log record, the page latched, NULL if
			none */
	page_t*	undo_page, /* in: undo log page */
	ulint	page_no,/* in: undo log header page number */
	ulint	offset,	/* in: undo log header offset on page */
	ulint	mode,	/* in: latch mode: RW_S_LATCH or RW_X_LATCH */
	mtr_t*	mtr)	/* in: mtr */
{
	trx_ulogf_t*	log_hdr;
	ulint		next_page_no;
	page_t* 	next_page;
	ulint		space;
	ulint		next;
	
	if (page_no == buf_frame_get_page_no(undo_page)) {

		log_hdr = undo_page + offset;
		next = mach_read_from_2(log_hdr + TRX_UNDO_NEXT_LOG);

		if (next != 0) {

			return(NULL);
		}
	}

	space = buf_frame_get_space_id(undo_page);

	next_page_no = flst_get_next_addr(undo_page + TRX_UNDO_PAGE_HDR
						+ TRX_UNDO_PAGE_NODE, mtr)
					.page;
	if (next_page_no == FIL_NULL) {

		return(NULL);
	}

	if (mode == RW_S_LATCH) {
		next_page = trx_undo_page_get_s_latched(space, next_page_no,
									mtr);
	} else {
		ut_ad(mode == RW_X_LATCH);
		next_page = trx_undo_page_get(space, next_page_no, mtr);
	}

	return(trx_undo_page_get_first_rec(next_page, page_no, offset));
}
コード例 #4
0
ファイル: fut0lst.c プロジェクト: OPSF/uClinux
void
flst_print(
    /*=======*/
    flst_base_node_t*	base,	/* in: pointer to base node of list */
    mtr_t*			mtr)	/* in: mtr */
{
    buf_frame_t*	frame;
    ulint		len;

    ut_ad(base && mtr);
    ut_ad(mtr_memo_contains(mtr, buf_block_align(base),
                            MTR_MEMO_PAGE_X_FIX));
    frame = buf_frame_align(base);

    len = flst_get_len(base, mtr);

    printf("FILE-BASED LIST:\n");
    printf("Base node in space %lu page %lu byte offset %lu; len %lu\n",
           buf_frame_get_space_id(frame), buf_frame_get_page_no(frame),
           (ulint) (base - frame), len);
}
コード例 #5
0
ファイル: btr0pcur.c プロジェクト: isleon/Jaxer
void
btr_pcur_move_backward_from_page(
/*=============================*/
	btr_pcur_t*	cursor,	/* in: persistent cursor, must be on the first
				record of the current page */
	mtr_t*		mtr)	/* in: mtr */
{
	ulint	prev_page_no;
	ulint	space;
	page_t*	page;
	page_t*	prev_page;
	ulint	latch_mode;
	ulint	latch_mode2;

	ut_a(cursor->pos_state == BTR_PCUR_IS_POSITIONED);
	ut_ad(cursor->latch_mode != BTR_NO_LATCHES);
	ut_ad(btr_pcur_is_before_first_on_page(cursor, mtr));	
	ut_ad(!btr_pcur_is_before_first_in_tree(cursor, mtr));	
	
	latch_mode = cursor->latch_mode;
	
	if (latch_mode == BTR_SEARCH_LEAF) {

		latch_mode2 = BTR_SEARCH_PREV;

	} else if (latch_mode == BTR_MODIFY_LEAF) {

		latch_mode2 = BTR_MODIFY_PREV;
	} else {
		latch_mode2 = 0; /* To eliminate compiler warning */
		ut_error;
	}

	btr_pcur_store_position(cursor, mtr);

	mtr_commit(mtr);

	mtr_start(mtr);

	btr_pcur_restore_position(latch_mode2, cursor, mtr);	

	page = btr_pcur_get_page(cursor);

	prev_page_no = btr_page_get_prev(page, mtr);
	space = buf_frame_get_space_id(page);

	if (btr_pcur_is_before_first_on_page(cursor, mtr)
					&& (prev_page_no != FIL_NULL)) {	

		prev_page = btr_pcur_get_btr_cur(cursor)->left_page;

		btr_leaf_page_release(page, latch_mode, mtr);

		page_cur_set_after_last(prev_page,
						btr_pcur_get_page_cur(cursor));
	} else if (prev_page_no != FIL_NULL) {
		
		/* The repositioned cursor did not end on an infimum record on
		a page. Cursor repositioning acquired a latch also on the
		previous page, but we do not need the latch: release it. */
	
		prev_page = btr_pcur_get_btr_cur(cursor)->left_page;

		btr_leaf_page_release(prev_page, latch_mode, mtr);
	}

	cursor->latch_mode = latch_mode;

	cursor->old_stored = BTR_PCUR_OLD_NOT_STORED;
}