|
| 1 | +#include "ruby-duckdb.h" |
| 2 | + |
| 3 | +VALUE cDuckDBDataChunk; |
| 4 | +extern VALUE cDuckDBVector; |
| 5 | + |
| 6 | +static void deallocate(void *ctx); |
| 7 | +static VALUE allocate(VALUE klass); |
| 8 | +static size_t memsize(const void *p); |
| 9 | +static VALUE rbduckdb_data_chunk_column_count(VALUE self); |
| 10 | +static VALUE rbduckdb_data_chunk_get_size(VALUE self); |
| 11 | +static VALUE rbduckdb_data_chunk_set_size(VALUE self, VALUE size); |
| 12 | +static VALUE rbduckdb_data_chunk_get_vector(VALUE self, VALUE col_idx); |
| 13 | + |
| 14 | +static const rb_data_type_t data_chunk_data_type = { |
| 15 | + "DuckDB/DataChunk", |
| 16 | + {NULL, deallocate, memsize,}, |
| 17 | + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY |
| 18 | +}; |
| 19 | + |
| 20 | +static void deallocate(void *ctx) { |
| 21 | + rubyDuckDBDataChunk *p = (rubyDuckDBDataChunk *)ctx; |
| 22 | + xfree(p); |
| 23 | +} |
| 24 | + |
| 25 | +static VALUE allocate(VALUE klass) { |
| 26 | + rubyDuckDBDataChunk *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBDataChunk)); |
| 27 | + return TypedData_Wrap_Struct(klass, &data_chunk_data_type, ctx); |
| 28 | +} |
| 29 | + |
| 30 | +static size_t memsize(const void *p) { |
| 31 | + return sizeof(rubyDuckDBDataChunk); |
| 32 | +} |
| 33 | + |
| 34 | +rubyDuckDBDataChunk *get_struct_data_chunk(VALUE obj) { |
| 35 | + rubyDuckDBDataChunk *ctx; |
| 36 | + TypedData_Get_Struct(obj, rubyDuckDBDataChunk, &data_chunk_data_type, ctx); |
| 37 | + return ctx; |
| 38 | +} |
| 39 | + |
| 40 | +/* |
| 41 | + * call-seq: |
| 42 | + * data_chunk.column_count -> Integer |
| 43 | + * |
| 44 | + * Returns the number of columns in the data chunk. |
| 45 | + * |
| 46 | + * data_chunk.column_count # => 2 |
| 47 | + */ |
| 48 | +static VALUE rbduckdb_data_chunk_column_count(VALUE self) { |
| 49 | + rubyDuckDBDataChunk *ctx; |
| 50 | + idx_t count; |
| 51 | + |
| 52 | + TypedData_Get_Struct(self, rubyDuckDBDataChunk, &data_chunk_data_type, ctx); |
| 53 | + |
| 54 | + count = duckdb_data_chunk_get_column_count(ctx->data_chunk); |
| 55 | + |
| 56 | + return ULL2NUM(count); |
| 57 | +} |
| 58 | + |
| 59 | +/* |
| 60 | + * call-seq: |
| 61 | + * data_chunk.size -> Integer |
| 62 | + * |
| 63 | + * Returns the current number of tuples in the data chunk. |
| 64 | + * |
| 65 | + * data_chunk.size # => 100 |
| 66 | + */ |
| 67 | +static VALUE rbduckdb_data_chunk_get_size(VALUE self) { |
| 68 | + rubyDuckDBDataChunk *ctx; |
| 69 | + idx_t size; |
| 70 | + |
| 71 | + TypedData_Get_Struct(self, rubyDuckDBDataChunk, &data_chunk_data_type, ctx); |
| 72 | + |
| 73 | + size = duckdb_data_chunk_get_size(ctx->data_chunk); |
| 74 | + |
| 75 | + return ULL2NUM(size); |
| 76 | +} |
| 77 | + |
| 78 | +/* |
| 79 | + * call-seq: |
| 80 | + * data_chunk.size = size -> size |
| 81 | + * |
| 82 | + * Sets the number of tuples in the data chunk. |
| 83 | + * |
| 84 | + * data_chunk.size = 50 |
| 85 | + */ |
| 86 | +static VALUE rbduckdb_data_chunk_set_size(VALUE self, VALUE size) { |
| 87 | + rubyDuckDBDataChunk *ctx; |
| 88 | + idx_t sz; |
| 89 | + |
| 90 | + TypedData_Get_Struct(self, rubyDuckDBDataChunk, &data_chunk_data_type, ctx); |
| 91 | + |
| 92 | + sz = NUM2ULL(size); |
| 93 | + duckdb_data_chunk_set_size(ctx->data_chunk, sz); |
| 94 | + |
| 95 | + return size; |
| 96 | +} |
| 97 | + |
| 98 | +/* |
| 99 | + * call-seq: |
| 100 | + * data_chunk.get_vector(col_idx) -> DuckDB::Vector |
| 101 | + * |
| 102 | + * Gets the vector at the specified column index. |
| 103 | + * |
| 104 | + * vector = data_chunk.get_vector(0) |
| 105 | + */ |
| 106 | +static VALUE rbduckdb_data_chunk_get_vector(VALUE self, VALUE col_idx) { |
| 107 | + rubyDuckDBDataChunk *ctx; |
| 108 | + idx_t idx; |
| 109 | + duckdb_vector vector; |
| 110 | + VALUE vector_obj; |
| 111 | + rubyDuckDBVector *vector_ctx; |
| 112 | + |
| 113 | + TypedData_Get_Struct(self, rubyDuckDBDataChunk, &data_chunk_data_type, ctx); |
| 114 | + |
| 115 | + idx = NUM2ULL(col_idx); |
| 116 | + vector = duckdb_data_chunk_get_vector(ctx->data_chunk, idx); |
| 117 | + |
| 118 | + // Create Vector wrapper |
| 119 | + vector_obj = rb_class_new_instance(0, NULL, cDuckDBVector); |
| 120 | + vector_ctx = get_struct_vector(vector_obj); |
| 121 | + vector_ctx->vector = vector; |
| 122 | + |
| 123 | + return vector_obj; |
| 124 | +} |
| 125 | + |
| 126 | +void rbduckdb_init_duckdb_data_chunk(void) { |
| 127 | +#if 0 |
| 128 | + VALUE mDuckDB = rb_define_module("DuckDB"); |
| 129 | +#endif |
| 130 | + cDuckDBDataChunk = rb_define_class_under(mDuckDB, "DataChunk", rb_cObject); |
| 131 | + rb_define_alloc_func(cDuckDBDataChunk, allocate); |
| 132 | + |
| 133 | + rb_define_method(cDuckDBDataChunk, "column_count", rbduckdb_data_chunk_column_count, 0); |
| 134 | + rb_define_method(cDuckDBDataChunk, "size", rbduckdb_data_chunk_get_size, 0); |
| 135 | + rb_define_method(cDuckDBDataChunk, "size=", rbduckdb_data_chunk_set_size, 1); |
| 136 | + rb_define_method(cDuckDBDataChunk, "get_vector", rbduckdb_data_chunk_get_vector, 1); |
| 137 | +} |
0 commit comments