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

- old
+ new

@@ -14,10 +14,11 @@ 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 VALUE duckdb_result_columns(VALUE oDuckDBResult); static void deallocate(void *ctx) { rubyDuckDBResult *p = (rubyDuckDBResult *)ctx; duckdb_destroy_result(&(p->result)); @@ -63,15 +64,11 @@ VALUE str; duckdb_blob bval = duckdb_value_blob(result, col_idx, row_idx); str = rb_str_new(bval.data, bval.size); if (bval.data) { -#ifdef HAVE_DUCKDB_FREE duckdb_free(bval.data); -#else - free(bval.data); -#endif } return str; } @@ -98,15 +95,11 @@ return to_ruby_obj_string_from_blob(result, col_idx, row_idx); 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 (duckdb_column_type(result, col_idx) == DUCKDB_TYPE_HUGEINT) { obj = rb_funcall(obj, rb_intern("to_i"), 0); } } } @@ -172,16 +165,39 @@ rubyDuckDBResult *ctx; Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx); return LL2NUM(duckdb_rows_changed(&(ctx->result))); } +/* + * call-seq: + * result.columns -> DuckDB::Column[] + * + * Returns the column class Lists. + * + */ +static VALUE duckdb_result_columns(VALUE oDuckDBResult) { + rubyDuckDBResult *ctx; + Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx); + + idx_t 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++) { + VALUE column = create_column(oDuckDBResult, col_idx); + rb_ary_store(ary, col_idx, column); + } + return ary; +} + VALUE create_result(void) { return allocate(cDuckDBResult); } void init_duckdb_result(void) { cDuckDBResult = rb_define_class_under(mDuckDB, "Result", rb_cObject); rb_define_alloc_func(cDuckDBResult, allocate); rb_define_method(cDuckDBResult, "each", duckdb_result_each, 0); rb_define_method(cDuckDBResult, "rows_changed", duckdb_result_rows_changed, 0); + rb_define_method(cDuckDBResult, "columns", duckdb_result_columns, 0); }