16 #include "myisamdef.h"
25 int mi_rprev(
MI_INFO *info, uchar *
buf,
int inx)
30 DBUG_ENTER(
"mi_rprev");
32 if ((inx = _mi_check_index(info,inx)) < 0)
33 DBUG_RETURN(my_errno);
35 if (info->lastpos == HA_OFFSET_ERROR && info->update & HA_STATE_NEXT_FOUND)
38 if (fast_mi_readinfo(info))
39 DBUG_RETURN(my_errno);
40 changed=_mi_test_if_changed(info);
41 if (share->concurrent_insert)
44 error=_mi_search_last(info, share->keyinfo+inx,
45 share->state.key_root[inx]);
47 error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
48 info->lastkey_length,flag,
49 share->state.key_root[inx]);
51 error=_mi_search(info,share->keyinfo+inx,info->lastkey,
52 USE_WHOLE_KEY, flag, share->state.key_root[inx]);
57 while ((share->concurrent_insert &&
58 info->lastpos >= info->state->data_file_length) ||
59 (info->index_cond_func &&
60 !(res= mi_check_index_cond(info, inx, buf))))
66 if ((error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
69 share->state.key_root[inx])))
72 if (!error && res == 2)
74 if (share->concurrent_insert)
76 info->lastpos= HA_OFFSET_ERROR;
77 DBUG_RETURN(my_errno= HA_ERR_END_OF_FILE);
81 if (share->concurrent_insert)
85 while (info->lastpos >= info->state->data_file_length)
88 if ((error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
91 share->state.key_root[inx])))
98 info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
99 info->update|= HA_STATE_PREV_FOUND;
102 if (my_errno == HA_ERR_KEY_NOT_FOUND)
103 my_errno=HA_ERR_END_OF_FILE;
107 DBUG_RETURN(info->lastpos==HA_OFFSET_ERROR ? my_errno : 0);
109 else if (!(*info->read_record)(info,info->lastpos,buf))
111 info->update|= HA_STATE_AKTIV;
114 DBUG_RETURN(my_errno);