ha_innobase::general_fetch

 

/***********************************************************************//**
Reads the next or previous row from a cursor, which must have previously been
positioned using index_read.
@return    0, HA_ERR_END_OF_FILE, or error number */
UNIV_INTERN
int
ha_innobase::general_fetch(
/*=======================*/
    uchar*    buf,        /*!< in/out: buffer for next row in MySQL
                format */
    uint    direction,    /*!< in: ROW_SEL_NEXT or ROW_SEL_PREV */
    uint    match_mode)    /*!< in: 0, ROW_SEL_EXACT, or
                ROW_SEL_EXACT_PREFIX */
{
    ulint        ret;
    int        error    = 0;

    DBUG_ENTER("general_fetch");

    ut_a(prebuilt->trx == thd_to_trx(user_thd));

    innodb_srv_conc_enter_innodb(prebuilt->trx);

    ret = row_search_for_mysql((byte*)buf, 0, prebuilt, match_mode, direction);

    innodb_srv_conc_exit_innodb(prebuilt->trx);

    switch (ret) {
    case DB_SUCCESS:
        error = 0;
        table->status = 0;
        break;
    case DB_RECORD_NOT_FOUND:
        error = HA_ERR_END_OF_FILE;
        table->status = STATUS_NOT_FOUND;
        break;
    case DB_END_OF_INDEX:
        error = HA_ERR_END_OF_FILE;
        table->status = STATUS_NOT_FOUND;
        break;
    default:
        error = convert_error_code_to_mysql(
            (int) ret, prebuilt->table->flags, user_thd);
        table->status = STATUS_NOT_FOUND;
        break;
    }

    DBUG_RETURN(error);
}

 

posted @ 2015-12-16 23:19  taek  阅读(335)  评论(0编辑  收藏  举报