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);
}