16 #include "myisam_priv.h"
25 int mi_rprev(
MI_INFO *info,
unsigned char *buf,
int inx)
28 register uint32_t flag;
31 if ((inx = _mi_check_index(info,inx)) < 0)
34 if (info->lastpos == HA_OFFSET_ERROR && info->update & HA_STATE_NEXT_FOUND)
37 if (fast_mi_readinfo(info))
39 changed=_mi_test_if_changed(info);
41 error=_mi_search_last(info, share->keyinfo+inx,
42 share->state.key_root[inx]);
44 error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
45 info->lastkey_length,flag,
46 share->state.key_root[inx]);
48 error=_mi_search(info,share->keyinfo+inx,info->lastkey,
49 USE_WHOLE_KEY, flag, share->state.key_root[inx]);
51 if (share->concurrent_insert)
55 while (info->lastpos >= info->state->data_file_length)
58 if ((error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
61 share->state.key_root[inx])))
66 info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
67 info->update|= HA_STATE_PREV_FOUND;
70 if (errno == drizzled::HA_ERR_KEY_NOT_FOUND)
71 errno= drizzled::HA_ERR_END_OF_FILE;
75 return(info->lastpos==HA_OFFSET_ERROR ? errno : 0);
77 else if (!(*info->read_record)(info,info->lastpos,buf))
79 info->update|= HA_STATE_AKTIV;