TABLE_SHARE *mrn_get_table_share(TABLE_LIST *table_list, int *error) { uint key_length; TABLE_SHARE *share; THD *thd = current_thd; MRN_DBUG_ENTER_FUNCTION(); #ifdef MRN_HAVE_GET_TABLE_DEF_KEY const char *key; key_length = get_table_def_key(table_list, &key); #else char key[MAX_DBKEY_LENGTH]; key_length = create_table_def_key(thd, key, table_list, FALSE); #endif #ifdef MRN_HAVE_TABLE_DEF_CACHE my_hash_value_type hash_value; hash_value = my_calc_hash(mrn_table_def_cache, (uchar*) key, key_length); share = get_table_share(thd, table_list, key, key_length, 0, error, hash_value); #elif defined(MRN_HAVE_TDC_ACQUIRE_SHARE) share = tdc_acquire_share(thd, table_list->db, table_list->table_name, key, key_length, table_list->mdl_request.key.tc_hash_value(), GTS_TABLE, NULL); #else share = get_table_share(thd, table_list, key, key_length, 0, error); #endif DBUG_RETURN(share); }
ham_status_t extkey_cache_insert(extkey_cache_t *cache, ham_offset_t blobid, ham_size_t size, const ham_u8_t *data) { ham_size_t h=my_calc_hash(cache, blobid); extkey_t *e; ham_db_t *db=extkey_cache_get_db(cache); ham_env_t *env = db_get_env(db); /* * DEBUG build: make sure that the item is not inserted twice! */ #ifdef HAM_DEBUG e=extkey_cache_get_bucket(cache, h); while (e) { ham_assert(extkey_get_blobid(e)!=blobid, (0)); e=extkey_get_next(e); } #endif e=(extkey_t *)allocator_alloc(env_get_allocator(env), SIZEOF_EXTKEY_T+size); if (!e) return HAM_OUT_OF_MEMORY; extkey_set_blobid(e, blobid); extkey_set_txn_id(e, env_get_txn_id(env)); extkey_set_next(e, extkey_cache_get_bucket(cache, h)); extkey_set_size(e, size); memcpy(extkey_get_data(e), data, size); extkey_cache_set_bucket(cache, h, e); extkey_cache_set_usedsize(cache, extkey_cache_get_usedsize(cache)+size); return (0); }
ham_status_t extkey_cache_remove(extkey_cache_t *cache, ham_offset_t blobid) { ham_db_t *db=extkey_cache_get_db(cache); ham_env_t *env = db_get_env(db); ham_size_t h=my_calc_hash(cache, blobid); extkey_t *e, *prev=0; e=extkey_cache_get_bucket(cache, h); while (e) { if (extkey_get_blobid(e)==blobid) break; prev=e; e=extkey_get_next(e); } if (!e) return (HAM_KEY_NOT_FOUND); if (prev) extkey_set_next(prev, extkey_get_next(e)); else extkey_cache_set_bucket(cache, h, extkey_get_next(e)); extkey_cache_set_usedsize(cache, extkey_cache_get_usedsize(cache)-extkey_get_size(e)); allocator_free(env_get_allocator(env), e); return (0); }
ham_status_t extkey_cache_fetch(extkey_cache_t *cache, ham_offset_t blobid, ham_size_t *size, ham_u8_t **data) { ham_size_t h=my_calc_hash(cache, blobid); extkey_t *e; e=extkey_cache_get_bucket(cache, h); while (e) { if (extkey_get_blobid(e)==blobid) break; e=extkey_get_next(e); } if (!e) return (HAM_KEY_NOT_FOUND); *size=extkey_get_size(e); *data=extkey_get_data(e); extkey_set_txn_id(e, env_get_txn_id(db_get_env(extkey_cache_get_db(cache)))); return (0); }