duckdb 1.2.0.0 → 1.2.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ed07310471afbddcd5b4facd1720eeae0868af7d2682754a30361bafdf45b5a
4
- data.tar.gz: 984fd1ac1d47a72c0d20a2b1225656baf8838a47c70c3edc54d58bde0490cf25
3
+ metadata.gz: 9dc90028f52da778feed9afafb7e1bddfa8128120dea8c798fec4c21317cc8e1
4
+ data.tar.gz: 5cb1ae0ae04c712c0edcd5dc61ac7a05c12e6ee59c7c72a113f8ea3a8012aa2e
5
5
  SHA512:
6
- metadata.gz: 5e85e65243f72ac9d1d8bab1ec44a18b7ac31dccba3cfd12dc81c075f44ea79592b7357dde7f30b4276fda2eee769aa93986ca216061ea2aa497a7e7038872df
7
- data.tar.gz: ee8db3baf4385b71e4c4d4765200baacef1df273702281e33809d2b4037bc25b4bae008e0501c178f615ba22f5a1b99021a22d15d5982054dbe675a769ca1cd8
6
+ metadata.gz: 3dce5d6c09d593ae95e59aed616ce83d1849136bcbfe7b1f668e8e515a1c8941cf18bd62593bfaec7a4f587731e2cad841d03d0d743da49c3c18ae7f346e3528
7
+ data.tar.gz: 5852c870293bd442e2afcf8c624fe21c1695803f4102a065b142d6c64b8639dc793af30852717742571d6d49d89d4753b4df805173a36f895fbc6bbaaa446c8b
@@ -15,8 +15,8 @@ jobs:
15
15
  runs-on: macos-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.1.6', '3.2.6', '3.3.6', '3.4.2', 'head']
19
- duckdb: ['1.2.0', '1.1.3', '1.1.1', '1.0.0']
18
+ ruby: ['3.2.7', '3.3.8', '3.4.2', 'head']
19
+ duckdb: ['1.2.2', '1.1.3', '1.1.1']
20
20
 
21
21
  steps:
22
22
  - uses: actions/checkout@v4
@@ -15,8 +15,8 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.1.6', '3.2.6', '3.3.6', '3.4.2', 'head']
19
- duckdb: ['1.2.0', '1.1.3', '1.1.1', '1.0.0']
18
+ ruby: ['3.2.7', '3.3.8', '3.4.2', 'head']
19
+ duckdb: ['1.2.2', '1.1.3', '1.1.1']
20
20
 
21
21
  steps:
22
22
  - uses: actions/checkout@v4
@@ -15,8 +15,9 @@ jobs:
15
15
  runs-on: windows-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.1.6', '3.2.6', '3.3.6', '3.4.1', 'ucrt', 'mingw', 'mswin', 'head']
19
- duckdb: ['1.2.0', '1.1.3', '1.1.1', '1.0.0']
18
+ # ruby: ['3.2.6', '3.3.6', '3.4.1', 'ucrt', 'mingw', 'mswin', 'head']
19
+ ruby: ['3.2.6', '3.3.6', '3.4.1', 'ucrt', 'mingw', 'mswin']
20
+ duckdb: ['1.2.2', '1.1.3', '1.1.1']
20
21
 
21
22
  steps:
22
23
  - uses: actions/checkout@v4
data/CHANGELOG.md CHANGED
@@ -3,6 +3,36 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  # Unreleased
5
5
 
6
+ # 1.2.2.0 - 2025-05-11
7
+ - drop Ruby 3.1.
8
+ - implement `DuckDB::InstanceCache` class.
9
+ - bump duckdb to 1.2.2 on CI.
10
+ - add `DuckDB::PreparedStatement#bind_uint8`, `DuckDB::PreparedStatement#bind_uint16`,
11
+ `DuckDB::PreparedStatement#bind_uint32`, `DuckDB::PreparedStatement#bind_uint64`.
12
+ - add `DuckDB::LogicalType` class.
13
+ - `DuckDB::LogicalType` class is under construction. `DuckDB::LogicalType#internal_type`,
14
+ `DuckDB::LogicalType#dictionary_size`, `DuckDB::LogicalType#dictionary_value_at`,
15
+ `DuckDB::LogicalType#each_dictionary_value`, `DuckDB::LogicalType#alias`, and
16
+ `DuckDB::LogicalType#alias=`are available.
17
+
18
+ # 1.2.1.0 - 2025-03-30
19
+ - bump duckdb v1.2.1 on CI.
20
+ - drop duckdb v1.0.0.
21
+ - add `DuckDB::LogicalType` class.
22
+ - `DuckDB::LogicalType` class is under construction. `DuckDB::LogicalType#member_count`,
23
+ `DuckDB::LogicalType#member_name_at`, `DuckDB::LogicalType#member_type_at`,
24
+ `DuckDB::LogicalType#each_member_name`, `DuckDB::LogicalType#each_member_type`,
25
+ `DuckDB::LogicalType#child_count`, `DuckDB::LogicalType#child_name_at`,
26
+ `DuckDB::LogicalType#child_type_at`, `DuckDB::LogicalType#each_child_name`, and
27
+ `DuckDB::LogicalType#each_child_type` are available.
28
+ - fix error message when `DuckDB::Appender#append_uint16`, `DuckDB::Appender#append_uint32`,
29
+ `DuckDB::Appender#append_uint64`, `DuckDB::Appender#append_float`, `DuckDB::Appender#append_double`,
30
+ `DuckDB::Appender#append_varchar`, `DuckDB::Appender#append_varchar_length`,
31
+ `DuckDB::Appender#append_blob`, `DuckDB::Appender#append_null`, `DuckDB::Appender#append_default`,
32
+ `DuckDB::Appender#append_date`, `DuckDB::Appender#append_interval`, `DuckDB::Appender#append_time`,
33
+ `DuckDB::Appender#append_timestamp`, `DuckDB::Appender#append_hugeint` failed.
34
+ - add `DuckDB::PreparedStatement#bind_uhugeint`.
35
+
6
36
  # 1.2.0.0 - 2025-02-24
7
37
  - bump duckdb to 1.2.0.
8
38
  - add `DuckDB::LogicalType` class(Thanks to @otegami).
data/Dockerfile CHANGED
@@ -1,7 +1,7 @@
1
1
  ARG RUBY_VERSION=3.4.2
2
2
  FROM ruby:${RUBY_VERSION}
3
3
 
4
- ARG DUCKDB_VERSION=1.2.0
4
+ ARG DUCKDB_VERSION=1.2.2
5
5
  ARG VALGRIND_VERSION=3.21.0
6
6
 
7
7
  RUN apt update -qq && \
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- duckdb (1.2.0.0)
4
+ duckdb (1.2.2.0)
5
5
  bigdecimal (>= 3.1.4)
6
6
 
7
7
  GEM
@@ -10,23 +10,23 @@ GEM
10
10
  benchmark-ips (2.14.0)
11
11
  bigdecimal (3.1.9)
12
12
  mini_portile2 (2.8.8)
13
- minitest (5.25.4)
14
- nokogiri (1.18.3)
13
+ minitest (5.25.5)
14
+ nokogiri (1.18.8)
15
15
  mini_portile2 (~> 2.8.2)
16
16
  racc (~> 1.4)
17
- nokogiri (1.18.3-aarch64-linux-gnu)
17
+ nokogiri (1.18.8-aarch64-linux-gnu)
18
18
  racc (~> 1.4)
19
- nokogiri (1.18.3-arm-linux-gnu)
19
+ nokogiri (1.18.8-arm-linux-gnu)
20
20
  racc (~> 1.4)
21
- nokogiri (1.18.3-arm64-darwin)
21
+ nokogiri (1.18.8-arm64-darwin)
22
22
  racc (~> 1.4)
23
- nokogiri (1.18.3-x86_64-darwin)
23
+ nokogiri (1.18.8-x86_64-darwin)
24
24
  racc (~> 1.4)
25
- nokogiri (1.18.3-x86_64-linux-gnu)
25
+ nokogiri (1.18.8-x86_64-linux-gnu)
26
26
  racc (~> 1.4)
27
27
  racc (1.8.1)
28
28
  rake (13.2.1)
29
- rake-compiler (1.2.9)
29
+ rake-compiler (1.3.0)
30
30
  rake
31
31
  ruby_memcheck (3.0.1)
32
32
  nokogiri
@@ -13,20 +13,16 @@ static VALUE appender__append_int16(VALUE self, VALUE val);
13
13
  static VALUE appender__append_int32(VALUE self, VALUE val);
14
14
  static VALUE appender__append_int64(VALUE self, VALUE val);
15
15
  static VALUE appender__append_uint8(VALUE self, VALUE val);
16
- static VALUE appender_append_uint16(VALUE self, VALUE val);
17
- static VALUE appender_append_uint32(VALUE self, VALUE val);
18
- static VALUE appender_append_uint64(VALUE self, VALUE val);
19
- static VALUE appender_append_float(VALUE self, VALUE val);
20
- static VALUE appender_append_double(VALUE self, VALUE val);
21
- static VALUE appender_append_varchar(VALUE self, VALUE val);
22
- static VALUE appender_append_varchar_length(VALUE self, VALUE val, VALUE len);
23
- static VALUE appender_append_blob(VALUE self, VALUE val);
24
- static VALUE appender_append_null(VALUE self);
25
-
26
- #ifdef HAVE_DUCKDB_H_GE_V1_1_0
27
- static VALUE appender_append_default(VALUE self);
28
- #endif
29
-
16
+ static VALUE appender__append_uint16(VALUE self, VALUE val);
17
+ static VALUE appender__append_uint32(VALUE self, VALUE val);
18
+ static VALUE appender__append_uint64(VALUE self, VALUE val);
19
+ static VALUE appender__append_float(VALUE self, VALUE val);
20
+ static VALUE appender__append_double(VALUE self, VALUE val);
21
+ static VALUE appender__append_varchar(VALUE self, VALUE val);
22
+ static VALUE appender__append_varchar_length(VALUE self, VALUE val, VALUE len);
23
+ static VALUE appender__append_blob(VALUE self, VALUE val);
24
+ static VALUE appender__append_null(VALUE self);
25
+ static VALUE appender__append_default(VALUE self);
30
26
  static VALUE appender__end_row(VALUE self);
31
27
  static VALUE appender__append_date(VALUE self, VALUE yearval, VALUE monthval, VALUE dayval);
32
28
  static VALUE appender__append_interval(VALUE self, VALUE months, VALUE days, VALUE micros);
@@ -177,79 +173,68 @@ static VALUE appender__append_uint8(VALUE self, VALUE val) {
177
173
  return duckdb_state_to_bool_value(duckdb_append_uint8(ctx->appender, ui8val));
178
174
  }
179
175
 
180
- static VALUE appender_append_uint16(VALUE self, VALUE val) {
176
+ /* :nodoc: */
177
+ static VALUE appender__append_uint16(VALUE self, VALUE val) {
181
178
  rubyDuckDBAppender *ctx;
182
179
  uint16_t ui16val = (uint16_t)NUM2UINT(val);
183
180
 
184
181
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
185
182
 
186
- if (duckdb_append_uint16(ctx->appender, ui16val) == DuckDBError) {
187
- rb_raise(eDuckDBError, "failed to append uint16");
188
- }
189
- return self;
183
+ return duckdb_state_to_bool_value(duckdb_append_uint16(ctx->appender, ui16val));
190
184
  }
191
185
 
192
- static VALUE appender_append_uint32(VALUE self, VALUE val) {
186
+ /* :nodoc: */
187
+ static VALUE appender__append_uint32(VALUE self, VALUE val) {
193
188
  rubyDuckDBAppender *ctx;
194
189
  uint32_t ui32val = (uint32_t)NUM2UINT(val);
195
190
 
196
191
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
197
192
 
198
- if (duckdb_append_uint32(ctx->appender, ui32val) == DuckDBError) {
199
- rb_raise(eDuckDBError, "failed to append uint32");
200
- }
201
- return self;
193
+ return duckdb_state_to_bool_value(duckdb_append_uint32(ctx->appender, ui32val));
202
194
  }
203
195
 
204
- static VALUE appender_append_uint64(VALUE self, VALUE val) {
196
+ /* :nodoc: */
197
+ static VALUE appender__append_uint64(VALUE self, VALUE val) {
205
198
  rubyDuckDBAppender *ctx;
206
199
  uint64_t ui64val = (uint64_t)NUM2ULL(val);
207
200
 
208
201
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
209
202
 
210
- if (duckdb_append_uint64(ctx->appender, ui64val) == DuckDBError) {
211
- rb_raise(eDuckDBError, "failed to append uint64");
212
- }
213
- return self;
203
+ return duckdb_state_to_bool_value(duckdb_append_uint64(ctx->appender, ui64val));
214
204
  }
215
205
 
216
- static VALUE appender_append_float(VALUE self, VALUE val) {
206
+ /* :nodoc: */
207
+ static VALUE appender__append_float(VALUE self, VALUE val) {
217
208
  rubyDuckDBAppender *ctx;
218
209
  float fval = (float)NUM2DBL(val);
219
210
 
220
211
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
221
212
 
222
- if (duckdb_append_float(ctx->appender, fval) == DuckDBError) {
223
- rb_raise(eDuckDBError, "failed to append float");
224
- }
225
- return self;
213
+ return duckdb_state_to_bool_value(duckdb_append_float(ctx->appender, fval));
226
214
  }
227
215
 
228
- static VALUE appender_append_double(VALUE self, VALUE val) {
216
+ /* :nodoc: */
217
+ static VALUE appender__append_double(VALUE self, VALUE val) {
229
218
  rubyDuckDBAppender *ctx;
230
219
  double dval = NUM2DBL(val);
231
220
 
232
221
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
233
222
 
234
- if (duckdb_append_double(ctx->appender, dval) == DuckDBError) {
235
- rb_raise(eDuckDBError, "failed to append double");
236
- }
237
- return self;
223
+ return duckdb_state_to_bool_value(duckdb_append_double(ctx->appender, dval));
238
224
  }
239
225
 
240
- static VALUE appender_append_varchar(VALUE self, VALUE val) {
226
+ /* :nodoc: */
227
+ static VALUE appender__append_varchar(VALUE self, VALUE val) {
241
228
  rubyDuckDBAppender *ctx;
242
229
  char *pval = StringValuePtr(val);
243
230
 
244
231
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
245
232
 
246
- if (duckdb_append_varchar(ctx->appender, pval) == DuckDBError) {
247
- rb_raise(eDuckDBError, "failed to append varchar");
248
- }
249
- return self;
233
+ return duckdb_state_to_bool_value(duckdb_append_varchar(ctx->appender, pval));
250
234
  }
251
235
 
252
- static VALUE appender_append_varchar_length(VALUE self, VALUE val, VALUE len) {
236
+ /* :nodoc: */
237
+ static VALUE appender__append_varchar_length(VALUE self, VALUE val, VALUE len) {
253
238
  rubyDuckDBAppender *ctx;
254
239
 
255
240
  char *pval = StringValuePtr(val);
@@ -257,13 +242,11 @@ static VALUE appender_append_varchar_length(VALUE self, VALUE val, VALUE len) {
257
242
 
258
243
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
259
244
 
260
- if (duckdb_append_varchar_length(ctx->appender, pval, length) == DuckDBError) {
261
- rb_raise(eDuckDBError, "failed to append varchar with length");
262
- }
263
- return self;
245
+ return duckdb_state_to_bool_value(duckdb_append_varchar_length(ctx->appender, pval, length));
264
246
  }
265
247
 
266
- static VALUE appender_append_blob(VALUE self, VALUE val) {
248
+ /* :nodoc: */
249
+ static VALUE appender__append_blob(VALUE self, VALUE val) {
267
250
  rubyDuckDBAppender *ctx;
268
251
 
269
252
  char *pval = StringValuePtr(val);
@@ -271,33 +254,24 @@ static VALUE appender_append_blob(VALUE self, VALUE val) {
271
254
 
272
255
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
273
256
 
274
- if (duckdb_append_blob(ctx->appender, (void *)pval, length) == DuckDBError) {
275
- rb_raise(eDuckDBError, "failed to append blob");
276
- }
277
- return self;
257
+ return duckdb_state_to_bool_value(duckdb_append_blob(ctx->appender, (void *)pval, length));
278
258
  }
279
259
 
280
- static VALUE appender_append_null(VALUE self) {
260
+ /* :nodoc: */
261
+ static VALUE appender__append_null(VALUE self) {
281
262
  rubyDuckDBAppender *ctx;
282
263
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
283
264
 
284
- if (duckdb_append_null(ctx->appender) == DuckDBError) {
285
- rb_raise(eDuckDBError, "failed to append null");
286
- }
287
- return self;
265
+ return duckdb_state_to_bool_value(duckdb_append_null(ctx->appender));
288
266
  }
289
267
 
290
- #ifdef HAVE_DUCKDB_H_GE_V1_1_0
291
- static VALUE appender_append_default(VALUE self) {
268
+ /* :nodoc: */
269
+ static VALUE appender__append_default(VALUE self) {
292
270
  rubyDuckDBAppender *ctx;
293
271
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
294
272
 
295
- if (duckdb_append_default(ctx->appender) == DuckDBError) {
296
- rb_raise(eDuckDBError, "failed to append default");
297
- }
298
- return self;
273
+ return duckdb_state_to_bool_value(duckdb_append_default(ctx->appender));
299
274
  }
300
- #endif
301
275
 
302
276
  /* :nodoc: */
303
277
  static VALUE appender__append_date(VALUE self, VALUE year, VALUE month, VALUE day) {
@@ -307,10 +281,7 @@ static VALUE appender__append_date(VALUE self, VALUE year, VALUE month, VALUE da
307
281
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
308
282
  dt = rbduckdb_to_duckdb_date_from_value(year, month, day);
309
283
 
310
- if (duckdb_append_date(ctx->appender, dt) == DuckDBError) {
311
- rb_raise(eDuckDBError, "failed to append date");
312
- }
313
- return self;
284
+ return duckdb_state_to_bool_value(duckdb_append_date(ctx->appender, dt));
314
285
  }
315
286
 
316
287
  /* :nodoc: */
@@ -321,10 +292,7 @@ static VALUE appender__append_interval(VALUE self, VALUE months, VALUE days, VAL
321
292
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
322
293
  rbduckdb_to_duckdb_interval_from_value(&interval, months, days, micros);
323
294
 
324
- if (duckdb_append_interval(ctx->appender, interval) == DuckDBError) {
325
- rb_raise(eDuckDBError, "failed to append interval");
326
- }
327
- return self;
295
+ return duckdb_state_to_bool_value(duckdb_append_interval(ctx->appender, interval));
328
296
  }
329
297
 
330
298
  /* :nodoc: */
@@ -335,10 +303,7 @@ static VALUE appender__append_time(VALUE self, VALUE hour, VALUE min, VALUE sec,
335
303
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
336
304
  time = rbduckdb_to_duckdb_time_from_value(hour, min, sec, micros);
337
305
 
338
- if (duckdb_append_time(ctx->appender, time) == DuckDBError) {
339
- rb_raise(eDuckDBError, "failed to append time");
340
- }
341
- return self;
306
+ return duckdb_state_to_bool_value(duckdb_append_time(ctx->appender, time));
342
307
  }
343
308
 
344
309
  /* :nodoc: */
@@ -351,10 +316,7 @@ static VALUE appender__append_timestamp(VALUE self, VALUE year, VALUE month, VAL
351
316
 
352
317
  timestamp = rbduckdb_to_duckdb_timestamp_from_value(year, month, day, hour, min, sec, micros);
353
318
 
354
- if (duckdb_append_timestamp(ctx->appender, timestamp) == DuckDBError) {
355
- rb_raise(eDuckDBError, "failed to append timestamp");
356
- }
357
- return self;
319
+ return duckdb_state_to_bool_value(duckdb_append_timestamp(ctx->appender, timestamp));
358
320
  }
359
321
 
360
322
  /* :nodoc: */
@@ -367,10 +329,8 @@ static VALUE appender__append_hugeint(VALUE self, VALUE lower, VALUE upper) {
367
329
  rubyDuckDBAppender *ctx;
368
330
 
369
331
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
370
- if (duckdb_append_hugeint(ctx->appender, hugeint) == DuckDBError) {
371
- rb_raise(eDuckDBError, "failed to append hugeint");
372
- }
373
- return self;
332
+
333
+ return duckdb_state_to_bool_value(duckdb_append_hugeint(ctx->appender, hugeint));
374
334
  }
375
335
 
376
336
  /* :nodoc: */
@@ -383,10 +343,8 @@ static VALUE appender__append_uhugeint(VALUE self, VALUE lower, VALUE upper) {
383
343
  rubyDuckDBAppender *ctx;
384
344
 
385
345
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
386
- if (duckdb_append_uhugeint(ctx->appender, uhugeint) == DuckDBError) {
387
- rb_raise(eDuckDBError, "failed to append uhugeint");
388
- }
389
- return self;
346
+
347
+ return duckdb_state_to_bool_value(duckdb_append_uhugeint(ctx->appender, uhugeint));
390
348
  }
391
349
 
392
350
  /* :nodoc: */
@@ -420,20 +378,6 @@ void rbduckdb_init_duckdb_appender(void) {
420
378
  rb_define_alloc_func(cDuckDBAppender, allocate);
421
379
  rb_define_method(cDuckDBAppender, "initialize", appender_initialize, 3);
422
380
  rb_define_method(cDuckDBAppender, "error_message", appender_error_message, 0);
423
- rb_define_method(cDuckDBAppender, "append_uint16", appender_append_uint16, 1);
424
- rb_define_method(cDuckDBAppender, "append_uint32", appender_append_uint32, 1);
425
- rb_define_method(cDuckDBAppender, "append_uint64", appender_append_uint64, 1);
426
- rb_define_method(cDuckDBAppender, "append_float", appender_append_float, 1);
427
- rb_define_method(cDuckDBAppender, "append_double", appender_append_double, 1);
428
- rb_define_method(cDuckDBAppender, "append_varchar", appender_append_varchar, 1);
429
- rb_define_method(cDuckDBAppender, "append_varchar_length", appender_append_varchar_length, 2);
430
- rb_define_method(cDuckDBAppender, "append_blob", appender_append_blob, 1);
431
- rb_define_method(cDuckDBAppender, "append_null", appender_append_null, 0);
432
-
433
- #ifdef HAVE_DUCKDB_H_GE_V1_1_0
434
- rb_define_method(cDuckDBAppender, "append_default", appender_append_default, 0);
435
- #endif
436
-
437
381
  rb_define_private_method(cDuckDBAppender, "_end_row", appender__end_row, 0);
438
382
  rb_define_private_method(cDuckDBAppender, "_flush", appender__flush, 0);
439
383
  rb_define_private_method(cDuckDBAppender, "_close", appender__close, 0);
@@ -443,6 +387,16 @@ void rbduckdb_init_duckdb_appender(void) {
443
387
  rb_define_private_method(cDuckDBAppender, "_append_int32", appender__append_int32, 1);
444
388
  rb_define_private_method(cDuckDBAppender, "_append_int64", appender__append_int64, 1);
445
389
  rb_define_private_method(cDuckDBAppender, "_append_uint8", appender__append_uint8, 1);
390
+ rb_define_private_method(cDuckDBAppender, "_append_uint16", appender__append_uint16, 1);
391
+ rb_define_private_method(cDuckDBAppender, "_append_uint32", appender__append_uint32, 1);
392
+ rb_define_private_method(cDuckDBAppender, "_append_uint64", appender__append_uint64, 1);
393
+ rb_define_private_method(cDuckDBAppender, "_append_float", appender__append_float, 1);
394
+ rb_define_private_method(cDuckDBAppender, "_append_double", appender__append_double, 1);
395
+ rb_define_private_method(cDuckDBAppender, "_append_varchar", appender__append_varchar, 1);
396
+ rb_define_private_method(cDuckDBAppender, "_append_varchar_length", appender__append_varchar_length, 2);
397
+ rb_define_private_method(cDuckDBAppender, "_append_blob", appender__append_blob, 1);
398
+ rb_define_private_method(cDuckDBAppender, "_append_null", appender__append_null, 0);
399
+ rb_define_private_method(cDuckDBAppender, "_append_default", appender__append_default, 0);
446
400
  rb_define_private_method(cDuckDBAppender, "_append_date", appender__append_date, 3);
447
401
  rb_define_private_method(cDuckDBAppender, "_append_interval", appender__append_interval, 3);
448
402
  rb_define_private_method(cDuckDBAppender, "_append_time", appender__append_time, 4);
@@ -118,6 +118,14 @@ static VALUE duckdb_database_close(VALUE self) {
118
118
  return self;
119
119
  }
120
120
 
121
+ VALUE rbduckdb_create_database_obj(duckdb_database db) {
122
+ VALUE obj = allocate(cDuckDBDatabase);
123
+ rubyDuckDB *ctx;
124
+ TypedData_Get_Struct(obj, rubyDuckDB, &database_data_type, ctx);
125
+ ctx->db = db;
126
+ return obj;
127
+ }
128
+
121
129
  void rbduckdb_init_duckdb_database(void) {
122
130
  #if 0
123
131
  VALUE mDuckDB = rb_define_module("DuckDB");
@@ -8,6 +8,7 @@ struct _rubyDuckDB {
8
8
  typedef struct _rubyDuckDB rubyDuckDB;
9
9
 
10
10
  rubyDuckDB *rbduckdb_get_struct_database(VALUE obj);
11
+ VALUE rbduckdb_create_database_obj(duckdb_database db);
11
12
  void rbduckdb_init_duckdb_database(void);
12
13
 
13
14
  #endif
data/ext/duckdb/duckdb.c CHANGED
@@ -39,4 +39,7 @@ Init_duckdb_native(void) {
39
39
  rbduckdb_init_duckdb_config();
40
40
  rbduckdb_init_duckdb_converter();
41
41
  rbduckdb_init_duckdb_extracted_statements();
42
+ #ifdef HAVE_DUCKDB_H_GE_V1_2_0
43
+ rbduckdb_init_duckdb_instance_cache();
44
+ #endif
42
45
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mkmf'
4
4
 
5
- DUCKDB_REQUIRED_VERSION = '1.0.0'
5
+ DUCKDB_REQUIRED_VERSION = '1.1.0'
6
6
 
7
7
  def check_duckdb_header(header, version)
8
8
  found = find_header(
@@ -56,14 +56,14 @@ end
56
56
  dir_config('duckdb')
57
57
 
58
58
  check_duckdb_header('duckdb.h', DUCKDB_REQUIRED_VERSION)
59
- check_duckdb_library('duckdb', 'duckdb_appender_column_count', DUCKDB_REQUIRED_VERSION)
60
-
61
- # check duckdb >= 1.0.0
62
- have_func('duckdb_fetch_chunk', 'duckdb.h')
59
+ check_duckdb_library('duckdb', 'duckdb_result_error_type', DUCKDB_REQUIRED_VERSION)
63
60
 
64
61
  # check duckdb >= 1.1.0
65
62
  have_func('duckdb_result_error_type', 'duckdb.h')
66
63
 
64
+ # check duckdb >= 1.2.0
65
+ have_func('duckdb_create_instance_cache', 'duckdb.h')
66
+
67
67
  # Building with enabled DUCKDB_API_NO_DEPRECATED is failed with DuckDB v1.1.0 only.
68
68
  # DuckDB v1.1.1 is fixed this issue https://github.com/duckdb/duckdb/issues/13872.
69
69
  have_const('DUCKDB_TYPE_SQLNULL', 'duckdb.h')
@@ -0,0 +1,108 @@
1
+ #include "ruby-duckdb.h"
2
+
3
+ #ifdef HAVE_DUCKDB_H_GE_V1_2_0
4
+ VALUE cDuckDBInstanceCache;
5
+
6
+ static void deallocate(void * ctx);
7
+ static VALUE allocate(VALUE klass);
8
+ static size_t memsize(const void *p);
9
+ static VALUE duckdb_instance_cache_initialize(VALUE self);
10
+ static VALUE duckdb_instance_cache_get_or_create(int argc, VALUE *argv, VALUE self);
11
+ static VALUE duckdb_instance_cache_destroy(VALUE self);
12
+
13
+ static const rb_data_type_t instance_cache_data_type = {
14
+ "DuckDB/InstanceCache",
15
+ {NULL, deallocate, memsize,},
16
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
17
+ };
18
+
19
+ static void deallocate(void * ctx) {
20
+ rubyDuckDBInstanceCache *p = (rubyDuckDBInstanceCache *)ctx;
21
+
22
+ if (p->instance_cache) {
23
+ duckdb_destroy_instance_cache(&(p->instance_cache));
24
+ }
25
+ xfree(p);
26
+ }
27
+
28
+ static size_t memsize(const void *p) {
29
+ return sizeof(rubyDuckDBInstanceCache);
30
+ }
31
+
32
+ static VALUE allocate(VALUE klass) {
33
+ rubyDuckDBInstanceCache *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBInstanceCache));
34
+ return TypedData_Wrap_Struct(klass, &instance_cache_data_type, ctx);
35
+ }
36
+
37
+ static VALUE duckdb_instance_cache_initialize(VALUE self) {
38
+ rubyDuckDBInstanceCache *ctx;
39
+
40
+ TypedData_Get_Struct(self, rubyDuckDBInstanceCache, &instance_cache_data_type, ctx);
41
+
42
+ ctx->instance_cache = duckdb_create_instance_cache();
43
+ if (ctx->instance_cache == NULL) {
44
+ rb_raise(eDuckDBError, "Failed to create instance cache");
45
+ }
46
+
47
+ return self;
48
+ }
49
+
50
+ /* :nodoc: */
51
+ static VALUE duckdb_instance_cache_get_or_create(int argc, VALUE *argv, VALUE self) {
52
+ VALUE vpath = Qnil;
53
+ VALUE vconfig = Qnil;
54
+ const char *path = NULL;
55
+ char *error = NULL;
56
+ duckdb_config config = NULL;
57
+ duckdb_database db;
58
+ rubyDuckDBInstanceCache *ctx;
59
+
60
+ rb_scan_args(argc, argv, "02", &vpath, &vconfig);
61
+ if (!NIL_P(vpath)) {
62
+ path = StringValuePtr(vpath);
63
+ }
64
+ if (!NIL_P(vconfig)) {
65
+ if (!rb_obj_is_kind_of(vconfig, cDuckDBConfig)) {
66
+ rb_raise(rb_eTypeError, "The second argument must be DuckDB::Config object.");
67
+ }
68
+ rubyDuckDBConfig *ctx_config = get_struct_config(vconfig);
69
+ config = ctx_config->config;
70
+ }
71
+
72
+ TypedData_Get_Struct(self, rubyDuckDBInstanceCache, &instance_cache_data_type, ctx);
73
+
74
+ if (duckdb_get_or_create_from_cache(ctx->instance_cache, path, &db, config, &error) == DuckDBError) {
75
+ if (error) {
76
+ VALUE message = rb_str_new_cstr(error);
77
+ duckdb_free(error);
78
+ rb_raise(eDuckDBError, "%s", StringValuePtr(message));
79
+ } else {
80
+ rb_raise(eDuckDBError, "Failed to get or create database from instance cache");
81
+ }
82
+ }
83
+ return rbduckdb_create_database_obj(db);
84
+ }
85
+
86
+ static VALUE duckdb_instance_cache_destroy(VALUE self) {
87
+ rubyDuckDBInstanceCache *ctx;
88
+ TypedData_Get_Struct(self, rubyDuckDBInstanceCache, &instance_cache_data_type, ctx);
89
+
90
+ if (ctx->instance_cache) {
91
+ duckdb_destroy_instance_cache(&(ctx->instance_cache));
92
+ ctx->instance_cache = NULL;
93
+ }
94
+
95
+ return Qnil;
96
+ }
97
+
98
+ void rbduckdb_init_duckdb_instance_cache(void) {
99
+ #if 0
100
+ VALUE mDuckDB = rb_define_module("DuckDB");
101
+ #endif
102
+ cDuckDBInstanceCache = rb_define_class_under(mDuckDB, "InstanceCache", rb_cObject);
103
+ rb_define_method(cDuckDBInstanceCache, "initialize", duckdb_instance_cache_initialize, 0);
104
+ rb_define_method(cDuckDBInstanceCache, "get_or_create", duckdb_instance_cache_get_or_create, -1);
105
+ rb_define_method(cDuckDBInstanceCache, "destroy", duckdb_instance_cache_destroy, 0);
106
+ rb_define_alloc_func(cDuckDBInstanceCache, allocate);
107
+ }
108
+ #endif
@@ -0,0 +1,17 @@
1
+ #ifndef RUBY_DUCKDB_INSTANCE_CACHE_H
2
+ #define RUBY_DUCKDB_INSTANCE_CACHE_H
3
+
4
+ #ifdef HAVE_DUCKDB_H_GE_V1_2_0
5
+
6
+ struct _rubyDuckDBInstanceCache {
7
+ duckdb_instance_cache instance_cache;
8
+ };
9
+
10
+ typedef struct _rubyDuckDBInstanceCache rubyDuckDBInstanceCache;
11
+
12
+ void rbduckdb_init_duckdb_instance_cache(void);
13
+
14
+ #endif
15
+
16
+ #endif
17
+