int CMySQLDynamicRecordSet::MovePrevious() { if(m_hStmt) { if(m_CacheAllData) { MYSQL_ROW_OFFSET Offset=mysql_stmt_row_tell(m_hStmt); Offset--; mysql_stmt_row_seek(m_hStmt,Offset); int Ret=FetchRow(); if(Ret==DBERR_NO_RECORDS) { m_IsBOF=true; return DBERR_IS_RECORDSET_HEAD; } else { return Ret; } } else { return DBERR_NOT_IMPLEMENT; } } else { return DBERR_NO_RECORDS; } }
VALUE db_mysql_result_from_statement(VALUE self, VALUE statement) { int n, row, cols; MYSQL_STMT *s; MYSQL_FIELD *fields; MYSQL_RES *result; Result *r = db_mysql_result_handle(self); if (!rb_obj_is_kind_of(statement, cDMS)) rb_raise(eSwiftArgumentError, "invalid Mysql::Statement"); r->statement = statement; s = db_mysql_statement_handle_safe(statement)->statement; mysql_stmt_store_result(s); result = mysql_stmt_result_metadata(s); db_mysql_result_load(self, result, mysql_stmt_insert_id(s), mysql_stmt_affected_rows(s)); if (result) { cols = mysql_num_fields(result); fields = mysql_fetch_fields(result); r->bind = (MYSQL_BIND *)malloc(sizeof(MYSQL_BIND) * cols); r->lengths = (unsigned long *)malloc(sizeof(unsigned long) * cols); r->is_null = (my_bool *)malloc(sizeof(my_bool) * cols); memset(r->bind, 0, sizeof(MYSQL_BIND) * cols); for (n = 0; n < cols; n++) { r->bind[n].length = &r->lengths[n]; r->bind[n].is_null = &r->is_null[n]; r->bind[n].buffer_type = fields[n].type; switch(fields[n].type) { case MYSQL_TYPE_NULL: r->bind[n].buffer = malloc(1); r->bind[n].buffer_length = 1; break; case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_YEAR: case MYSQL_TYPE_INT24: case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: r->bind[n].buffer = malloc(8); r->bind[n].buffer_length = 8; memset(r->bind[n].buffer, 0, 8); break; case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_BIT: r->bind[n].buffer = malloc(fields[n].length); r->bind[n].buffer_length = fields[n].length; memset(r->bind[n].buffer, 0, fields[n].length); if (!(fields[n].flags & BINARY_FLAG)) r->bind[n].buffer_type = MYSQL_TYPE_STRING; break; case MYSQL_TYPE_TIME: case MYSQL_TYPE_DATE: case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_TIMESTAMP: r->bind[n].buffer = malloc(sizeof(MYSQL_TIME)); r->bind[n].buffer_length = sizeof(MYSQL_TIME); memset(r->bind[n].buffer, 0, sizeof(MYSQL_TIME)); break; default: rb_raise(rb_eTypeError, "unknown buffer_type: %d", fields[n].type); } } if (mysql_stmt_bind_result(s, r->bind) != 0) rb_raise(eSwiftRuntimeError, "%s", mysql_stmt_error(s)); } r->start = mysql_stmt_row_tell(s); r->selected = mysql_stmt_num_rows(s); r->affected = mysql_stmt_affected_rows(s); return self; }