duckdb 0.3.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test_on_macos.yml +10 -3
- data/.github/workflows/test_on_ubuntu.yml +10 -4
- data/.github/workflows/test_on_windows.yml +10 -3
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +4 -4
- data/README.md +9 -9
- data/duckdb.gemspec +1 -1
- data/ext/duckdb/appender.c +38 -37
- data/ext/duckdb/column.c +30 -13
- data/ext/duckdb/config.c +21 -9
- data/ext/duckdb/config.h +2 -6
- data/ext/duckdb/connection.c +25 -8
- data/ext/duckdb/connection.h +1 -0
- data/ext/duckdb/database.c +22 -9
- data/ext/duckdb/database.h +1 -0
- data/ext/duckdb/duckdb.c +0 -5
- data/ext/duckdb/extconf.rb +1 -6
- data/ext/duckdb/prepared_statement.c +39 -25
- data/ext/duckdb/result.c +238 -77
- data/ext/duckdb/result.h +1 -0
- data/ext/duckdb/ruby-duckdb.h +0 -5
- data/ext/duckdb/util.c +0 -3
- data/ext/duckdb/util.h +0 -4
- data/lib/duckdb/result.rb +50 -0
- data/lib/duckdb/version.rb +1 -1
- metadata +5 -5
data/ext/duckdb/result.c
CHANGED
@@ -4,19 +4,39 @@ static VALUE cDuckDBResult;
|
|
4
4
|
|
5
5
|
static void deallocate(void *ctx);
|
6
6
|
static VALUE allocate(VALUE klass);
|
7
|
+
static size_t memsize(const void *p);
|
7
8
|
static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
8
9
|
static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
10
|
+
static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
9
11
|
static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
10
12
|
static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
11
13
|
static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
12
14
|
static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
13
|
-
static VALUE
|
14
|
-
static VALUE
|
15
|
-
static VALUE
|
16
|
-
static VALUE duckdb_result_row_size(VALUE oDuckDBResult, VALUE args, VALUE obj);
|
17
|
-
static VALUE duckdb_result_each(VALUE oDuckDBResult);
|
15
|
+
static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
16
|
+
static VALUE duckdb_result_column_count(VALUE oDuckDBResult);
|
17
|
+
static VALUE duckdb_result_row_count(VALUE oDuckDBResult);
|
18
18
|
static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult);
|
19
19
|
static VALUE duckdb_result_columns(VALUE oDuckDBResult);
|
20
|
+
static VALUE duckdb_result__column_type(VALUE oDuckDBResult, VALUE col_idx);
|
21
|
+
static VALUE duckdb_result__is_null(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
22
|
+
static VALUE duckdb_result__to_boolean(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
23
|
+
static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
24
|
+
static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
25
|
+
static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
26
|
+
static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
27
|
+
static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
28
|
+
static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
29
|
+
static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
30
|
+
static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
31
|
+
static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx);
|
32
|
+
static VALUE duckdb_result__enum_dictionary_size(VALUE oDuckDBResult, VALUE col_idx);
|
33
|
+
static VALUE duckdb_result__enum_dictionary_value(VALUE oDuckDBResult, VALUE col_idx, VALUE idx);
|
34
|
+
|
35
|
+
static const rb_data_type_t result_data_type = {
|
36
|
+
"DuckDB/Result",
|
37
|
+
{NULL, deallocate, memsize,},
|
38
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
39
|
+
};
|
20
40
|
|
21
41
|
static void deallocate(void *ctx) {
|
22
42
|
rubyDuckDBResult *p = (rubyDuckDBResult *)ctx;
|
@@ -27,7 +47,17 @@ static void deallocate(void *ctx) {
|
|
27
47
|
|
28
48
|
static VALUE allocate(VALUE klass) {
|
29
49
|
rubyDuckDBResult *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBResult));
|
30
|
-
return
|
50
|
+
return TypedData_Wrap_Struct(klass, &result_data_type, ctx);
|
51
|
+
}
|
52
|
+
|
53
|
+
static size_t memsize(const void *p) {
|
54
|
+
return sizeof(rubyDuckDBResult);
|
55
|
+
}
|
56
|
+
|
57
|
+
rubyDuckDBResult *get_struct_result(VALUE obj) {
|
58
|
+
rubyDuckDBResult *ctx;
|
59
|
+
TypedData_Get_Struct(obj, rubyDuckDBResult, &result_data_type, ctx);
|
60
|
+
return ctx;
|
31
61
|
}
|
32
62
|
|
33
63
|
static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
@@ -40,6 +70,11 @@ static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t ro
|
|
40
70
|
return INT2FIX(i16val);
|
41
71
|
}
|
42
72
|
|
73
|
+
static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
74
|
+
uint8_t ui8val = duckdb_value_uint8(result, col_idx, row_idx);
|
75
|
+
return UINT2NUM(ui8val);
|
76
|
+
}
|
77
|
+
|
43
78
|
static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
44
79
|
int32_t i32val = duckdb_value_int32(result, col_idx, row_idx);
|
45
80
|
return INT2NUM(i32val);
|
@@ -60,7 +95,7 @@ static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_
|
|
60
95
|
return DBL2NUM(dval);
|
61
96
|
}
|
62
97
|
|
63
|
-
static VALUE
|
98
|
+
static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
64
99
|
VALUE str;
|
65
100
|
duckdb_blob bval = duckdb_value_blob(result, col_idx, row_idx);
|
66
101
|
str = rb_str_new(bval.data, bval.size);
|
@@ -72,73 +107,6 @@ static VALUE to_ruby_obj_string_from_blob(duckdb_result *result, idx_t col_idx,
|
|
72
107
|
return str;
|
73
108
|
}
|
74
109
|
|
75
|
-
static VALUE to_ruby_obj(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
76
|
-
char *p;
|
77
|
-
VALUE obj = Qnil;
|
78
|
-
if (duckdb_value_is_null(result, col_idx, row_idx)) {
|
79
|
-
return obj;
|
80
|
-
}
|
81
|
-
switch(duckdb_column_type(result, col_idx)) {
|
82
|
-
case DUCKDB_TYPE_BOOLEAN:
|
83
|
-
return to_ruby_obj_boolean(result, col_idx, row_idx);
|
84
|
-
case DUCKDB_TYPE_SMALLINT:
|
85
|
-
return to_ruby_obj_smallint(result, col_idx, row_idx);
|
86
|
-
case DUCKDB_TYPE_INTEGER:
|
87
|
-
return to_ruby_obj_integer(result, col_idx, row_idx);
|
88
|
-
case DUCKDB_TYPE_BIGINT:
|
89
|
-
return to_ruby_obj_bigint(result, col_idx, row_idx);
|
90
|
-
case DUCKDB_TYPE_FLOAT:
|
91
|
-
return to_ruby_obj_float(result, col_idx, row_idx);
|
92
|
-
case DUCKDB_TYPE_DOUBLE:
|
93
|
-
return to_ruby_obj_double(result, col_idx, row_idx);
|
94
|
-
case DUCKDB_TYPE_BLOB:
|
95
|
-
return to_ruby_obj_string_from_blob(result, col_idx, row_idx);
|
96
|
-
default:
|
97
|
-
p = duckdb_value_varchar(result, col_idx, row_idx);
|
98
|
-
if (p) {
|
99
|
-
obj = rb_str_new2(p);
|
100
|
-
duckdb_free(p);
|
101
|
-
if (duckdb_column_type(result, col_idx) == DUCKDB_TYPE_HUGEINT) {
|
102
|
-
obj = rb_funcall(obj, rb_intern("to_i"), 0);
|
103
|
-
}
|
104
|
-
}
|
105
|
-
}
|
106
|
-
return obj;
|
107
|
-
}
|
108
|
-
|
109
|
-
static VALUE row_array(rubyDuckDBResult *ctx, idx_t row_idx) {
|
110
|
-
idx_t col_idx;
|
111
|
-
idx_t column_count = duckdb_column_count(&(ctx->result));
|
112
|
-
|
113
|
-
VALUE ary = rb_ary_new2(column_count);
|
114
|
-
for(col_idx = 0; col_idx < column_count; col_idx++) {
|
115
|
-
rb_ary_store(ary, col_idx, to_ruby_obj(&(ctx->result), col_idx, row_idx));
|
116
|
-
}
|
117
|
-
return ary;
|
118
|
-
}
|
119
|
-
|
120
|
-
static VALUE duckdb_result_row_size(VALUE oDuckDBResult, VALUE args, VALUE obj) {
|
121
|
-
rubyDuckDBResult *ctx;
|
122
|
-
Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx);
|
123
|
-
|
124
|
-
return LONG2FIX(duckdb_row_count(&(ctx->result)));
|
125
|
-
}
|
126
|
-
|
127
|
-
static VALUE duckdb_result_each(VALUE oDuckDBResult) {
|
128
|
-
rubyDuckDBResult *ctx;
|
129
|
-
idx_t row_idx = 0;
|
130
|
-
idx_t row_count = 0;
|
131
|
-
|
132
|
-
RETURN_SIZED_ENUMERATOR(oDuckDBResult, 0, 0, duckdb_result_row_size);
|
133
|
-
|
134
|
-
Data_Get_Struct(oDuckDBResult, rubyDuckDBResult, ctx);
|
135
|
-
row_count = duckdb_row_count(&(ctx->result));
|
136
|
-
for (row_idx = 0; row_idx < row_count; row_idx++) {
|
137
|
-
rb_yield(row_array(ctx, row_idx));
|
138
|
-
}
|
139
|
-
return oDuckDBResult;
|
140
|
-
}
|
141
|
-
|
142
110
|
/*
|
143
111
|
* call-seq:
|
144
112
|
* result.rows_changed -> integer
|
@@ -163,10 +131,58 @@ static VALUE duckdb_result_each(VALUE oDuckDBResult) {
|
|
163
131
|
*/
|
164
132
|
static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult) {
|
165
133
|
rubyDuckDBResult *ctx;
|
166
|
-
|
134
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
167
135
|
return LL2NUM(duckdb_rows_changed(&(ctx->result)));
|
168
136
|
}
|
169
137
|
|
138
|
+
/*
|
139
|
+
* call-seq:
|
140
|
+
* result.column_count -> Integer
|
141
|
+
*
|
142
|
+
* Returns the column size of the result.
|
143
|
+
*
|
144
|
+
* DuckDB::Database.open do |db|
|
145
|
+
* db.connect do |con|
|
146
|
+
* r = con.query('CREATE TABLE t2 (id INT, name VARCHAR(128))')
|
147
|
+
* r = con.query("INSERT INTO t2 VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Catherine')")
|
148
|
+
* r = con.query('SELECT id FROM t2')
|
149
|
+
* r.column_count # => 1
|
150
|
+
* r = con.query('SELECT id, name FROM t2')
|
151
|
+
* r.column_count # => 2
|
152
|
+
* end
|
153
|
+
* end
|
154
|
+
*
|
155
|
+
*/
|
156
|
+
static VALUE duckdb_result_column_count(VALUE oDuckDBResult) {
|
157
|
+
rubyDuckDBResult *ctx;
|
158
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
159
|
+
return LL2NUM(duckdb_column_count(&(ctx->result)));
|
160
|
+
}
|
161
|
+
|
162
|
+
/*
|
163
|
+
* call-seq:
|
164
|
+
* result.row_count -> Integer
|
165
|
+
*
|
166
|
+
* Returns the column size of the result.
|
167
|
+
*
|
168
|
+
* DuckDB::Database.open do |db|
|
169
|
+
* db.connect do |con|
|
170
|
+
* r = con.query('CREATE TABLE t2 (id INT, name VARCHAR(128))')
|
171
|
+
* r = con.query("INSERT INTO t2 VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Catherine')")
|
172
|
+
* r = con.query('SELECT * FROM t2')
|
173
|
+
* r.row_count # => 3
|
174
|
+
* r = con.query('SELECT * FROM t2 where id = 1')
|
175
|
+
* r.row_count # => 1
|
176
|
+
* end
|
177
|
+
* end
|
178
|
+
*
|
179
|
+
*/
|
180
|
+
static VALUE duckdb_result_row_count(VALUE oDuckDBResult) {
|
181
|
+
rubyDuckDBResult *ctx;
|
182
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
183
|
+
return LL2NUM(duckdb_row_count(&(ctx->result)));
|
184
|
+
}
|
185
|
+
|
170
186
|
/*
|
171
187
|
* call-seq:
|
172
188
|
* result.columns -> DuckDB::Column[]
|
@@ -176,7 +192,7 @@ static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult) {
|
|
176
192
|
*/
|
177
193
|
static VALUE duckdb_result_columns(VALUE oDuckDBResult) {
|
178
194
|
rubyDuckDBResult *ctx;
|
179
|
-
|
195
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
180
196
|
|
181
197
|
idx_t col_idx;
|
182
198
|
idx_t column_count = duckdb_column_count(&(ctx->result));
|
@@ -189,6 +205,136 @@ static VALUE duckdb_result_columns(VALUE oDuckDBResult) {
|
|
189
205
|
return ary;
|
190
206
|
}
|
191
207
|
|
208
|
+
static VALUE duckdb_result__column_type(VALUE oDuckDBResult, VALUE col_idx) {
|
209
|
+
rubyDuckDBResult *ctx;
|
210
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
211
|
+
return LL2NUM(duckdb_column_type(&(ctx->result), NUM2LL(col_idx)));
|
212
|
+
}
|
213
|
+
|
214
|
+
static VALUE duckdb_result__is_null(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
215
|
+
rubyDuckDBResult *ctx;
|
216
|
+
bool is_null;
|
217
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
218
|
+
|
219
|
+
is_null = duckdb_value_is_null(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
220
|
+
return is_null ? Qtrue : Qfalse;
|
221
|
+
}
|
222
|
+
|
223
|
+
static VALUE duckdb_result__to_boolean(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
224
|
+
rubyDuckDBResult *ctx;
|
225
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
226
|
+
|
227
|
+
return to_ruby_obj_boolean(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)) ? Qtrue : Qfalse;
|
228
|
+
}
|
229
|
+
|
230
|
+
static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
231
|
+
rubyDuckDBResult *ctx;
|
232
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
233
|
+
|
234
|
+
return to_ruby_obj_smallint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
235
|
+
}
|
236
|
+
|
237
|
+
static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
238
|
+
rubyDuckDBResult *ctx;
|
239
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
240
|
+
|
241
|
+
return to_ruby_obj_utinyint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
242
|
+
}
|
243
|
+
|
244
|
+
static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
245
|
+
rubyDuckDBResult *ctx;
|
246
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
247
|
+
|
248
|
+
return to_ruby_obj_integer(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
249
|
+
}
|
250
|
+
|
251
|
+
static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
252
|
+
rubyDuckDBResult *ctx;
|
253
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
254
|
+
|
255
|
+
return to_ruby_obj_bigint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
256
|
+
}
|
257
|
+
|
258
|
+
static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
259
|
+
rubyDuckDBResult *ctx;
|
260
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
261
|
+
|
262
|
+
return to_ruby_obj_float(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
263
|
+
}
|
264
|
+
|
265
|
+
static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
266
|
+
rubyDuckDBResult *ctx;
|
267
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
268
|
+
|
269
|
+
return to_ruby_obj_double(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
270
|
+
}
|
271
|
+
|
272
|
+
static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
273
|
+
rubyDuckDBResult *ctx;
|
274
|
+
char *p;
|
275
|
+
VALUE obj;
|
276
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
277
|
+
|
278
|
+
p = duckdb_value_varchar(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
279
|
+
if (p) {
|
280
|
+
obj = rb_utf8_str_new_cstr(p);
|
281
|
+
duckdb_free(p);
|
282
|
+
return obj;
|
283
|
+
}
|
284
|
+
return Qnil;
|
285
|
+
}
|
286
|
+
|
287
|
+
static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
288
|
+
rubyDuckDBResult *ctx;
|
289
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
290
|
+
|
291
|
+
return to_ruby_obj_blob(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
292
|
+
}
|
293
|
+
|
294
|
+
static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx) {
|
295
|
+
rubyDuckDBResult *ctx;
|
296
|
+
VALUE type = Qnil;
|
297
|
+
duckdb_logical_type logical_type;
|
298
|
+
|
299
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
300
|
+
logical_type = duckdb_column_logical_type(&(ctx->result), NUM2LL(col_idx));
|
301
|
+
if (logical_type) {
|
302
|
+
type = LL2NUM(duckdb_enum_internal_type(logical_type));
|
303
|
+
}
|
304
|
+
return type;
|
305
|
+
}
|
306
|
+
|
307
|
+
static VALUE duckdb_result__enum_dictionary_size(VALUE oDuckDBResult, VALUE col_idx) {
|
308
|
+
rubyDuckDBResult *ctx;
|
309
|
+
VALUE size = Qnil;
|
310
|
+
duckdb_logical_type logical_type;
|
311
|
+
|
312
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
313
|
+
logical_type = duckdb_column_logical_type(&(ctx->result), NUM2LL(col_idx));
|
314
|
+
if (logical_type) {
|
315
|
+
size = UINT2NUM(duckdb_enum_dictionary_size(logical_type));
|
316
|
+
}
|
317
|
+
return size;
|
318
|
+
}
|
319
|
+
|
320
|
+
static VALUE duckdb_result__enum_dictionary_value(VALUE oDuckDBResult, VALUE col_idx, VALUE idx) {
|
321
|
+
rubyDuckDBResult *ctx;
|
322
|
+
VALUE value = Qnil;
|
323
|
+
duckdb_logical_type logical_type;
|
324
|
+
char *p;
|
325
|
+
|
326
|
+
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
327
|
+
logical_type = duckdb_column_logical_type(&(ctx->result), NUM2LL(col_idx));
|
328
|
+
if (logical_type) {
|
329
|
+
p = duckdb_enum_dictionary_value(logical_type, NUM2LL(idx));
|
330
|
+
if (p) {
|
331
|
+
value = rb_utf8_str_new_cstr(p);
|
332
|
+
duckdb_free(p);
|
333
|
+
}
|
334
|
+
}
|
335
|
+
return value;
|
336
|
+
}
|
337
|
+
|
192
338
|
VALUE create_result(void) {
|
193
339
|
return allocate(cDuckDBResult);
|
194
340
|
}
|
@@ -197,7 +343,22 @@ void init_duckdb_result(void) {
|
|
197
343
|
cDuckDBResult = rb_define_class_under(mDuckDB, "Result", rb_cObject);
|
198
344
|
rb_define_alloc_func(cDuckDBResult, allocate);
|
199
345
|
|
200
|
-
rb_define_method(cDuckDBResult, "
|
346
|
+
rb_define_method(cDuckDBResult, "column_count", duckdb_result_column_count, 0);
|
347
|
+
rb_define_method(cDuckDBResult, "row_count", duckdb_result_row_count, 0);
|
201
348
|
rb_define_method(cDuckDBResult, "rows_changed", duckdb_result_rows_changed, 0);
|
202
349
|
rb_define_method(cDuckDBResult, "columns", duckdb_result_columns, 0);
|
350
|
+
rb_define_private_method(cDuckDBResult, "_column_type", duckdb_result__column_type, 1);
|
351
|
+
rb_define_private_method(cDuckDBResult, "_null?", duckdb_result__is_null, 2);
|
352
|
+
rb_define_private_method(cDuckDBResult, "_to_boolean", duckdb_result__to_boolean, 2);
|
353
|
+
rb_define_private_method(cDuckDBResult, "_to_smallint", duckdb_result__to_smallint, 2);
|
354
|
+
rb_define_private_method(cDuckDBResult, "_to_utinyint", duckdb_result__to_utinyint, 2);
|
355
|
+
rb_define_private_method(cDuckDBResult, "_to_integer", duckdb_result__to_integer, 2);
|
356
|
+
rb_define_private_method(cDuckDBResult, "_to_bigint", duckdb_result__to_bigint, 2);
|
357
|
+
rb_define_private_method(cDuckDBResult, "_to_float", duckdb_result__to_float, 2);
|
358
|
+
rb_define_private_method(cDuckDBResult, "_to_double", duckdb_result__to_double, 2);
|
359
|
+
rb_define_private_method(cDuckDBResult, "_to_string", duckdb_result__to_string, 2);
|
360
|
+
rb_define_private_method(cDuckDBResult, "_to_blob", duckdb_result__to_blob, 2);
|
361
|
+
rb_define_private_method(cDuckDBResult, "_enum_internal_type", duckdb_result__enum_internal_type, 1);
|
362
|
+
rb_define_private_method(cDuckDBResult, "_enum_dictionary_size", duckdb_result__enum_dictionary_size, 1);
|
363
|
+
rb_define_private_method(cDuckDBResult, "_enum_dictionary_value", duckdb_result__enum_dictionary_value, 2);
|
203
364
|
}
|
data/ext/duckdb/result.h
CHANGED
data/ext/duckdb/ruby-duckdb.h
CHANGED
@@ -18,13 +18,8 @@
|
|
18
18
|
|
19
19
|
#include "./blob.h"
|
20
20
|
#include "./appender.h"
|
21
|
-
|
22
|
-
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
23
|
-
|
24
21
|
#include "./config.h"
|
25
22
|
|
26
|
-
#endif /* HAVE_DUCKDB_CREATE_CONFIG */
|
27
|
-
|
28
23
|
extern VALUE mDuckDB;
|
29
24
|
extern VALUE cDuckDBDatabase;
|
30
25
|
extern VALUE cDuckDBConnection;
|
data/ext/duckdb/util.c
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
#include "ruby-duckdb.h"
|
2
2
|
|
3
|
-
#ifdef HAVE_DUCKDB_APPEND_DATE
|
4
|
-
|
5
3
|
duckdb_date to_duckdb_date_from_value(VALUE year, VALUE month, VALUE day) {
|
6
4
|
duckdb_date_struct dt_struct;
|
7
5
|
|
@@ -42,4 +40,3 @@ void to_duckdb_interval_from_value(duckdb_interval* interval, VALUE months, VALU
|
|
42
40
|
interval->days = NUM2INT(days);
|
43
41
|
interval->micros = NUM2LL(micros);
|
44
42
|
}
|
45
|
-
#endif
|
data/ext/duckdb/util.h
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
#ifndef RUBY_DUCKDB_UTIL_H
|
2
2
|
#define RUBY_DUCKDB_UTIL_H
|
3
3
|
|
4
|
-
#ifdef HAVE_DUCKDB_APPEND_DATE
|
5
|
-
|
6
4
|
duckdb_date to_duckdb_date_from_value(VALUE year, VALUE month, VALUE day);
|
7
5
|
duckdb_time to_duckdb_time_from_value(VALUE hour, VALUE min, VALUE sec, VALUE micros);
|
8
6
|
duckdb_timestamp to_duckdb_timestamp_from_value(VALUE year, VALUE month, VALUE day, VALUE hour, VALUE min, VALUE sec, VALUE micros);
|
9
7
|
void to_duckdb_interval_from_value(duckdb_interval* interval, VALUE months, VALUE days, VALUE micros);
|
10
8
|
|
11
9
|
#endif
|
12
|
-
|
13
|
-
#endif
|
data/lib/duckdb/result.rb
CHANGED
@@ -20,5 +20,55 @@ module DuckDB
|
|
20
20
|
# end
|
21
21
|
class Result
|
22
22
|
include Enumerable
|
23
|
+
|
24
|
+
ToRuby = {
|
25
|
+
1 => :_to_boolean,
|
26
|
+
3 => :_to_smallint,
|
27
|
+
4 => :_to_integer,
|
28
|
+
5 => :_to_bigint,
|
29
|
+
10 => :_to_float,
|
30
|
+
11 => :_to_double,
|
31
|
+
16 => :_to_hugeint,
|
32
|
+
18 => :_to_blob,
|
33
|
+
}
|
34
|
+
|
35
|
+
ToRuby.default = :_to_string
|
36
|
+
|
37
|
+
alias column_size column_count
|
38
|
+
alias row_size row_count
|
39
|
+
|
40
|
+
def each
|
41
|
+
return to_enum { row_size } unless block_given?
|
42
|
+
|
43
|
+
row_count.times do |row_index|
|
44
|
+
yield row(row_index)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def row(row_index)
|
49
|
+
row = []
|
50
|
+
column_count.times do |col_index|
|
51
|
+
row << (_null?(row_index, col_index) ? nil : to_value(row_index, col_index))
|
52
|
+
end
|
53
|
+
row
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_value(row_index, col_index)
|
57
|
+
send(ToRuby[_column_type(col_index)], row_index, col_index)
|
58
|
+
end
|
59
|
+
|
60
|
+
def enum_dictionary_values(col_index)
|
61
|
+
values = []
|
62
|
+
_enum_dictionary_size(col_index).times do |i|
|
63
|
+
values << _enum_dictionary_value(col_index, i)
|
64
|
+
end
|
65
|
+
values
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def _to_hugeint(row, col)
|
71
|
+
_to_string(row, col).to_i
|
72
|
+
end
|
23
73
|
end
|
24
74
|
end
|
data/lib/duckdb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duckdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Suketa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2.
|
26
|
+
version: '2.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
requirements: []
|
147
|
-
rubygems_version: 3.3.
|
147
|
+
rubygems_version: 3.3.22
|
148
148
|
signing_key:
|
149
149
|
specification_version: 4
|
150
150
|
summary: This module is Ruby binding for DuckDB database engine.
|