ext/duckdb/result.c in duckdb-0.3.1.0 vs ext/duckdb/result.c in duckdb-0.3.2.0

- old
+ new

@@ -1,9 +1,24 @@ #include "ruby-duckdb.h" static VALUE cDuckDBResult; +static void deallocate(void *ctx); +static VALUE allocate(VALUE klass); +static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj_string_from_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE to_ruby_obj(duckdb_result *result, idx_t col_idx, idx_t row_idx); +static VALUE row_array(rubyDuckDBResult *ctx, idx_t row_idx); +static VALUE duckdb_result_row_size(VALUE oDuckDBResult, VALUE args, VALUE obj); +static VALUE duckdb_result_each(VALUE oDuckDBResult); +static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult); + static void deallocate(void *ctx) { rubyDuckDBResult *p = (rubyDuckDBResult *)ctx; duckdb_destroy_result(&(p->result)); xfree(p); @@ -42,11 +57,10 @@ static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx) { double dval = duckdb_value_double(result, col_idx, row_idx); return DBL2NUM(dval); } -#ifdef HAVE_DUCKDB_VALUE_BLOB static VALUE to_ruby_obj_string_from_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx) { VALUE str; duckdb_blob bval = duckdb_value_blob(result, col_idx, row_idx); str = rb_str_new(bval.data, bval.size); @@ -58,19 +72,18 @@ #endif } return str; } -#endif /* HAVE_DUCKDB_VALUE_BLOB */ static VALUE to_ruby_obj(duckdb_result *result, idx_t col_idx, idx_t row_idx) { char *p; VALUE obj = Qnil; - if (result->columns[col_idx].nullmask[row_idx]) { + if (duckdb_value_is_null(result, col_idx, row_idx)) { return obj; } - switch(result->columns[col_idx].type) { + switch(duckdb_column_type(result, col_idx)) { case DUCKDB_TYPE_BOOLEAN: return to_ruby_obj_boolean(result, col_idx, row_idx); case DUCKDB_TYPE_SMALLINT: return to_ruby_obj_smallint(result, col_idx, row_idx); case DUCKDB_TYPE_INTEGER: @@ -79,55 +92,57 @@ return to_ruby_obj_bigint(result, col_idx, row_idx); case DUCKDB_TYPE_FLOAT: return to_ruby_obj_float(result, col_idx, row_idx); case DUCKDB_TYPE_DOUBLE: return to_ruby_obj_double(result, col_idx, row_idx); -#ifdef HAVE_DUCKDB_VALUE_BLOB case DUCKDB_TYPE_BLOB: return to_ruby_obj_string_from_blob(result, col_idx, row_idx); -#endif /* HAVE_DUCKDB_VALUE_BLOB */ default: p = duckdb_value_varchar(result, col_idx, row_idx); if (p) { obj = rb_str_new2(p); #ifdef HAVE_DUCKDB_FREE duckdb_free(p); #else free(p); #endif /* HAVE_DUCKDB_FREE */ - if (result->columns[col_idx].type == DUCKDB_TYPE_HUGEINT) { + if (duckdb_column_type(result, col_idx) == DUCKDB_TYPE_HUGEINT) { obj = rb_funcall(obj, rb_intern("to_i"), 0); } } } return obj; } static VALUE row_array(rubyDuckDBResult *ctx, idx_t row_idx) { idx_t col_idx; - VALUE ary = rb_ary_new2(ctx->result.column_count); - for(col_idx = 0; col_idx < ctx->result.column_count; col_idx++) { + idx_t column_count = duckdb_column_count(&(ctx->result)); + + VALUE ary = rb_ary_new2(column_count); + for(col_idx = 0; col_idx < column_count; col_idx++) { rb_ary_store(ary, col_idx, to_ruby_obj(&(ctx->result), col_idx, row_idx)); } return ary; } static VALUE duckdb_result_row_size(VALUE oDuckDBResult, VALUE args, VALUE obj) { rubyDuckDBResult *ctx; Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx); - return LONG2FIX(ctx->result.row_count); + return LONG2FIX(duckdb_row_count(&(ctx->result))); } static VALUE duckdb_result_each(VALUE oDuckDBResult) { rubyDuckDBResult *ctx; idx_t row_idx = 0; + idx_t row_count = 0; RETURN_SIZED_ENUMERATOR(oDuckDBResult, 0, 0, duckdb_result_row_size); Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx); - for (row_idx = 0; row_idx < ctx->result.row_count; row_idx++) { + row_count = duckdb_row_count(&(ctx->result)); + for (row_idx = 0; row_idx < row_count; row_idx++) { rb_yield(row_array(ctx, row_idx)); } return oDuckDBResult; } @@ -154,10 +169,10 @@ * */ static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult) { rubyDuckDBResult *ctx; Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx); - return LL2NUM(ctx->result.rows_changed); + return LL2NUM(duckdb_rows_changed(&(ctx->result))); } VALUE create_result(void) { return allocate(cDuckDBResult); }