18 #include "myisam_priv.h"
25 int mi_rkey(
MI_INFO *info,
unsigned char *buf,
int inx,
const unsigned char *key,
26 key_part_map keypart_map,
enum ha_rkey_function search_flag)
28 unsigned char *key_buff;
32 uint32_t pack_key_length, use_key_length, nextflag;
33 uint32_t myisam_search_flag;
36 if ((inx = _mi_check_index(info,inx)) < 0)
39 info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
40 info->last_key_func= search_flag;
41 keyinfo= share->keyinfo + inx;
43 if (info->once_flags & USE_PACKED_KEYS)
45 info->once_flags&= ~USE_PACKED_KEYS;
50 key_buff=info->lastkey+info->s->base.max_key_length;
51 pack_key_length= keypart_map;
52 memmove(key_buff, key, pack_key_length);
53 last_used_keyseg= info->s->keyinfo[inx].seg + info->last_used_keyseg;
59 key_buff=info->lastkey+info->s->base.max_key_length;
60 pack_key_length=_mi_pack_key(info,(uint) inx, key_buff, (
unsigned char*) key,
61 keypart_map, &last_used_keyseg);
63 info->pack_key_length= pack_key_length;
64 info->last_used_keyseg= (uint16_t) (last_used_keyseg -
65 info->s->keyinfo[inx].seg);
68 if (fast_mi_readinfo(info))
71 nextflag=myisam_read_vec[search_flag];
72 use_key_length=pack_key_length;
73 if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST)))
74 use_key_length=USE_WHOLE_KEY;
76 switch (info->s->keyinfo[inx].key_alg) {
77 case HA_KEY_ALG_BTREE:
79 myisam_search_flag= myisam_read_vec[search_flag];
80 if (!_mi_search(info, keyinfo, key_buff, use_key_length,
81 myisam_search_flag, info->s->state.key_root[inx]))
100 while ((info->lastpos >= info->state->data_file_length &&
101 (search_flag != HA_READ_KEY_EXACT ||
102 last_used_keyseg != keyinfo->seg + keyinfo->keysegs)) ||
103 (info->index_cond_func &&
104 !(res= mi_check_index_cond(info, inx, buf))))
106 uint32_t not_used[2];
113 if (_mi_search_next(info, keyinfo, info->lastkey,
114 info->lastkey_length,
115 myisam_readnext_vec[search_flag],
116 info->s->state.key_root[inx]))
123 if (search_flag == HA_READ_KEY_EXACT &&
124 ha_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length,
125 SEARCH_FIND, not_used))
127 errno= HA_ERR_KEY_NOT_FOUND;
128 info->lastpos= HA_OFFSET_ERROR;
134 info->lastpos= HA_OFFSET_ERROR;
135 return((errno= HA_ERR_KEY_NOT_FOUND));
141 if (info->lastpos != HA_OFFSET_ERROR &&
142 info->lastpos >= info->state->data_file_length)
144 info->lastpos= HA_OFFSET_ERROR;
145 errno= HA_ERR_KEY_NOT_FOUND;
151 if ((keyinfo->flag & HA_VAR_LENGTH_KEY) && last_used_keyseg &&
152 info->lastpos != HA_OFFSET_ERROR)
153 info->last_rkey_length= _mi_keylength_part(keyinfo, info->lastkey,
156 info->last_rkey_length= pack_key_length;
160 return(info->lastpos == HA_OFFSET_ERROR ? errno : 0);
162 if (!(*info->read_record)(info,info->lastpos,buf))
164 info->update|= HA_STATE_AKTIV;
168 info->lastpos = HA_OFFSET_ERROR;
171 memcpy(info->lastkey,key_buff,pack_key_length);
172 info->last_rkey_length= pack_key_length;
173 memset(info->lastkey+pack_key_length, 0, info->s->base.rec_reflength);
174 info->lastkey_length=pack_key_length+info->s->base.rec_reflength;
176 if (search_flag == HA_READ_AFTER_KEY)
177 info->update|=HA_STATE_NEXT_FOUND;
TODO: Rename this file - func.h is stupid.