static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) { VALUE query; MYSQL_RES *response = 0; my_ulonglong affected_rows; my_ulonglong insert_id; VALUE connection = rb_iv_get(self, "@connection"); VALUE mysql_connection = rb_iv_get(connection, "@connection"); if (Qnil == mysql_connection) { rb_raise(eConnectionError, "This connection has already been closed."); } MYSQL *db = DATA_PTR(mysql_connection); query = build_query_from_args(self, argc, argv); response = cCommand_execute(self, connection, db, query); affected_rows = mysql_affected_rows(db); insert_id = mysql_insert_id(db); mysql_free_result(response); if ((my_ulonglong)-1 == affected_rows) { return Qnil; } return rb_funcall(cResult, ID_NEW, 3, self, INT2NUM(affected_rows), insert_id == 0 ? Qnil : INT2NUM(insert_id)); }
static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) { sqlite3 *db; char *error_message; int status; int affected_rows; int insert_id; VALUE conn_obj; VALUE query; struct timeval start; query = build_query_from_args(self, argc, argv); conn_obj = rb_iv_get(self, "@connection"); Data_Get_Struct(rb_iv_get(conn_obj, "@connection"), sqlite3, db); gettimeofday(&start, NULL); status = sqlite3_exec(db, StringValuePtr(query), 0, 0, &error_message); if ( status != SQLITE_OK ) { rb_raise(eSqlite3Error, "%s\nQuery: %s", sqlite3_errmsg(db), StringValuePtr(query)); } data_objects_debug(query, &start); affected_rows = sqlite3_changes(db); insert_id = sqlite3_last_insert_rowid(db); return rb_funcall(cResult, ID_NEW, 3, self, INT2NUM(affected_rows), INT2NUM(insert_id)); }
static VALUE cCommand_execute_reader(int argc, VALUE *argv[], VALUE self) { VALUE reader, query; VALUE field_names, field_types; int i; int field_count; int infer_types = 0; VALUE connection = rb_iv_get(self, "@connection"); VALUE postgres_connection = rb_iv_get(connection, "@connection"); if (Qnil == postgres_connection) { rb_raise(eConnectionError, "This connection has already been closed."); } PGconn *db = DATA_PTR(postgres_connection); PGresult *response; query = build_query_from_args(self, argc, argv); response = cCommand_execute(self, db, query); if ( PQresultStatus(response) != PGRES_TUPLES_OK ) { raise_error(self, response, query); } field_count = PQnfields(response); reader = rb_funcall(cReader, ID_NEW, 0); rb_iv_set(reader, "@connection", connection); rb_iv_set(reader, "@reader", Data_Wrap_Struct(rb_cObject, 0, 0, response)); rb_iv_set(reader, "@field_count", INT2NUM(field_count)); rb_iv_set(reader, "@row_count", INT2NUM(PQntuples(response))); field_names = rb_ary_new(); field_types = rb_iv_get(self, "@field_types"); if ( field_types == Qnil || 0 == RARRAY_LEN(field_types) ) { field_types = rb_ary_new(); infer_types = 1; } else if (RARRAY_LEN(field_types) != field_count) { // Whoops... wrong number of types passed to set_types. Close the reader and raise // and error rb_funcall(reader, rb_intern("close"), 0); rb_raise(eArgumentError, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count); } for ( i = 0; i < field_count; i++ ) { rb_ary_push(field_names, rb_str_new2(PQfname(response, i))); if ( infer_types == 1 ) { rb_ary_push(field_types, infer_ruby_type(PQftype(response, i))); } } rb_iv_set(reader, "@position", INT2NUM(0)); rb_iv_set(reader, "@fields", field_names); rb_iv_set(reader, "@field_types", field_types); return reader; }
static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) { sqlite3 *db; sqlite3_stmt *sqlite3_reader; int status; int field_count; int i; VALUE reader; VALUE conn_obj; VALUE query; VALUE field_names, field_types; struct timeval start; conn_obj = rb_iv_get(self, "@connection"); Data_Get_Struct(rb_iv_get(conn_obj, "@connection"), sqlite3, db); query = build_query_from_args(self, argc, argv); gettimeofday(&start, NULL); status = sqlite3_prepare_v2(db, StringValuePtr(query), -1, &sqlite3_reader, 0); data_objects_debug(query, &start); if ( status != SQLITE_OK ) { rb_raise(eSqlite3Error, "%s\nQuery: %s", sqlite3_errmsg(db), StringValuePtr(query)); } field_count = sqlite3_column_count(sqlite3_reader); reader = rb_funcall(cReader, ID_NEW, 0); rb_iv_set(reader, "@reader", Data_Wrap_Struct(rb_cObject, 0, 0, sqlite3_reader)); rb_iv_set(reader, "@field_count", INT2NUM(field_count)); field_names = rb_ary_new(); field_types = rb_iv_get(self, "@field_types"); // if ( field_types == Qnil ) { // field_types = rb_ary_new(); // } if ( field_types == Qnil || 0 == RARRAY_LEN(field_types) ) { field_types = rb_ary_new(); } else if (RARRAY_LEN(field_types) != field_count) { // Whoops... wrong number of types passed to set_types. Close the reader and raise // and error rb_funcall(reader, rb_intern("close"), 0); rb_raise(eSqlite3Error, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count); } for ( i = 0; i < field_count; i++ ) { rb_ary_push(field_names, rb_str_new2((char *)sqlite3_column_name(sqlite3_reader, i))); } rb_iv_set(reader, "@fields", field_names); rb_iv_set(reader, "@field_types", field_types); return reader; }
static VALUE cCommand_execute_non_query(int argc, VALUE *argv[], VALUE self) { VALUE connection = rb_iv_get(self, "@connection"); VALUE postgres_connection = rb_iv_get(connection, "@connection"); if (Qnil == postgres_connection) { rb_raise(eConnectionError, "This connection has already been closed."); } PGconn *db = DATA_PTR(postgres_connection); PGresult *response; int status; VALUE affected_rows = Qnil; VALUE insert_id = Qnil; VALUE query = build_query_from_args(self, argc, argv); response = cCommand_execute(self, db, query); status = PQresultStatus(response); if ( status == PGRES_TUPLES_OK ) { insert_id = INT2NUM(atoi(PQgetvalue(response, 0, 0))); affected_rows = INT2NUM(atoi(PQcmdTuples(response))); } else if ( status == PGRES_COMMAND_OK ) { insert_id = Qnil; affected_rows = INT2NUM(atoi(PQcmdTuples(response))); } else { raise_error(self, response, query); } PQclear(response); return rb_funcall(cResult, ID_NEW, 3, self, affected_rows, insert_id); }
static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) { VALUE query, reader; VALUE field_names, field_types; unsigned int field_count; unsigned int i; char guess_default_field_types = 0; VALUE connection = rb_iv_get(self, "@connection"); VALUE mysql_connection = rb_iv_get(connection, "@connection"); if (Qnil == mysql_connection) { rb_raise(eConnectionError, "This connection has already been closed."); } MYSQL *db = DATA_PTR(mysql_connection); MYSQL_RES *response = 0; MYSQL_FIELD *field; query = build_query_from_args(self, argc, argv); response = cCommand_execute(self, connection, db, query); if (!response) { return Qnil; } field_count = mysql_field_count(db); reader = rb_funcall(cReader, ID_NEW, 0); rb_iv_set(reader, "@connection", connection); rb_iv_set(reader, "@reader", Data_Wrap_Struct(rb_cObject, 0, 0, response)); rb_iv_set(reader, "@opened", Qfalse); rb_iv_set(reader, "@field_count", INT2NUM(field_count)); field_names = rb_ary_new(); field_types = rb_iv_get(self, "@field_types"); if ( field_types == Qnil || 0 == RARRAY_LEN(field_types) ) { field_types = rb_ary_new(); guess_default_field_types = 1; } else if (RARRAY_LEN(field_types) != field_count) { // Whoops... wrong number of types passed to set_types. Close the reader and raise // and error rb_funcall(reader, rb_intern("close"), 0); rb_raise(rb_eArgError, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count); } for(i = 0; i < field_count; i++) { field = mysql_fetch_field_direct(response, i); rb_ary_push(field_names, rb_str_new2(field->name)); if (1 == guess_default_field_types) { rb_ary_push(field_types, infer_ruby_type(field)); } } rb_iv_set(reader, "@fields", field_names); rb_iv_set(reader, "@field_types", field_types); if (rb_block_given_p()) { rb_yield(reader); rb_funcall(reader, rb_intern("close"), 0); } return reader; }