duckdb 1.5.2.0 → 1.5.3.0
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/CHANGELOG.md +38 -0
- data/duckdb.gemspec +37 -0
- data/ext/duckdb/aggregate_function.c +62 -100
- data/ext/duckdb/aggregate_function.h +2 -2
- data/ext/duckdb/aggregate_function_set.c +86 -0
- data/ext/duckdb/aggregate_function_set.h +14 -0
- data/ext/duckdb/appender.c +121 -39
- data/ext/duckdb/appender.h +1 -1
- data/ext/duckdb/client_context.c +5 -5
- data/ext/duckdb/client_context.h +2 -2
- data/ext/duckdb/column.c +13 -13
- data/ext/duckdb/column.h +1 -1
- data/ext/duckdb/connection.c +63 -41
- data/ext/duckdb/connection.h +2 -2
- data/ext/duckdb/converter.h +1 -7
- data/ext/duckdb/conveter.c +6 -6
- data/ext/duckdb/data_chunk.c +22 -22
- data/ext/duckdb/data_chunk.h +2 -2
- data/ext/duckdb/database.c +10 -10
- data/ext/duckdb/database.h +1 -1
- data/ext/duckdb/duckdb.c +18 -17
- data/ext/duckdb/expression.c +8 -8
- data/ext/duckdb/expression.h +1 -1
- data/ext/duckdb/extconf.rb +32 -16
- data/ext/duckdb/extracted_statements.c +15 -15
- data/ext/duckdb/extracted_statements.h +1 -1
- data/ext/duckdb/instance_cache.c +10 -10
- data/ext/duckdb/instance_cache.h +1 -1
- data/ext/duckdb/logical_type.c +94 -133
- data/ext/duckdb/logical_type.h +2 -2
- data/ext/duckdb/memory_helper.c +28 -28
- data/ext/duckdb/pending_result.c +27 -27
- data/ext/duckdb/pending_result.h +2 -2
- data/ext/duckdb/prepared_statement.c +120 -103
- data/ext/duckdb/prepared_statement.h +2 -2
- data/ext/duckdb/result.c +24 -74
- data/ext/duckdb/result.h +2 -3
- data/ext/duckdb/ruby-duckdb.h +5 -0
- data/ext/duckdb/scalar_function.c +3 -3
- data/ext/duckdb/table_description.c +1 -1
- data/ext/duckdb/table_function.c +3 -3
- data/ext/duckdb/table_function_bind_info.c +1 -1
- data/ext/duckdb/value.c +62 -50
- data/ext/duckdb/value.h +2 -2
- data/ext/duckdb/vector.c +20 -20
- data/ext/duckdb/vector.h +2 -2
- data/lib/duckdb/aggregate_function.rb +208 -3
- data/lib/duckdb/aggregate_function_set.rb +29 -0
- data/lib/duckdb/appender.rb +148 -0
- data/lib/duckdb/connection.rb +86 -25
- data/lib/duckdb/converter.rb +5 -0
- data/lib/duckdb/logical_type.rb +1 -3
- data/lib/duckdb/prepared_statement.rb +19 -1
- data/lib/duckdb/result.rb +39 -2
- data/lib/duckdb/scalar_function.rb +9 -4
- data/lib/duckdb/scalar_function_set.rb +0 -1
- data/lib/duckdb/table_description.rb +7 -0
- data/lib/duckdb/table_function.rb +0 -1
- data/lib/duckdb/table_name_parser.rb +58 -0
- data/lib/duckdb/value.rb +19 -0
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +2 -0
- metadata +7 -3
- data/lib/duckdb/duckdb_native.so +0 -0
data/ext/duckdb/appender.c
CHANGED
|
@@ -9,7 +9,8 @@ static size_t memsize(const void *p);
|
|
|
9
9
|
|
|
10
10
|
static VALUE appender_s_create_query(VALUE klass, VALUE con, VALUE query, VALUE types, VALUE table, VALUE columns);
|
|
11
11
|
|
|
12
|
-
static VALUE
|
|
12
|
+
static VALUE appender__initialize(VALUE self, VALUE con, VALUE schema, VALUE table);
|
|
13
|
+
static VALUE appender__initialize_ext(VALUE self, VALUE con, VALUE catalog, VALUE schema, VALUE table);
|
|
13
14
|
static VALUE appender_error_message(VALUE self);
|
|
14
15
|
static VALUE appender__append_bool(VALUE self, VALUE val);
|
|
15
16
|
static VALUE appender__append_int8(VALUE self, VALUE val);
|
|
@@ -36,9 +37,17 @@ static VALUE appender__append_hugeint(VALUE self, VALUE lower, VALUE upper);
|
|
|
36
37
|
static VALUE appender__append_uhugeint(VALUE self, VALUE lower, VALUE upper);
|
|
37
38
|
static VALUE appender__append_value(VALUE self, VALUE val);
|
|
38
39
|
static VALUE appender__append_data_chunk(VALUE self, VALUE chunk);
|
|
40
|
+
static VALUE appender__append_default_to_chunk(VALUE self, VALUE chunk, VALUE col, VALUE row);
|
|
39
41
|
static VALUE appender__flush(VALUE self);
|
|
42
|
+
|
|
43
|
+
#ifdef HAVE_DUCKDB_H_GE_V1_5_0
|
|
44
|
+
static VALUE appender__clear(VALUE self);
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
static VALUE appender__add_column(VALUE self, VALUE name);
|
|
48
|
+
static VALUE appender__clear_columns(VALUE self);
|
|
40
49
|
static VALUE appender__close(VALUE self);
|
|
41
|
-
static VALUE
|
|
50
|
+
static VALUE state_to_rbool(duckdb_state state);
|
|
42
51
|
|
|
43
52
|
static const rb_data_type_t appender_data_type = {
|
|
44
53
|
"DuckDB/Appender",
|
|
@@ -95,7 +104,7 @@ static VALUE appender_s_create_query(VALUE klass, VALUE con, VALUE query, VALUE
|
|
|
95
104
|
type_array = ALLOCA_N(duckdb_logical_type, (size_t)column_count);
|
|
96
105
|
for (idx_t i = 0; i < column_count; i++) {
|
|
97
106
|
VALUE type_val = rb_ary_entry(types, i);
|
|
98
|
-
rubyDuckDBLogicalType *type_ctx =
|
|
107
|
+
rubyDuckDBLogicalType *type_ctx = rbduckdb_get_struct_logical_type(type_val);
|
|
99
108
|
type_array[i] = type_ctx->logical_type;
|
|
100
109
|
}
|
|
101
110
|
|
|
@@ -113,7 +122,7 @@ static VALUE appender_s_create_query(VALUE klass, VALUE con, VALUE query, VALUE
|
|
|
113
122
|
column_names[i] = StringValuePtr(col_name_val);
|
|
114
123
|
}
|
|
115
124
|
}
|
|
116
|
-
ctxcon =
|
|
125
|
+
ctxcon = rbduckdb_get_struct_connection(con);
|
|
117
126
|
appender = allocate(klass);
|
|
118
127
|
TypedData_Get_Struct(appender, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
119
128
|
if (duckdb_appender_create_query(ctxcon->con, query_str, column_count, type_array, table_name, column_names, &ctx->appender) == DuckDBError) {
|
|
@@ -123,18 +132,18 @@ static VALUE appender_s_create_query(VALUE klass, VALUE con, VALUE query, VALUE
|
|
|
123
132
|
return appender;
|
|
124
133
|
}
|
|
125
134
|
|
|
126
|
-
static VALUE
|
|
135
|
+
static VALUE appender__initialize(VALUE self, VALUE con, VALUE schema, VALUE table) {
|
|
127
136
|
|
|
128
137
|
rubyDuckDBConnection *ctxcon;
|
|
129
138
|
rubyDuckDBAppender *ctx;
|
|
130
139
|
char *pschema = 0;
|
|
131
140
|
|
|
132
141
|
if (!rb_obj_is_kind_of(con, cDuckDBConnection)) {
|
|
133
|
-
rb_raise(rb_eTypeError, "1st argument should be instance of
|
|
142
|
+
rb_raise(rb_eTypeError, "1st argument should be instance of DuckDB::Connection");
|
|
134
143
|
}
|
|
135
144
|
|
|
136
145
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
137
|
-
ctxcon =
|
|
146
|
+
ctxcon = rbduckdb_get_struct_connection(con);
|
|
138
147
|
|
|
139
148
|
if (schema != Qnil) {
|
|
140
149
|
pschema = StringValuePtr(schema);
|
|
@@ -146,6 +155,32 @@ static VALUE appender_initialize(VALUE self, VALUE con, VALUE schema, VALUE tabl
|
|
|
146
155
|
return self;
|
|
147
156
|
}
|
|
148
157
|
|
|
158
|
+
static VALUE appender__initialize_ext(VALUE self, VALUE con, VALUE catalog, VALUE schema, VALUE table) {
|
|
159
|
+
rubyDuckDBConnection *ctxcon;
|
|
160
|
+
rubyDuckDBAppender *ctx;
|
|
161
|
+
char *pcatalog = 0;
|
|
162
|
+
char *pschema = 0;
|
|
163
|
+
|
|
164
|
+
if (!rb_obj_is_kind_of(con, cDuckDBConnection)) {
|
|
165
|
+
rb_raise(rb_eTypeError, "1st argument should be instance of DuckDB::Connection");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
169
|
+
ctxcon = rbduckdb_get_struct_connection(con);
|
|
170
|
+
|
|
171
|
+
if (catalog != Qnil) {
|
|
172
|
+
pcatalog = StringValuePtr(catalog);
|
|
173
|
+
}
|
|
174
|
+
if (schema != Qnil) {
|
|
175
|
+
pschema = StringValuePtr(schema);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (duckdb_appender_create_ext(ctxcon->con, pcatalog, pschema, StringValuePtr(table), &(ctx->appender)) == DuckDBError) {
|
|
179
|
+
rb_raise(eDuckDBError, "failed to create appender");
|
|
180
|
+
}
|
|
181
|
+
return self;
|
|
182
|
+
}
|
|
183
|
+
|
|
149
184
|
/* call-seq:
|
|
150
185
|
* appender.error_message -> String
|
|
151
186
|
*
|
|
@@ -179,7 +214,7 @@ static VALUE appender__end_row(VALUE self) {
|
|
|
179
214
|
rubyDuckDBAppender *ctx;
|
|
180
215
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
181
216
|
|
|
182
|
-
return
|
|
217
|
+
return state_to_rbool(duckdb_appender_end_row(ctx->appender));
|
|
183
218
|
}
|
|
184
219
|
|
|
185
220
|
/* :nodoc: */
|
|
@@ -191,7 +226,7 @@ static VALUE appender__append_bool(VALUE self, VALUE val) {
|
|
|
191
226
|
rb_raise(rb_eArgError, "argument must be boolean");
|
|
192
227
|
}
|
|
193
228
|
|
|
194
|
-
return
|
|
229
|
+
return state_to_rbool(duckdb_append_bool(ctx->appender, (val == Qtrue)));
|
|
195
230
|
}
|
|
196
231
|
|
|
197
232
|
/* :nodoc: */
|
|
@@ -201,7 +236,7 @@ static VALUE appender__append_int8(VALUE self, VALUE val) {
|
|
|
201
236
|
|
|
202
237
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
203
238
|
|
|
204
|
-
return
|
|
239
|
+
return state_to_rbool(duckdb_append_int8(ctx->appender, i8val));
|
|
205
240
|
}
|
|
206
241
|
|
|
207
242
|
/* :nodoc: */
|
|
@@ -211,7 +246,7 @@ static VALUE appender__append_int16(VALUE self, VALUE val) {
|
|
|
211
246
|
|
|
212
247
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
213
248
|
|
|
214
|
-
return
|
|
249
|
+
return state_to_rbool(duckdb_append_int16(ctx->appender, i16val));
|
|
215
250
|
}
|
|
216
251
|
|
|
217
252
|
/* :nodoc: */
|
|
@@ -221,7 +256,7 @@ static VALUE appender__append_int32(VALUE self, VALUE val) {
|
|
|
221
256
|
|
|
222
257
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
223
258
|
|
|
224
|
-
return
|
|
259
|
+
return state_to_rbool(duckdb_append_int32(ctx->appender, i32val));
|
|
225
260
|
}
|
|
226
261
|
|
|
227
262
|
/* :nodoc: */
|
|
@@ -231,7 +266,7 @@ static VALUE appender__append_int64(VALUE self, VALUE val) {
|
|
|
231
266
|
|
|
232
267
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
233
268
|
|
|
234
|
-
return
|
|
269
|
+
return state_to_rbool(duckdb_append_int64(ctx->appender, i64val));
|
|
235
270
|
}
|
|
236
271
|
|
|
237
272
|
/* :nodoc: */
|
|
@@ -241,7 +276,7 @@ static VALUE appender__append_uint8(VALUE self, VALUE val) {
|
|
|
241
276
|
|
|
242
277
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
243
278
|
|
|
244
|
-
return
|
|
279
|
+
return state_to_rbool(duckdb_append_uint8(ctx->appender, ui8val));
|
|
245
280
|
}
|
|
246
281
|
|
|
247
282
|
/* :nodoc: */
|
|
@@ -251,7 +286,7 @@ static VALUE appender__append_uint16(VALUE self, VALUE val) {
|
|
|
251
286
|
|
|
252
287
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
253
288
|
|
|
254
|
-
return
|
|
289
|
+
return state_to_rbool(duckdb_append_uint16(ctx->appender, ui16val));
|
|
255
290
|
}
|
|
256
291
|
|
|
257
292
|
/* :nodoc: */
|
|
@@ -261,7 +296,7 @@ static VALUE appender__append_uint32(VALUE self, VALUE val) {
|
|
|
261
296
|
|
|
262
297
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
263
298
|
|
|
264
|
-
return
|
|
299
|
+
return state_to_rbool(duckdb_append_uint32(ctx->appender, ui32val));
|
|
265
300
|
}
|
|
266
301
|
|
|
267
302
|
/* :nodoc: */
|
|
@@ -271,7 +306,7 @@ static VALUE appender__append_uint64(VALUE self, VALUE val) {
|
|
|
271
306
|
|
|
272
307
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
273
308
|
|
|
274
|
-
return
|
|
309
|
+
return state_to_rbool(duckdb_append_uint64(ctx->appender, ui64val));
|
|
275
310
|
}
|
|
276
311
|
|
|
277
312
|
/* :nodoc: */
|
|
@@ -281,7 +316,7 @@ static VALUE appender__append_float(VALUE self, VALUE val) {
|
|
|
281
316
|
|
|
282
317
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
283
318
|
|
|
284
|
-
return
|
|
319
|
+
return state_to_rbool(duckdb_append_float(ctx->appender, fval));
|
|
285
320
|
}
|
|
286
321
|
|
|
287
322
|
/* :nodoc: */
|
|
@@ -291,7 +326,7 @@ static VALUE appender__append_double(VALUE self, VALUE val) {
|
|
|
291
326
|
|
|
292
327
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
293
328
|
|
|
294
|
-
return
|
|
329
|
+
return state_to_rbool(duckdb_append_double(ctx->appender, dval));
|
|
295
330
|
}
|
|
296
331
|
|
|
297
332
|
/* :nodoc: */
|
|
@@ -301,7 +336,7 @@ static VALUE appender__append_varchar(VALUE self, VALUE val) {
|
|
|
301
336
|
|
|
302
337
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
303
338
|
|
|
304
|
-
return
|
|
339
|
+
return state_to_rbool(duckdb_append_varchar(ctx->appender, pval));
|
|
305
340
|
}
|
|
306
341
|
|
|
307
342
|
/* :nodoc: */
|
|
@@ -313,7 +348,7 @@ static VALUE appender__append_varchar_length(VALUE self, VALUE val, VALUE len) {
|
|
|
313
348
|
|
|
314
349
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
315
350
|
|
|
316
|
-
return
|
|
351
|
+
return state_to_rbool(duckdb_append_varchar_length(ctx->appender, pval, length));
|
|
317
352
|
}
|
|
318
353
|
|
|
319
354
|
/* :nodoc: */
|
|
@@ -325,7 +360,7 @@ static VALUE appender__append_blob(VALUE self, VALUE val) {
|
|
|
325
360
|
|
|
326
361
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
327
362
|
|
|
328
|
-
return
|
|
363
|
+
return state_to_rbool(duckdb_append_blob(ctx->appender, (void *)pval, length));
|
|
329
364
|
}
|
|
330
365
|
|
|
331
366
|
/* :nodoc: */
|
|
@@ -333,7 +368,7 @@ static VALUE appender__append_null(VALUE self) {
|
|
|
333
368
|
rubyDuckDBAppender *ctx;
|
|
334
369
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
335
370
|
|
|
336
|
-
return
|
|
371
|
+
return state_to_rbool(duckdb_append_null(ctx->appender));
|
|
337
372
|
}
|
|
338
373
|
|
|
339
374
|
/* :nodoc: */
|
|
@@ -341,7 +376,7 @@ static VALUE appender__append_default(VALUE self) {
|
|
|
341
376
|
rubyDuckDBAppender *ctx;
|
|
342
377
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
343
378
|
|
|
344
|
-
return
|
|
379
|
+
return state_to_rbool(duckdb_append_default(ctx->appender));
|
|
345
380
|
}
|
|
346
381
|
|
|
347
382
|
/* :nodoc: */
|
|
@@ -352,7 +387,7 @@ static VALUE appender__append_date(VALUE self, VALUE year, VALUE month, VALUE da
|
|
|
352
387
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
353
388
|
dt = rbduckdb_to_duckdb_date_from_value(year, month, day);
|
|
354
389
|
|
|
355
|
-
return
|
|
390
|
+
return state_to_rbool(duckdb_append_date(ctx->appender, dt));
|
|
356
391
|
}
|
|
357
392
|
|
|
358
393
|
/* :nodoc: */
|
|
@@ -363,7 +398,7 @@ static VALUE appender__append_interval(VALUE self, VALUE months, VALUE days, VAL
|
|
|
363
398
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
364
399
|
rbduckdb_to_duckdb_interval_from_value(&interval, months, days, micros);
|
|
365
400
|
|
|
366
|
-
return
|
|
401
|
+
return state_to_rbool(duckdb_append_interval(ctx->appender, interval));
|
|
367
402
|
}
|
|
368
403
|
|
|
369
404
|
/* :nodoc: */
|
|
@@ -374,7 +409,7 @@ static VALUE appender__append_time(VALUE self, VALUE hour, VALUE min, VALUE sec,
|
|
|
374
409
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
375
410
|
time = rbduckdb_to_duckdb_time_from_value(hour, min, sec, micros);
|
|
376
411
|
|
|
377
|
-
return
|
|
412
|
+
return state_to_rbool(duckdb_append_time(ctx->appender, time));
|
|
378
413
|
}
|
|
379
414
|
|
|
380
415
|
/* :nodoc: */
|
|
@@ -387,7 +422,7 @@ static VALUE appender__append_timestamp(VALUE self, VALUE year, VALUE month, VAL
|
|
|
387
422
|
|
|
388
423
|
timestamp = rbduckdb_to_duckdb_timestamp_from_value(year, month, day, hour, min, sec, micros);
|
|
389
424
|
|
|
390
|
-
return
|
|
425
|
+
return state_to_rbool(duckdb_append_timestamp(ctx->appender, timestamp));
|
|
391
426
|
}
|
|
392
427
|
|
|
393
428
|
/* :nodoc: */
|
|
@@ -401,7 +436,7 @@ static VALUE appender__append_hugeint(VALUE self, VALUE lower, VALUE upper) {
|
|
|
401
436
|
|
|
402
437
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
403
438
|
|
|
404
|
-
return
|
|
439
|
+
return state_to_rbool(duckdb_append_hugeint(ctx->appender, hugeint));
|
|
405
440
|
}
|
|
406
441
|
|
|
407
442
|
/* :nodoc: */
|
|
@@ -415,7 +450,7 @@ static VALUE appender__append_uhugeint(VALUE self, VALUE lower, VALUE upper) {
|
|
|
415
450
|
|
|
416
451
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
417
452
|
|
|
418
|
-
return
|
|
453
|
+
return state_to_rbool(duckdb_append_uhugeint(ctx->appender, uhugeint));
|
|
419
454
|
}
|
|
420
455
|
|
|
421
456
|
/* :nodoc: */
|
|
@@ -424,9 +459,9 @@ static VALUE appender__append_value(VALUE self, VALUE val) {
|
|
|
424
459
|
rubyDuckDBValue *value_ctx;
|
|
425
460
|
|
|
426
461
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
427
|
-
value_ctx =
|
|
462
|
+
value_ctx = rbduckdb_get_struct_value(val);
|
|
428
463
|
|
|
429
|
-
return
|
|
464
|
+
return state_to_rbool(duckdb_append_value(ctx->appender, value_ctx->value));
|
|
430
465
|
}
|
|
431
466
|
|
|
432
467
|
/* :nodoc: */
|
|
@@ -435,9 +470,20 @@ static VALUE appender__append_data_chunk(VALUE self, VALUE chunk) {
|
|
|
435
470
|
rubyDuckDBDataChunk *chunk_ctx;
|
|
436
471
|
|
|
437
472
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
438
|
-
chunk_ctx =
|
|
473
|
+
chunk_ctx = rbduckdb_get_struct_data_chunk(chunk);
|
|
439
474
|
|
|
440
|
-
return
|
|
475
|
+
return state_to_rbool(duckdb_append_data_chunk(ctx->appender, chunk_ctx->data_chunk));
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/* :nodoc: */
|
|
479
|
+
static VALUE appender__append_default_to_chunk(VALUE self, VALUE chunk, VALUE col, VALUE row) {
|
|
480
|
+
rubyDuckDBAppender *ctx;
|
|
481
|
+
rubyDuckDBDataChunk *chunk_ctx;
|
|
482
|
+
|
|
483
|
+
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
484
|
+
chunk_ctx = rbduckdb_get_struct_data_chunk(chunk);
|
|
485
|
+
|
|
486
|
+
return state_to_rbool(duckdb_append_default_to_chunk(ctx->appender, chunk_ctx->data_chunk, NUM2ULL(col), NUM2ULL(row)));
|
|
441
487
|
}
|
|
442
488
|
|
|
443
489
|
/* :nodoc: */
|
|
@@ -445,7 +491,34 @@ static VALUE appender__flush(VALUE self) {
|
|
|
445
491
|
rubyDuckDBAppender *ctx;
|
|
446
492
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
447
493
|
|
|
448
|
-
return
|
|
494
|
+
return state_to_rbool(duckdb_appender_flush(ctx->appender));
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
#ifdef HAVE_DUCKDB_H_GE_V1_5_0
|
|
498
|
+
/* :nodoc: */
|
|
499
|
+
static VALUE appender__clear(VALUE self) {
|
|
500
|
+
rubyDuckDBAppender *ctx;
|
|
501
|
+
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
502
|
+
|
|
503
|
+
return state_to_rbool(duckdb_appender_clear(ctx->appender));
|
|
504
|
+
}
|
|
505
|
+
#endif
|
|
506
|
+
|
|
507
|
+
/* :nodoc: */
|
|
508
|
+
static VALUE appender__add_column(VALUE self, VALUE name) {
|
|
509
|
+
char *p = StringValuePtr(name);
|
|
510
|
+
rubyDuckDBAppender *ctx;
|
|
511
|
+
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
512
|
+
|
|
513
|
+
return state_to_rbool(duckdb_appender_add_column(ctx->appender, p));
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/* :nodoc: */
|
|
517
|
+
static VALUE appender__clear_columns(VALUE self) {
|
|
518
|
+
rubyDuckDBAppender *ctx;
|
|
519
|
+
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
520
|
+
|
|
521
|
+
return state_to_rbool(duckdb_appender_clear_columns(ctx->appender));
|
|
449
522
|
}
|
|
450
523
|
|
|
451
524
|
/* :nodoc: */
|
|
@@ -453,27 +526,35 @@ static VALUE appender__close(VALUE self) {
|
|
|
453
526
|
rubyDuckDBAppender *ctx;
|
|
454
527
|
TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
|
|
455
528
|
|
|
456
|
-
return
|
|
529
|
+
return state_to_rbool(duckdb_appender_close(ctx->appender));
|
|
457
530
|
}
|
|
458
531
|
|
|
459
|
-
static VALUE
|
|
532
|
+
static VALUE state_to_rbool(duckdb_state state) {
|
|
460
533
|
if (state == DuckDBSuccess) {
|
|
461
534
|
return Qtrue;
|
|
462
535
|
}
|
|
463
536
|
return Qfalse;
|
|
464
537
|
}
|
|
465
538
|
|
|
466
|
-
void
|
|
539
|
+
void rbduckdb_init_appender(void) {
|
|
467
540
|
#if 0
|
|
468
541
|
VALUE mDuckDB = rb_define_module("DuckDB");
|
|
469
542
|
#endif
|
|
470
543
|
cDuckDBAppender = rb_define_class_under(mDuckDB, "Appender", rb_cObject);
|
|
471
544
|
rb_define_alloc_func(cDuckDBAppender, allocate);
|
|
472
545
|
rb_define_singleton_method(cDuckDBAppender, "create_query", appender_s_create_query, 5);
|
|
473
|
-
|
|
546
|
+
rb_define_private_method(cDuckDBAppender, "_initialize", appender__initialize, 3);
|
|
547
|
+
rb_define_private_method(cDuckDBAppender, "_initialize_ext", appender__initialize_ext, 4);
|
|
474
548
|
rb_define_method(cDuckDBAppender, "error_message", appender_error_message, 0);
|
|
475
549
|
rb_define_private_method(cDuckDBAppender, "_end_row", appender__end_row, 0);
|
|
476
550
|
rb_define_private_method(cDuckDBAppender, "_flush", appender__flush, 0);
|
|
551
|
+
|
|
552
|
+
#ifdef HAVE_DUCKDB_H_GE_V1_5_0
|
|
553
|
+
rb_define_private_method(cDuckDBAppender, "_clear", appender__clear, 0);
|
|
554
|
+
#endif
|
|
555
|
+
|
|
556
|
+
rb_define_private_method(cDuckDBAppender, "_add_column", appender__add_column, 1);
|
|
557
|
+
rb_define_private_method(cDuckDBAppender, "_clear_columns", appender__clear_columns, 0);
|
|
477
558
|
rb_define_private_method(cDuckDBAppender, "_close", appender__close, 0);
|
|
478
559
|
rb_define_private_method(cDuckDBAppender, "_append_bool", appender__append_bool, 1);
|
|
479
560
|
rb_define_private_method(cDuckDBAppender, "_append_int8", appender__append_int8, 1);
|
|
@@ -499,4 +580,5 @@ void rbduckdb_init_duckdb_appender(void) {
|
|
|
499
580
|
rb_define_private_method(cDuckDBAppender, "_append_uhugeint", appender__append_uhugeint, 2);
|
|
500
581
|
rb_define_private_method(cDuckDBAppender, "_append_value", appender__append_value, 1);
|
|
501
582
|
rb_define_private_method(cDuckDBAppender, "_append_data_chunk", appender__append_data_chunk, 1);
|
|
583
|
+
rb_define_private_method(cDuckDBAppender, "_append_default_to_chunk", appender__append_default_to_chunk, 3);
|
|
502
584
|
}
|
data/ext/duckdb/appender.h
CHANGED
data/ext/duckdb/client_context.c
CHANGED
|
@@ -5,7 +5,7 @@ VALUE cDuckDBClientContext;
|
|
|
5
5
|
static void deallocate(void *ctx);
|
|
6
6
|
static VALUE allocate(VALUE klass);
|
|
7
7
|
static size_t memsize(const void *p);
|
|
8
|
-
static VALUE
|
|
8
|
+
static VALUE client_context_connection_id(VALUE self);
|
|
9
9
|
|
|
10
10
|
static const rb_data_type_t client_context_data_type = {
|
|
11
11
|
"DuckDB/ClientContext",
|
|
@@ -42,7 +42,7 @@ VALUE rbduckdb_client_context_new(duckdb_client_context client_context) {
|
|
|
42
42
|
return obj;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
rubyDuckDBClientContext *
|
|
45
|
+
rubyDuckDBClientContext *rbduckdb_get_struct_client_context(VALUE obj) {
|
|
46
46
|
rubyDuckDBClientContext *ctx;
|
|
47
47
|
TypedData_Get_Struct(obj, rubyDuckDBClientContext, &client_context_data_type, ctx);
|
|
48
48
|
return ctx;
|
|
@@ -54,17 +54,17 @@ rubyDuckDBClientContext *get_struct_client_context(VALUE obj) {
|
|
|
54
54
|
*
|
|
55
55
|
* Returns the connection id of the client context.
|
|
56
56
|
*/
|
|
57
|
-
static VALUE
|
|
57
|
+
static VALUE client_context_connection_id(VALUE self) {
|
|
58
58
|
rubyDuckDBClientContext *ctx;
|
|
59
59
|
TypedData_Get_Struct(self, rubyDuckDBClientContext, &client_context_data_type, ctx);
|
|
60
60
|
return ULL2NUM(duckdb_client_context_get_connection_id(ctx->client_context));
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
void
|
|
63
|
+
void rbduckdb_init_client_context(void) {
|
|
64
64
|
#if 0
|
|
65
65
|
VALUE mDuckDB = rb_define_module("DuckDB");
|
|
66
66
|
#endif
|
|
67
67
|
cDuckDBClientContext = rb_define_class_under(mDuckDB, "ClientContext", rb_cObject);
|
|
68
68
|
rb_define_alloc_func(cDuckDBClientContext, allocate);
|
|
69
|
-
rb_define_method(cDuckDBClientContext, "connection_id",
|
|
69
|
+
rb_define_method(cDuckDBClientContext, "connection_id", client_context_connection_id, 0);
|
|
70
70
|
}
|
data/ext/duckdb/client_context.h
CHANGED
|
@@ -7,8 +7,8 @@ struct _rubyDuckDBClientContext {
|
|
|
7
7
|
|
|
8
8
|
typedef struct _rubyDuckDBClientContext rubyDuckDBClientContext;
|
|
9
9
|
|
|
10
|
-
void
|
|
10
|
+
void rbduckdb_init_client_context(void);
|
|
11
11
|
VALUE rbduckdb_client_context_new(duckdb_client_context client_context);
|
|
12
|
-
rubyDuckDBClientContext *
|
|
12
|
+
rubyDuckDBClientContext *rbduckdb_get_struct_client_context(VALUE obj);
|
|
13
13
|
|
|
14
14
|
#endif
|
data/ext/duckdb/column.c
CHANGED
|
@@ -5,9 +5,9 @@ static VALUE cDuckDBColumn;
|
|
|
5
5
|
static void deallocate(void *ctx);
|
|
6
6
|
static VALUE allocate(VALUE klass);
|
|
7
7
|
static size_t memsize(const void *p);
|
|
8
|
-
static VALUE
|
|
9
|
-
static VALUE
|
|
10
|
-
static VALUE
|
|
8
|
+
static VALUE column__type(VALUE oDuckDBColumn);
|
|
9
|
+
static VALUE column_logical_type(VALUE oDuckDBColumn);
|
|
10
|
+
static VALUE column_name(VALUE oDuckDBColumn);
|
|
11
11
|
|
|
12
12
|
static const rb_data_type_t column_data_type = {
|
|
13
13
|
"DuckDB/Column",
|
|
@@ -31,7 +31,7 @@ static size_t memsize(const void *p) {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/* :nodoc: */
|
|
34
|
-
VALUE
|
|
34
|
+
VALUE column__type(VALUE oDuckDBColumn) {
|
|
35
35
|
rubyDuckDBColumn *ctx;
|
|
36
36
|
rubyDuckDBResult *ctxresult;
|
|
37
37
|
VALUE result;
|
|
@@ -40,7 +40,7 @@ VALUE duckdb_column__type(VALUE oDuckDBColumn) {
|
|
|
40
40
|
TypedData_Get_Struct(oDuckDBColumn, rubyDuckDBColumn, &column_data_type, ctx);
|
|
41
41
|
|
|
42
42
|
result = rb_ivar_get(oDuckDBColumn, rb_intern("result"));
|
|
43
|
-
ctxresult =
|
|
43
|
+
ctxresult = rbduckdb_get_struct_result(result);
|
|
44
44
|
type = duckdb_column_type(&(ctxresult->result), ctx->col);
|
|
45
45
|
|
|
46
46
|
return INT2FIX(type);
|
|
@@ -53,7 +53,7 @@ VALUE duckdb_column__type(VALUE oDuckDBColumn) {
|
|
|
53
53
|
* Returns the logical type class.
|
|
54
54
|
*
|
|
55
55
|
*/
|
|
56
|
-
VALUE
|
|
56
|
+
VALUE column_logical_type(VALUE oDuckDBColumn) {
|
|
57
57
|
rubyDuckDBColumn *ctx;
|
|
58
58
|
rubyDuckDBResult *ctxresult;
|
|
59
59
|
VALUE result;
|
|
@@ -63,7 +63,7 @@ VALUE duckdb_column__logical_type(VALUE oDuckDBColumn) {
|
|
|
63
63
|
TypedData_Get_Struct(oDuckDBColumn, rubyDuckDBColumn, &column_data_type, ctx);
|
|
64
64
|
|
|
65
65
|
result = rb_ivar_get(oDuckDBColumn, rb_intern("result"));
|
|
66
|
-
ctxresult =
|
|
66
|
+
ctxresult = rbduckdb_get_struct_result(result);
|
|
67
67
|
_logical_type = duckdb_column_logical_type(&(ctxresult->result), ctx->col);
|
|
68
68
|
|
|
69
69
|
if (_logical_type) {
|
|
@@ -80,7 +80,7 @@ VALUE duckdb_column__logical_type(VALUE oDuckDBColumn) {
|
|
|
80
80
|
* Returns the column name.
|
|
81
81
|
*
|
|
82
82
|
*/
|
|
83
|
-
VALUE
|
|
83
|
+
VALUE column_name(VALUE oDuckDBColumn) {
|
|
84
84
|
rubyDuckDBColumn *ctx;
|
|
85
85
|
VALUE result;
|
|
86
86
|
rubyDuckDBResult *ctxresult;
|
|
@@ -89,7 +89,7 @@ VALUE duckdb_column_get_name(VALUE oDuckDBColumn) {
|
|
|
89
89
|
|
|
90
90
|
result = rb_ivar_get(oDuckDBColumn, rb_intern("result"));
|
|
91
91
|
|
|
92
|
-
ctxresult =
|
|
92
|
+
ctxresult = rbduckdb_get_struct_result(result);
|
|
93
93
|
|
|
94
94
|
return rb_utf8_str_new_cstr(duckdb_column_name(&(ctxresult->result), ctx->col));
|
|
95
95
|
}
|
|
@@ -107,14 +107,14 @@ VALUE rbduckdb_create_column(VALUE oDuckDBResult, idx_t col) {
|
|
|
107
107
|
return obj;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
void
|
|
110
|
+
void rbduckdb_init_column(void) {
|
|
111
111
|
#if 0
|
|
112
112
|
VALUE mDuckDB = rb_define_module("DuckDB");
|
|
113
113
|
#endif
|
|
114
114
|
cDuckDBColumn = rb_define_class_under(mDuckDB, "Column", rb_cObject);
|
|
115
115
|
rb_define_alloc_func(cDuckDBColumn, allocate);
|
|
116
116
|
|
|
117
|
-
rb_define_private_method(cDuckDBColumn, "_type",
|
|
118
|
-
rb_define_method(cDuckDBColumn, "logical_type",
|
|
119
|
-
rb_define_method(cDuckDBColumn, "name",
|
|
117
|
+
rb_define_private_method(cDuckDBColumn, "_type", column__type, 0);
|
|
118
|
+
rb_define_method(cDuckDBColumn, "logical_type", column_logical_type, 0);
|
|
119
|
+
rb_define_method(cDuckDBColumn, "name", column_name, 0);
|
|
120
120
|
}
|
data/ext/duckdb/column.h
CHANGED