/****************************************************************//** Creates a new rollback segment to the database. @return the created segment object, NULL if fail */ UNIV_INTERN trx_rseg_t* trx_rseg_create( /*============*/ ulint space, /*!< in: space id */ ulint max_size, /*!< in: max size in pages */ ulint* id, /*!< out: rseg id */ mtr_t* mtr) /*!< in: mtr */ { ulint flags; ulint zip_size; ulint page_no; trx_rseg_t* rseg; mtr_x_lock(fil_space_get_latch(space, &flags), mtr); zip_size = dict_table_flags_to_zip_size(flags); mutex_enter(&kernel_mutex); page_no = trx_rseg_header_create(space, zip_size, max_size, id, mtr); if (page_no == FIL_NULL) { mutex_exit(&kernel_mutex); return(NULL); } rseg = trx_rseg_mem_create(*id, space, zip_size, page_no, mtr); mutex_exit(&kernel_mutex); return(rseg); }
/********************************************************************//** Creates a cache of column prefixes of externally stored columns. @return own: column prefix cache */ UNIV_INTERN row_ext_t* row_ext_create( /*===========*/ ulint n_ext, /*!< in: number of externally stored columns */ const ulint* ext, /*!< in: col_no's of externally stored columns in the InnoDB table object, as reported by dict_col_get_no(); NOT relative to the records in the clustered index */ ulint flags, /*!< in: table->flags */ const dtuple_t* tuple, /*!< in: data tuple containing the field references of the externally stored columns; must be indexed by col_no; the clustered index record must be covered by a lock or a page latch to prevent deletion (rollback or purge). */ mem_heap_t* heap) /*!< in: heap where created */ { ulint i; ulint zip_size = dict_table_flags_to_zip_size(flags); row_ext_t* ret = mem_heap_alloc(heap, (sizeof *ret) + (n_ext - 1) * sizeof ret->len); ut_ad(ut_is_2pow(zip_size)); ut_ad(zip_size <= UNIV_PAGE_SIZE); ret->n_ext = n_ext; ret->ext = ext; ret->max_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags); ret->buf = mem_heap_alloc(heap, n_ext * ret->max_len); #ifdef UNIV_DEBUG memset(ret->buf, 0xaa, n_ext * ret->max_len); UNIV_MEM_ALLOC(ret->buf, n_ext * ret->max_len); #endif /* Fetch the BLOB prefixes */ for (i = 0; i < n_ext; i++) { const dfield_t* dfield; dfield = dtuple_get_nth_field(tuple, ext[i]); row_ext_cache_fill(ret, i, zip_size, dfield); } return(ret); }