class Mysql::Stmt
Constants
- ATTR_UPDATE_MAX_LENGTH
Public Instance Methods
affected_rows()
click to toggle source
static VALUE stmt_affected_rows(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); my_ulonglong n; check_stmt_closed(obj); n = mysql_stmt_affected_rows(s->stmt); return INT2NUM(n); }
attr_get(p1)
click to toggle source
#attr_get(option)
static VALUE stmt_attr_get(VALUE obj, VALUE opt) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); if (NUM2INT(opt) == STMT_ATTR_UPDATE_MAX_LENGTH) { my_bool arg; mysql_stmt_attr_get(s->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &arg); return arg == 1 ? Qtrue : Qfalse; } rb_raise(eMysql, "unknown option: %d", NUM2INT(opt)); }
attr_set(p1, p2)
click to toggle source
#attr_set(option, arg)
static VALUE stmt_attr_set(VALUE obj, VALUE opt, VALUE val) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); if (NUM2INT(opt) == STMT_ATTR_UPDATE_MAX_LENGTH) { my_bool arg; arg = (val == Qnil || val == Qfalse) ? 0 : 1; mysql_stmt_attr_set(s->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &arg); return obj; } rb_raise(eMysql, "unknown option: %d", NUM2INT(opt)); }
bind_result(*args)
click to toggle source
#bind_result(bind,…)
static VALUE stmt_bind_result(int argc, VALUE *argv, VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); int i; MYSQL_FIELD *field; check_stmt_closed(obj); if (argc != s->result.n) rb_raise(eMysql, "bind_result: result value count(%d) != number of argument(%d)", s->result.n, argc); for (i = 0; i < argc; i++) { if (argv[i] == Qnil || argv[i] == rb_cNilClass) { field = mysql_fetch_fields(s->res); s->result.bind[i].buffer_type = field[i].type; } else if (argv[i] == rb_cString) s->result.bind[i].buffer_type = MYSQL_TYPE_STRING; else if (argv[i] == rb_cNumeric || argv[i] == rb_cInteger) s->result.bind[i].buffer_type = MYSQL_TYPE_LONGLONG; else if (argv[i] == rb_cFloat) s->result.bind[i].buffer_type = MYSQL_TYPE_DOUBLE; else if (argv[i] == cMysqlTime) s->result.bind[i].buffer_type = MYSQL_TYPE_DATETIME; else rb_raise(rb_eTypeError, "unrecognized class: %s", RSTRING_PTR(rb_inspect(argv[i]))); if (mysql_stmt_bind_result(s->stmt, s->result.bind)) mysql_stmt_raise(s->stmt); } return obj; }
close()
click to toggle source
close()
static VALUE stmt_close(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); mysql_stmt_close(s->stmt); s->closed = Qtrue; return Qnil; }
data_seek(p1)
click to toggle source
#data_seek(offset)
static VALUE stmt_data_seek(VALUE obj, VALUE offset) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); mysql_stmt_data_seek(s->stmt, NUM2INT(offset)); return obj; }
each()
click to toggle source
each {…}
static VALUE stmt_each(VALUE obj) { VALUE row; check_stmt_closed(obj); while ((row = stmt_fetch(obj)) != Qnil) rb_yield(row); return obj; }
execute(*args)
click to toggle source
execute(arg,…)
static VALUE stmt_execute(int argc, VALUE *argv, VALUE obj) { struct mysql_stmt *s = DATA_PTR(obj); MYSQL_STMT *stmt = s->stmt; int i; check_stmt_closed(obj); free_execute_memory(s); if (s->param.n != argc) rb_raise(eMysql, "execute: param_count(%d) != number of argument(%d)", s->param.n, argc); if (argc > 0) { memset(s->param.bind, 0, sizeof(*(s->param.bind))*argc); for (i = 0; i < argc; i++) { switch (TYPE(argv[i])) { case T_NIL: s->param.bind[i].buffer_type = MYSQL_TYPE_NULL; break; case T_FIXNUM: #if SIZEOF_INT < SIZEOF_LONG s->param.bind[i].buffer_type = MYSQL_TYPE_LONGLONG; s->param.bind[i].buffer = &(s->param.buffer[i]); *(LONG_LONG*)(s->param.bind[i].buffer) = FIX2LONG(argv[i]); #else s->param.bind[i].buffer_type = MYSQL_TYPE_LONG; s->param.bind[i].buffer = &(s->param.buffer[i]); *(int*)(s->param.bind[i].buffer) = FIX2INT(argv[i]); #endif break; case T_BIGNUM: s->param.bind[i].buffer_type = MYSQL_TYPE_LONGLONG; s->param.bind[i].buffer = &(s->param.buffer[i]); *(LONG_LONG*)(s->param.bind[i].buffer) = rb_big2ll(argv[i]); break; case T_FLOAT: s->param.bind[i].buffer_type = MYSQL_TYPE_DOUBLE; s->param.bind[i].buffer = &(s->param.buffer[i]); *(double*)(s->param.bind[i].buffer) = NUM2DBL(argv[i]); break; case T_STRING: s->param.bind[i].buffer_type = MYSQL_TYPE_STRING; s->param.bind[i].buffer = RSTRING_PTR(argv[i]); s->param.bind[i].buffer_length = RSTRING_LEN(argv[i]); s->param.length[i] = RSTRING_LEN(argv[i]); s->param.bind[i].length = &(s->param.length[i]); break; default: if (CLASS_OF(argv[i]) == rb_cTime) { MYSQL_TIME t; VALUE a = rb_funcall(argv[i], rb_intern("to_a"), 0); s->param.bind[i].buffer_type = MYSQL_TYPE_DATETIME; s->param.bind[i].buffer = &(s->param.buffer[i]); memset(&t, 0, sizeof(t)); /* avoid warning */ t.second_part = 0; t.neg = 0; t.second = FIX2INT(RARRAY_PTR(a)[0]); t.minute = FIX2INT(RARRAY_PTR(a)[1]); t.hour = FIX2INT(RARRAY_PTR(a)[2]); t.day = FIX2INT(RARRAY_PTR(a)[3]); t.month = FIX2INT(RARRAY_PTR(a)[4]); t.year = FIX2INT(RARRAY_PTR(a)[5]); t.time_type = MYSQL_TYPE_DATETIME; *(MYSQL_TIME*)&(s->param.buffer[i]) = t; } else if (CLASS_OF(argv[i]) == cMysqlTime) { MYSQL_TIME t; s->param.bind[i].buffer_type = MYSQL_TYPE_DATETIME; s->param.bind[i].buffer = &(s->param.buffer[i]); memset(&t, 0, sizeof(t)); /* avoid warning */ t.second_part = 0; t.neg = 0; t.second = NUM2INT(rb_iv_get(argv[i], "second")); t.minute = NUM2INT(rb_iv_get(argv[i], "minute")); t.hour = NUM2INT(rb_iv_get(argv[i], "hour")); t.day = NUM2INT(rb_iv_get(argv[i], "day")); t.month = NUM2INT(rb_iv_get(argv[i], "month")); t.year = NUM2INT(rb_iv_get(argv[i], "year")); t.time_type = MYSQL_TYPE_DATETIME; *(MYSQL_TIME*)&(s->param.buffer[i]) = t; } else rb_raise(rb_eTypeError, "unsupported type: %d", TYPE(argv[i])); } } if (mysql_stmt_bind_param(stmt, s->param.bind)) mysql_stmt_raise(stmt); } if (mysql_stmt_execute(stmt)) mysql_stmt_raise(stmt); if (s->res) { MYSQL_FIELD *field; if (mysql_stmt_store_result(stmt)) mysql_stmt_raise(stmt); field = mysql_fetch_fields(s->res); for (i = 0; i < s->result.n; i++) { switch(s->result.bind[i].buffer_type) { case MYSQL_TYPE_NULL: 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: s->result.bind[i].buffer = xmalloc(8); s->result.bind[i].buffer_length = 8; memset(s->result.bind[i].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: #if MYSQL_VERSION_ID >= 50003 case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_BIT: #endif s->result.bind[i].buffer = xmalloc(field[i].max_length); memset(s->result.bind[i].buffer, 0, field[i].max_length); s->result.bind[i].buffer_length = field[i].max_length; break; case MYSQL_TYPE_TIME: case MYSQL_TYPE_DATE: case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_TIMESTAMP: s->result.bind[i].buffer = xmalloc(sizeof(MYSQL_TIME)); s->result.bind[i].buffer_length = sizeof(MYSQL_TIME); memset(s->result.bind[i].buffer, 0, sizeof(MYSQL_TIME)); break; default: rb_raise(rb_eTypeError, "unknown buffer_type: %d", s->result.bind[i].buffer_type); } } if (mysql_stmt_bind_result(s->stmt, s->result.bind)) mysql_stmt_raise(s->stmt); } return obj; }
fetch()
click to toggle source
fetch()
static VALUE stmt_fetch(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); VALUE ret; int i; int r; check_stmt_closed(obj); r = mysql_stmt_fetch(s->stmt); if (r == MYSQL_NO_DATA) return Qnil; #ifdef MYSQL_DATA_TRUNCATED if (r == MYSQL_DATA_TRUNCATED) rb_raise(rb_eRuntimeError, "unexpectedly data truncated"); #endif if (r == 1) mysql_stmt_raise(s->stmt); ret = rb_ary_new2(s->result.n); for (i = 0; i < s->result.n; i++) { if (s->result.is_null[i]) rb_ary_push(ret, Qnil); else { VALUE v; MYSQL_TIME *t; switch (s->result.bind[i].buffer_type) { case MYSQL_TYPE_TINY: if (s->result.bind[i].is_unsigned) v = UINT2NUM(*(unsigned char *)s->result.bind[i].buffer); else v = INT2NUM(*(signed char *)s->result.bind[i].buffer); break; case MYSQL_TYPE_SHORT: case MYSQL_TYPE_YEAR: if (s->result.bind[i].is_unsigned) v = UINT2NUM(*(unsigned short *)s->result.bind[i].buffer); else v = INT2NUM(*(short *)s->result.bind[i].buffer); break; case MYSQL_TYPE_INT24: case MYSQL_TYPE_LONG: if (s->result.bind[i].is_unsigned) v = UINT2NUM(*(unsigned int *)s->result.bind[i].buffer); else v = INT2NUM(*(int *)s->result.bind[i].buffer); break; case MYSQL_TYPE_LONGLONG: if (s->result.bind[i].is_unsigned) v = ULL2NUM(*(unsigned long long *)s->result.bind[i].buffer); else v = LL2NUM(*(long long *)s->result.bind[i].buffer); break; case MYSQL_TYPE_FLOAT: v = rb_float_new((double)(*(float *)s->result.bind[i].buffer)); break; case MYSQL_TYPE_DOUBLE: v = rb_float_new(*(double *)s->result.bind[i].buffer); break; case MYSQL_TYPE_TIME: case MYSQL_TYPE_DATE: case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_TIMESTAMP: t = (MYSQL_TIME *)s->result.bind[i].buffer; v = rb_obj_alloc(cMysqlTime); rb_funcall(v, rb_intern("initialize"), 8, INT2FIX(t->year), INT2FIX(t->month), INT2FIX(t->day), INT2FIX(t->hour), INT2FIX(t->minute), INT2FIX(t->second), (t->neg ? Qtrue : Qfalse), INT2FIX(t->second_part)); 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: #if MYSQL_VERSION_ID >= 50003 case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_BIT: #endif v = rb_enc_tainted_str_new(s->result.bind[i].buffer, s->result.length[i]); break; default: rb_raise(rb_eTypeError, "unknown buffer_type: %d", s->result.bind[i].buffer_type); } rb_ary_push(ret, v); } } return ret; }
field_count()
click to toggle source
static VALUE stmt_field_count(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); unsigned int n; check_stmt_closed(obj); n = mysql_stmt_field_count(s->stmt); return INT2NUM(n); }
free_result()
click to toggle source
static VALUE stmt_free_result(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); if (mysql_stmt_free_result(s->stmt)) mysql_stmt_raise(s->stmt); return obj; }
insert_id()
click to toggle source
static VALUE stmt_insert_id(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); my_ulonglong n; check_stmt_closed(obj); n = mysql_stmt_insert_id(s->stmt); return ULL2NUM(n); }
num_rows()
click to toggle source
static VALUE stmt_num_rows(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); my_ulonglong n; check_stmt_closed(obj); n = mysql_stmt_num_rows(s->stmt); return INT2NUM(n); }
param_count()
click to toggle source
static VALUE stmt_param_count(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); unsigned long n; check_stmt_closed(obj); n = mysql_stmt_param_count(s->stmt); return INT2NUM(n); }
prepare(p1)
click to toggle source
prepare(query)
static VALUE stmt_prepare(VALUE obj, VALUE query) { struct mysql_stmt* s = DATA_PTR(obj); int n; int i; MYSQL_FIELD *field; free_mysqlstmt_memory(s); check_stmt_closed(obj); Check_Type(query, T_STRING); if (mysql_stmt_prepare(s->stmt, RSTRING_PTR(query), RSTRING_LEN(query))) mysql_stmt_raise(s->stmt); n = mysql_stmt_param_count(s->stmt); s->param.n = n; s->param.bind = xmalloc(sizeof(s->param.bind[0]) * n); s->param.length = xmalloc(sizeof(s->param.length[0]) * n); s->param.buffer = xmalloc(sizeof(s->param.buffer[0]) * n); s->res = mysql_stmt_result_metadata(s->stmt); if (s->res) { n = s->result.n = mysql_num_fields(s->res); s->result.bind = xmalloc(sizeof(s->result.bind[0]) * n); s->result.is_null = xmalloc(sizeof(s->result.is_null[0]) * n); s->result.length = xmalloc(sizeof(s->result.length[0]) * n); field = mysql_fetch_fields(s->res); memset(s->result.bind, 0, sizeof(s->result.bind[0]) * n); for (i = 0; i < n; i++) { s->result.bind[i].buffer_type = field[i].type; #if MYSQL_VERSION_ID < 50003 if (field[i].type == MYSQL_TYPE_DECIMAL) s->result.bind[i].buffer_type = MYSQL_TYPE_STRING; #endif s->result.bind[i].is_null = &(s->result.is_null[i]); s->result.bind[i].length = &(s->result.length[i]); s->result.bind[i].is_unsigned = ((field[i].flags & UNSIGNED_FLAG) != 0); } } else { if (mysql_stmt_errno(s->stmt)) mysql_stmt_raise(s->stmt); } return obj; }
reset()
click to toggle source
reset()
static VALUE stmt_reset(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); check_stmt_closed(obj); if (mysql_stmt_reset(s->stmt)) mysql_stmt_raise(s->stmt); return obj; }
result_metadata()
click to toggle source
static VALUE stmt_result_metadata(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); MYSQL_RES *res; check_stmt_closed(obj); res = mysql_stmt_result_metadata(s->stmt); if (res == NULL) { if (mysql_stmt_errno(s->stmt) != 0) mysql_stmt_raise(s->stmt); return Qnil; } return mysqlres2obj(res); }
row_seek(p1)
click to toggle source
#row_seek(offset)
static VALUE stmt_row_seek(VALUE obj, VALUE offset) { struct mysql_stmt* s = DATA_PTR(obj); MYSQL_ROW_OFFSET prev_offset; if (CLASS_OF(offset) != cMysqlRowOffset) rb_raise(rb_eTypeError, "wrong argument type %s (expected Mysql::RowOffset)", rb_obj_classname(offset)); check_stmt_closed(obj); prev_offset = mysql_stmt_row_seek(s->stmt, DATA_PTR(offset)); return Data_Wrap_Struct(cMysqlRowOffset, 0, NULL, prev_offset); }
row_tell()
click to toggle source
static VALUE stmt_row_tell(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); MYSQL_ROW_OFFSET offset; check_stmt_closed(obj); offset = mysql_stmt_row_tell(s->stmt); return Data_Wrap_Struct(cMysqlRowOffset, 0, NULL, offset); }
send_long_data(p1, p2)
click to toggle source
#send_long_data(col, data)
static VALUE stmt_send_long_data(VALUE obj, VALUE col, VALUE data) { struct mysql_stmt* s = DATA_PTR(obj); int c; check_stmt_closed(obj); c = NUM2INT(col); if (0 <= c && c < s->param.n) { s->param.bind[c].buffer_type = MYSQL_TYPE_STRING; if (mysql_stmt_bind_param(s->stmt, s->param.bind)) mysql_stmt_raise(s->stmt); } if (mysql_stmt_send_long_data(s->stmt, c, RSTRING_PTR(data), RSTRING_LEN(data))) mysql_stmt_raise(s->stmt); return obj; }
sqlstate()
click to toggle source
sqlstate()
static VALUE stmt_sqlstate(VALUE obj) { struct mysql_stmt* s = DATA_PTR(obj); return rb_enc_tainted_str_new2(mysql_stmt_sqlstate(s->stmt)); }