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 +4 -4
- data/.github/workflows/test_on_macos.yml +2 -2
- data/.github/workflows/test_on_ubuntu.yml +2 -2
- data/.github/workflows/test_on_windows.yml +3 -2
- data/CHANGELOG.md +30 -0
- data/Dockerfile +1 -1
- data/Gemfile.lock +9 -9
- data/ext/duckdb/appender.c +58 -104
- data/ext/duckdb/database.c +8 -0
- data/ext/duckdb/database.h +1 -0
- data/ext/duckdb/duckdb.c +3 -0
- data/ext/duckdb/extconf.rb +5 -5
- data/ext/duckdb/instance_cache.c +108 -0
- data/ext/duckdb/instance_cache.h +17 -0
- data/ext/duckdb/logical_type.c +255 -0
- data/ext/duckdb/prepared_statement.c +89 -3
- data/ext/duckdb/result.c +1 -1
- data/ext/duckdb/ruby-duckdb.h +12 -8
- data/lib/duckdb/appender.rb +263 -24
- data/lib/duckdb/instance_cache.rb +26 -0
- data/lib/duckdb/logical_type.rb +131 -0
- data/lib/duckdb/prepared_statement.rb +58 -1
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +1 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dc90028f52da778feed9afafb7e1bddfa8128120dea8c798fec4c21317cc8e1
|
4
|
+
data.tar.gz: 5cb1ae0ae04c712c0edcd5dc61ac7a05c12e6ee59c7c72a113f8ea3a8012aa2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
19
|
-
duckdb: ['1.2.
|
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.
|
19
|
-
duckdb: ['1.2.
|
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.
|
19
|
-
|
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
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
duckdb (1.2.
|
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.
|
14
|
-
nokogiri (1.18.
|
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.
|
17
|
+
nokogiri (1.18.8-aarch64-linux-gnu)
|
18
18
|
racc (~> 1.4)
|
19
|
-
nokogiri (1.18.
|
19
|
+
nokogiri (1.18.8-arm-linux-gnu)
|
20
20
|
racc (~> 1.4)
|
21
|
-
nokogiri (1.18.
|
21
|
+
nokogiri (1.18.8-arm64-darwin)
|
22
22
|
racc (~> 1.4)
|
23
|
-
nokogiri (1.18.
|
23
|
+
nokogiri (1.18.8-x86_64-darwin)
|
24
24
|
racc (~> 1.4)
|
25
|
-
nokogiri (1.18.
|
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.
|
29
|
+
rake-compiler (1.3.0)
|
30
30
|
rake
|
31
31
|
ruby_memcheck (3.0.1)
|
32
32
|
nokogiri
|
data/ext/duckdb/appender.c
CHANGED
@@ -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
|
17
|
-
static VALUE
|
18
|
-
static VALUE
|
19
|
-
static VALUE
|
20
|
-
static VALUE
|
21
|
-
static VALUE
|
22
|
-
static VALUE
|
23
|
-
static VALUE
|
24
|
-
static VALUE
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
291
|
-
static VALUE
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
371
|
-
|
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
|
-
|
387
|
-
|
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);
|
data/ext/duckdb/database.c
CHANGED
@@ -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");
|
data/ext/duckdb/database.h
CHANGED
data/ext/duckdb/duckdb.c
CHANGED
data/ext/duckdb/extconf.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'mkmf'
|
4
4
|
|
5
|
-
DUCKDB_REQUIRED_VERSION = '1.
|
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', '
|
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
|
+
|