18 int heap_rkey(
HP_INFO *info, uchar *
record,
int inx,
const uchar *key,
19 key_part_map keypart_map,
enum ha_rkey_function find_flag)
24 DBUG_ENTER(
"heap_rkey");
25 DBUG_PRINT(
"enter",(
"info: 0x%lx inx: %d", (
long) info, inx));
27 if ((uint) inx >= share->keys)
29 DBUG_RETURN(my_errno= HA_ERR_WRONG_INDEX);
32 info->current_record= (ulong) ~0L;
34 if (keyinfo->algorithm == HA_KEY_ALG_BTREE)
38 custom_arg.keyseg= info->s->keydef[inx].seg;
39 custom_arg.key_length= info->lastkey_len=
40 hp_rb_pack_key(keyinfo, (uchar*) info->lastkey,
41 (uchar*) key, keypart_map);
42 custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME;
44 if (find_flag == HA_READ_AFTER_KEY)
45 info->last_find_flag= HA_READ_KEY_OR_NEXT;
46 else if (find_flag == HA_READ_BEFORE_KEY)
47 info->last_find_flag= HA_READ_KEY_OR_PREV;
49 info->last_find_flag= find_flag;
50 if (!(pos= tree_search_key(&keyinfo->rb_tree, info->lastkey, info->parents,
51 &info->last_pos, find_flag, &custom_arg)))
54 DBUG_RETURN(my_errno= HA_ERR_KEY_NOT_FOUND);
56 memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos),
sizeof(uchar*));
57 info->current_ptr= pos;
61 if (!(pos= hp_search(info, share->keydef + inx, key, 0)))
64 DBUG_RETURN(my_errno);
71 if (!(keyinfo->flag & HA_NOSAME) || (keyinfo->flag & HA_NULL_PART_KEY))
72 memcpy(info->lastkey, key, (
size_t) keyinfo->length);
74 memcpy(record, pos, (
size_t) share->reclength);
75 info->update= HA_STATE_AKTIV;
82 uchar* heap_find(
HP_INFO *info,
int inx,
const uchar *key)
84 return hp_search(info, info->s->keydef + inx, key, 0);