/****************************************************** Data dictionary creation and booting (c) 1996 Innobase Oy Created 4/18/1996 Heikki Tuuri *******************************************************/ /************************************************************************** Writes the current value of the row id counter to the dictionary header file page. */ void dict_hdr_flush_row_id(void); /*=======================*/ /************************************************************************** Gets a pointer to the dictionary header and x-latches its page. */ UNIV_INLINE dict_hdr_t* dict_hdr_get( /*=========*/ /* out: pointer to the dictionary header, page x-latched */ mtr_t* mtr) /* in: mtr */ { dict_hdr_t* header; ut_ad(mtr); header = DICT_HDR + buf_page_get(DICT_HDR_SPACE, DICT_HDR_PAGE_NO, RW_X_LATCH, mtr); buf_page_dbg_add_level(header, SYNC_DICT_HEADER); return(header); } /************************************************************************** Returns a new table, index, or tree id. */ UNIV_INLINE dulint dict_hdr_get_new_id( /*================*/ /* out: the new id */ ulint type) /* in: DICT_HDR_ROW_ID, ... */ { dict_hdr_t* dict_hdr; dulint id; mtr_t mtr; ut_ad((type == DICT_HDR_TABLE_ID) || (type == DICT_HDR_INDEX_ID) || (type == DICT_HDR_MIX_ID)); mtr_start(&mtr); dict_hdr = dict_hdr_get(&mtr); id = mtr_read_dulint(dict_hdr + type, MLOG_8BYTES, &mtr); id = ut_dulint_add(id, 1); mlog_write_dulint(dict_hdr + type, id, MLOG_8BYTES, &mtr); mtr_commit(&mtr); return(id); } /************************************************************************** Returns a new row id. */ UNIV_INLINE dulint dict_sys_get_new_row_id(void) /*=========================*/ /* out: the new id */ { dulint id; mutex_enter(&(dict_sys->mutex)); id = dict_sys->row_id; if (0 == (ut_dulint_get_low(id) % DICT_HDR_ROW_ID_WRITE_MARGIN)) { dict_hdr_flush_row_id(); } UT_DULINT_INC(dict_sys->row_id); mutex_exit(&(dict_sys->mutex)); return(id); } /************************************************************************** Reads a row id from a record or other 6-byte stored form. */ UNIV_INLINE dulint dict_sys_read_row_id( /*=================*/ /* out: row id */ byte* field) /* in: record field */ { ut_ad(DATA_ROW_ID_LEN == 6); return(mach_read_from_6(field)); } /************************************************************************** Writes a row id to a record or other 6-byte stored form. */ UNIV_INLINE void dict_sys_write_row_id( /*==================*/ byte* field, /* in: record field */ dulint row_id) /* in: row id */ { ut_ad(DATA_ROW_ID_LEN == 6); mach_write_to_6(field, row_id); }