Sha256: e0842f84f9a71d50e4dd90408e2b75ecb963f06614b621f8b4decb7b0d27fbfe

Contents?: true

Size: 1.37 KB

Versions: 4

Compression:

Stored size: 1.37 KB

Contents

#include "ruby-duckdb.h"

static VALUE cDuckDBResult;

static void deallocate(void *ctx)
{
    rubyDuckDBResult *p = (rubyDuckDBResult *)ctx;

    duckdb_destroy_result(&(p->result));
    xfree(p);
}

static VALUE allocate(VALUE klass)
{
    rubyDuckDBResult *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBResult));
    return Data_Wrap_Struct(klass, NULL, deallocate, ctx);
}

static VALUE row_array(rubyDuckDBResult *ctx, size_t row_idx) {
    size_t col_idx;
    VALUE ary = rb_ary_new2(ctx->result.column_count);
    for(col_idx = 0; col_idx < ctx->result.column_count; col_idx++) {
        char *p = duckdb_value_varchar(&(ctx->result), col_idx, row_idx);
        rb_ary_store(ary, col_idx, rb_str_new2(p));

        free(p);
    }
    return ary;
}

static VALUE duckdb_result_each(VALUE oDuckDBResult) {
    rubyDuckDBResult *ctx;
    size_t row_idx = 0;

    // RETURN_ENUMERATOR(oDuckDBResult, 0, 0);

    Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx);
    for (row_idx = 0; row_idx < ctx->result.row_count; row_idx++) {
        rb_yield(row_array(ctx, row_idx));
    }
    return oDuckDBResult;
}

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

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
duckdb-0.0.4 ext/duckdb/result.c
duckdb-0.0.3 ext/duckdb/result.c
duckdb-0.0.2 ext/duckdb/result.c
duckdb-0.0.1 ext/duckdb/result.c