/****************************************************** General row routines (c) 1996 Innobase Oy Created 4/20/1996 Heikki Tuuri *******************************************************/ #include "dict0dict.h" #include "rem0rec.h" #include "trx0undo.h" /************************************************************************* Reads the trx id field from a clustered index record. */ UNIV_INLINE dulint row_get_rec_trx_id( /*===============*/ /* out: value of the field */ const rec_t* rec, /* in: record */ dict_index_t* index, /* in: clustered index */ const ulint* offsets)/* in: rec_get_offsets(rec, index) */ { ulint offset; ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); offset = index->trx_id_offset; if (!offset) { offset = row_get_trx_id_offset(rec, index, offsets); } return(trx_read_trx_id(rec + offset)); } /************************************************************************* Reads the roll pointer field from a clustered index record. */ UNIV_INLINE dulint row_get_rec_roll_ptr( /*=================*/ /* out: value of the field */ const rec_t* rec, /* in: record */ dict_index_t* index, /* in: clustered index */ const ulint* offsets)/* in: rec_get_offsets(rec, index) */ { ulint offset; ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); offset = index->trx_id_offset; if (!offset) { offset = row_get_trx_id_offset(rec, index, offsets); } return(trx_read_roll_ptr(rec + offset + DATA_TRX_ID_LEN)); } /*********************************************************************** Builds from a secondary index record a row reference with which we can search the clustered index record. */ UNIV_INLINE void row_build_row_ref_fast( /*===================*/ dtuple_t* ref, /* in: typed data tuple where the reference is built */ const ulint* map, /* in: array of field numbers in rec telling how ref should be built from the fields of rec */ const rec_t* rec, /* in: record in the index; must be preserved while ref is used, as we do not copy field values to heap */ const ulint* offsets)/* in: array returned by rec_get_offsets() */ { dfield_t* dfield; const byte* field; ulint len; ulint ref_len; ulint field_no; ulint i; ut_ad(rec_offs_validate(rec, NULL, offsets)); ref_len = dtuple_get_n_fields(ref); for (i = 0; i < ref_len; i++) { dfield = dtuple_get_nth_field(ref, i); field_no = *(map + i); if (field_no != ULINT_UNDEFINED) { field = rec_get_nth_field(rec, offsets, field_no, &len); dfield_set_data(dfield, field, len); } } }