duckdb 0.5.1.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5490148631798723186b5440e514abb7e4969b3364777cc3f065a0d1b0aba08e
4
- data.tar.gz: 18c3c6ec97ba3f72ce1dc9251c084ea56ad889734d759b0e73caee93a86a7390
3
+ metadata.gz: d4780513bea94513e38b460cf9580b9bad9b9128d913a46f58f2054451cf838d
4
+ data.tar.gz: 5cbfe5da32da9562d121d634a7a45fdc153222bb4c5b8c79a2f37dbff6f57f27
5
5
  SHA512:
6
- metadata.gz: 457636af582f3850bd46d145f59783df209c7a7c170ce4f721f4999df4e43d6e580f39f43a92836b179d230afeae05e2e73ca3bcbee8b709680bb6c7b2ffc2f0
7
- data.tar.gz: e62d2629728f47909118eaad24bd78032f4baa09f541464f5605c9309fb1cd71eb7a24ea8ca9ebb78a56d0081d9d2586b1a02ee4dcf50ba8b5ed3ca2eb92a2ad
6
+ metadata.gz: 04acc6297bac9ae7d217072d1fec3b7c603f407270143d654f738462e0f540a2e8ebdb67fa4d466ff13636dab279a0d245241201c9b3f829f4e97fbf628fb086
7
+ data.tar.gz: aa200fce49d05edee27095771e4c7e394a7431b8b1881e58d053f46dafc628920e4924c899159619c2fd337c6607eeed55f5863ea0e119f13ec2236d72c33f6b
@@ -15,11 +15,11 @@ jobs:
15
15
  runs-on: macos-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', '3.2.0-preview2', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
18
+ ruby: ['2.7.7', '3.0.5', '3.1.3', '3.2.1', 'head']
19
+ duckdb: ['0.7.0', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
@@ -28,7 +28,7 @@ jobs:
28
28
 
29
29
  - name: duckdb cache
30
30
  id: duckdb-cache
31
- uses: actions/cache@v2
31
+ uses: actions/cache@v3
32
32
  with:
33
33
  path: duckdb-v${{ matrix.duckdb }}
34
34
  key: ${{ runner.os }}-duckdb-v${{ matrix.duckdb }}
@@ -15,11 +15,11 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', '3.2.0-preview2', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
18
+ ruby: ['2.7.7', '3.0.5', '3.1.3', '3.2.1', 'head']
19
+ duckdb: ['0.7.0', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
@@ -28,7 +28,7 @@ jobs:
28
28
 
29
29
  - name: duckdb cache
30
30
  id: duckdb-cache
31
- uses: actions/cache@v2
31
+ uses: actions/cache@v3
32
32
  with:
33
33
  path: duckdb-v${{ matrix.duckdb }}
34
34
  key: ${{ runner.os }}-duckdb-v${{ matrix.duckdb }}
@@ -15,11 +15,11 @@ jobs:
15
15
  runs-on: windows-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', 'ucrt', 'mingw', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
18
+ ruby: ['2.7.7', '3.0.5', '3.1.3', '3.2.1', 'ucrt', 'mingw', 'mswin', 'head']
19
+ duckdb: ['0.7.0', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -1,16 +1,43 @@
1
1
  # ChangeLog
2
2
 
3
+ # 0.7.0
4
+ - bump duckdb to 0.7.0
5
+ - fix have_func argument order
6
+ - remove unused variable in test
7
+ - add DuckDB::LIBRARY_VERSION
8
+ - add DuckDB::Result#_to_string_internal
9
+ - add DuckDB::Result#__to_hugeint_internal
10
+ - add DuckDB::Result#__to_decimal_internal
11
+ - add Ruby 3.2.1 on CI test
12
+ - add Ruby mswin on CI test
13
+ ## Breaking Change
14
+ - drop Ruby 2.6
15
+
16
+ # 0.6.1
17
+ - bump Ruby to 3.2.0 on CI
18
+ - fix deprected warning (double_heap is deprecated in GC.verify_compaction_references) with Ruby 3.2.0 on CI
19
+ - bump duckdb to 0.6.1 on CI
20
+ - add DuckDB::PreparedStatement#bind_hugeint_internal
21
+ - fix gem install error on M1 MacOS
22
+ - implement DuckDB.library_version
23
+ - use duckdb_value_string instead of duckdb_value_varchar if duckdb_value_string is available.
24
+ - bump Ruby to 3.2.0rc1
25
+ - bump duckdb to 0.6.0
26
+
27
+ ## Breaking Change
28
+ - drop duckdb <= 0.4.x. ruby-duckdb supports duckdb >= 0.5.0
29
+
3
30
  # 0.5.1.1
4
31
  - bug fix: reading the boolean column
5
32
 
6
33
  # 0.5.1
7
- - bump duckdb 0.5.1
34
+ - bump duckdb to 0.5.1
8
35
 
9
36
  # 0.5.0
10
37
  - update bundle version of Gemfile.lock
11
38
  - add ruby ucrt test on Windows
12
39
  - use TypedData_Wrap_Struct, TypedData_Get_Struct
13
- - bump duckdb 0.5.0
40
+ - bump duckdb to 0.5.0
14
41
  - fix utf-8 encoding.
15
42
  - add DuckDB::Result#enum_dictionary_values
16
43
  - add DuckDB::Result#row_count, DuckDB::Result#row_size(alias of row_count).
@@ -20,19 +47,19 @@
20
47
  - bind_varchar does not raised DuckDB::Error when the binding column is date or datetime.
21
48
 
22
49
  # 0.3.4.0
23
- - bump duckdb 0.3.4
50
+ - bump duckdb to 0.3.4
24
51
 
25
52
  # 0.3.3.0
26
53
  - DuckDB::Column#type supports :decimal.
27
- - bump duckdb 0.3.3.
28
- - bump Ruby 2.6.10, 2.7.6, 3.0.4, 3.1.2.
54
+ - bump duckdb to 0.3.3.
55
+ - bump Ruby to 2.6.10, 2.7.6, 3.0.4, 3.1.2.
29
56
 
30
57
  # 0.3.2.0
31
58
 
32
59
  - bind_time, bind_timestamp, bind_date, bind_timeinterval to DuckDB::PreparedStatement
33
60
  - bump duckdb 0.3.2
34
- - bump Ruby 3.1.1, add Ruby mingw in CI.
35
- - bump Ruby 2.6.9, 2.7.5, 3.0.3 in CI.
61
+ - bump Ruby to 3.1.1, add Ruby mingw in CI.
62
+ - bump Ruby to 2.6.9, 2.7.5, 3.0.3 in CI.
36
63
 
37
64
  ## BREAKING CHANGE
38
65
  - drop duckdb <= 0.2.8
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- duckdb (0.5.1.1)
4
+ duckdb (0.7.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- minitest (5.16.3)
9
+ minitest (5.17.0)
10
10
  rake (13.0.6)
11
- rake-compiler (1.2.0)
11
+ rake-compiler (1.2.1)
12
12
  rake
13
13
 
14
14
  PLATFORMS
data/duckdb.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  end
27
27
  spec.require_paths = ['lib']
28
28
  spec.extensions = ['ext/duckdb/extconf.rb']
29
- spec.required_ruby_version = '>= 2.6.0'
29
+ spec.required_ruby_version = '>= 2.7.0'
30
30
 
31
31
  spec.add_development_dependency 'bundler', '~> 2.3'
32
32
  spec.add_development_dependency 'minitest', '~> 5.0'
data/ext/duckdb/duckdb.c CHANGED
@@ -2,10 +2,24 @@
2
2
 
3
3
  VALUE mDuckDB;
4
4
 
5
+ #ifdef HAVE_DUCKDB_H_GE_V060
6
+ static VALUE duckdb_s_library_version(VALUE self);
7
+ #endif
8
+
9
+ #ifdef HAVE_DUCKDB_H_GE_V060
10
+ static VALUE duckdb_s_library_version(VALUE self) {
11
+ return rb_str_new2(duckdb_library_version());
12
+ }
13
+ #endif
14
+
5
15
  void
6
16
  Init_duckdb_native(void) {
7
17
  mDuckDB = rb_define_module("DuckDB");
8
18
 
19
+ #ifdef HAVE_DUCKDB_H_GE_V060
20
+ rb_define_singleton_method(mDuckDB, "library_version", duckdb_s_library_version, 0);
21
+ #endif
22
+
9
23
  init_duckdb_error();
10
24
  init_duckdb_database();
11
25
  init_duckdb_connection();
@@ -1,15 +1,34 @@
1
1
  require 'mkmf'
2
2
 
3
- dir_config('duckdb')
3
+ def duckdb_library_available?(func)
4
+ header = find_header('duckdb.h') || find_header('duckdb.h', '/opt/homebrew/include')
5
+ library = have_func(func, 'duckdb.h') || find_library('duckdb', func, '/opt/homebrew/opt/duckdb/lib')
6
+ header && library
7
+ end
8
+
9
+ def check_duckdb_library(func, version)
10
+ return if duckdb_library_available?(func)
4
11
 
5
- raise 'duckdb library is not found. Install duckdb library file and header file.' unless have_library('duckdb')
12
+ msg = "duckdb >= #{version} is not found. Install duckdb >= #{version} library and header file."
13
+ puts ''
14
+ puts '*' * 80
15
+ puts msg
16
+ puts '*' * 80
17
+ puts ''
18
+ raise msg
19
+ end
6
20
 
7
- raise 'duckdb >= 0.2.9 is required. Install duckdb >= 0.2.9' unless have_func('duckdb_value_is_null', 'duckdb.h')
21
+ dir_config('duckdb')
22
+
23
+ check_duckdb_library('duckdb_pending_prepared', '0.5.0')
8
24
 
9
25
  # check duckdb >= 0.3.3
10
26
  # ducdb >= 0.3.3 if duckdb_append_data_chunk() is defined.
11
27
  have_func('duckdb_append_data_chunk', 'duckdb.h')
12
28
 
29
+ # check duckdb >= 0.6.0
30
+ have_func('duckdb_value_string', 'duckdb.h')
31
+
13
32
  have_func('duckdb_free', 'duckdb.h')
14
33
 
15
34
  create_makefile('duckdb/duckdb_native')
@@ -23,6 +23,7 @@ static VALUE duckdb_prepared_statement__bind_date(VALUE self, VALUE vidx, VALUE
23
23
  static VALUE duckdb_prepared_statement__bind_time(VALUE self, VALUE vidx, VALUE hour, VALUE min, VALUE sec, VALUE micros);
24
24
  static VALUE duckdb_prepared_statement__bind_timestamp(VALUE self, VALUE vidx, VALUE year, VALUE month, VALUE day, VALUE hour, VALUE min, VALUE sec, VALUE micros);
25
25
  static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VALUE months, VALUE days, VALUE micros);
26
+ static VALUE duckdb_prepared_statement__bind_hugeint(VALUE self, VALUE vidx, VALUE lower, VALUE upper);
26
27
 
27
28
  static const rb_data_type_t prepared_statement_data_type = {
28
29
  "DuckDB/PreparedStatement",
@@ -283,6 +284,22 @@ static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VA
283
284
  return self;
284
285
  }
285
286
 
287
+ static VALUE duckdb_prepared_statement__bind_hugeint(VALUE self, VALUE vidx, VALUE lower, VALUE upper) {
288
+ duckdb_hugeint hugeint;
289
+ rubyDuckDBPreparedStatement *ctx;
290
+ idx_t idx = check_index(vidx);
291
+
292
+ TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
293
+ hugeint.lower = NUM2ULL(lower);
294
+ hugeint.upper = NUM2LL(upper);
295
+
296
+ if (duckdb_bind_hugeint(ctx->prepared_statement, idx, hugeint) == DuckDBError) {
297
+ rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
298
+ }
299
+
300
+ return self;
301
+ }
302
+
286
303
  void init_duckdb_prepared_statement(void) {
287
304
  cDuckDBPreparedStatement = rb_define_class_under(mDuckDB, "PreparedStatement", rb_cObject);
288
305
 
@@ -305,4 +322,5 @@ void init_duckdb_prepared_statement(void) {
305
322
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_time", duckdb_prepared_statement__bind_time, 5);
306
323
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_timestamp", duckdb_prepared_statement__bind_timestamp, 8);
307
324
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_interval", duckdb_prepared_statement__bind_interval, 4);
325
+ rb_define_private_method(cDuckDBPreparedStatement, "_bind_hugeint", duckdb_prepared_statement__bind_hugeint, 3);
308
326
  }
data/ext/duckdb/result.c CHANGED
@@ -10,6 +10,8 @@ static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t ro
10
10
  static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
11
11
  static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx);
12
12
  static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
13
+ static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
14
+ static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx);
13
15
  static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx);
14
16
  static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx);
15
17
  static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx);
@@ -24,9 +26,12 @@ static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALU
24
26
  static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
25
27
  static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
26
28
  static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
29
+ static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
30
+ static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
27
31
  static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
28
32
  static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
29
33
  static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
34
+ static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
30
35
  static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
31
36
  static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx);
32
37
  static VALUE duckdb_result__enum_dictionary_size(VALUE oDuckDBResult, VALUE col_idx);
@@ -85,6 +90,16 @@ static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_
85
90
  return rb_int2big(i64val);
86
91
  }
87
92
 
93
+ static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
94
+ duckdb_hugeint hugeint = duckdb_value_hugeint(result, col_idx, row_idx);
95
+ return rb_ary_new3(2, ULL2NUM(hugeint.lower), LL2NUM(hugeint.upper));
96
+ }
97
+
98
+ static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
99
+ duckdb_decimal decimal = duckdb_value_decimal(result, col_idx, row_idx);
100
+ return rb_ary_new3(4, ULL2NUM(decimal.value.lower), LL2NUM(decimal.value.upper), UINT2NUM(decimal.width), UINT2NUM(decimal.scale));
101
+ }
102
+
88
103
  static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
89
104
  float fval = duckdb_value_float(result, col_idx, row_idx);
90
105
  return DBL2NUM(fval);
@@ -255,6 +270,20 @@ static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE
255
270
  return to_ruby_obj_bigint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
256
271
  }
257
272
 
273
+ static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
274
+ rubyDuckDBResult *ctx;
275
+ TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
276
+
277
+ return to_ruby_obj_hugeint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
278
+ }
279
+
280
+ static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
281
+ rubyDuckDBResult *ctx;
282
+ TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
283
+
284
+ return to_ruby_obj_decimal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
285
+ }
286
+
258
287
  static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
259
288
  rubyDuckDBResult *ctx;
260
289
  TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
@@ -271,14 +300,49 @@ static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE
271
300
 
272
301
  static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
273
302
  rubyDuckDBResult *ctx;
303
+ #ifdef HAVE_DUCKDB_H_GE_V060
304
+ duckdb_string p;
305
+ #else
274
306
  char *p;
307
+ #endif
275
308
  VALUE obj;
276
309
  TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
277
310
 
311
+ #ifdef HAVE_DUCKDB_H_GE_V060
312
+ p = duckdb_value_string(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
313
+ if (p.data) {
314
+ obj = rb_utf8_str_new(p.data, p.size);
315
+ duckdb_free(p.data);
316
+ #else
278
317
  p = duckdb_value_varchar(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
279
318
  if (p) {
280
319
  obj = rb_utf8_str_new_cstr(p);
281
320
  duckdb_free(p);
321
+ #endif
322
+ return obj;
323
+ }
324
+ return Qnil;
325
+ }
326
+
327
+ static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
328
+ rubyDuckDBResult *ctx;
329
+ #ifdef HAVE_DUCKDB_H_GE_V060
330
+ duckdb_string p;
331
+ #else
332
+ char *p;
333
+ #endif
334
+ VALUE obj;
335
+ TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
336
+
337
+ #ifdef HAVE_DUCKDB_H_GE_V060
338
+ p = duckdb_value_string_internal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
339
+ if (p.data) {
340
+ obj = rb_utf8_str_new(p.data, p.size);
341
+ #else
342
+ p = duckdb_value_varchar_internal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
343
+ if (p) {
344
+ obj = rb_utf8_str_new_cstr(p);
345
+ #endif
282
346
  return obj;
283
347
  }
284
348
  return Qnil;
@@ -354,9 +418,12 @@ void init_duckdb_result(void) {
354
418
  rb_define_private_method(cDuckDBResult, "_to_utinyint", duckdb_result__to_utinyint, 2);
355
419
  rb_define_private_method(cDuckDBResult, "_to_integer", duckdb_result__to_integer, 2);
356
420
  rb_define_private_method(cDuckDBResult, "_to_bigint", duckdb_result__to_bigint, 2);
421
+ rb_define_private_method(cDuckDBResult, "__to_hugeint_internal", duckdb_result___to_hugeint_internal, 2);
422
+ rb_define_private_method(cDuckDBResult, "__to_decimal_internal", duckdb_result___to_decimal_internal, 2);
357
423
  rb_define_private_method(cDuckDBResult, "_to_float", duckdb_result__to_float, 2);
358
424
  rb_define_private_method(cDuckDBResult, "_to_double", duckdb_result__to_double, 2);
359
425
  rb_define_private_method(cDuckDBResult, "_to_string", duckdb_result__to_string, 2);
426
+ rb_define_private_method(cDuckDBResult, "_to_string_internal", duckdb_result__to_string_internal, 2);
360
427
  rb_define_private_method(cDuckDBResult, "_to_blob", duckdb_result__to_blob, 2);
361
428
  rb_define_private_method(cDuckDBResult, "_enum_internal_type", duckdb_result__enum_internal_type, 1);
362
429
  rb_define_private_method(cDuckDBResult, "_enum_dictionary_size", duckdb_result__enum_dictionary_size, 1);
@@ -8,6 +8,10 @@
8
8
  #define HAVE_DUCKDB_H_GE_V033 1
9
9
  #endif
10
10
 
11
+ #ifdef HAVE_DUCKDB_VALUE_STRING
12
+ #define HAVE_DUCKDB_H_GE_V060 1
13
+ #endif
14
+
11
15
  #include "./error.h"
12
16
  #include "./database.h"
13
17
  #include "./connection.h"
@@ -33,15 +33,8 @@ module DuckDB
33
33
  # .end_row
34
34
  #
35
35
  def append_hugeint(value)
36
- case value
37
- when Integer
38
- half = 1 << 64
39
- upper = value / half
40
- lower = value - upper * half
41
- _append_hugeint(lower, upper)
42
- else
43
- raise(ArgumentError, "2nd argument `#{value}` must be Integer.")
44
- end
36
+ lower, upper = integer_to_hugeint(value)
37
+ _append_hugeint(lower, upper)
45
38
  end
46
39
 
47
40
  #
@@ -1,7 +1,20 @@
1
1
  module DuckDB
2
2
  module Converter
3
+ HALF_HUGEINT = 1 << 64
4
+
3
5
  private
4
6
 
7
+ def integer_to_hugeint(value)
8
+ case value
9
+ when Integer
10
+ upper = value / HALF_HUGEINT
11
+ lower = value - upper * HALF_HUGEINT
12
+ [lower, upper]
13
+ else
14
+ raise(ArgumentError, "2nd argument `#{value}` must be Integer.")
15
+ end
16
+ end
17
+
5
18
  def iso8601_interval_to_hash(value)
6
19
  digit = ''
7
20
  time = false
@@ -0,0 +1,3 @@
1
+ module DuckDB
2
+ LIBRARY_VERSION = library_version[1..] if defined? library_version
3
+ end
@@ -15,10 +15,21 @@ module DuckDB
15
15
  class PreparedStatement
16
16
  include DuckDB::Converter
17
17
 
18
- RANGE_INT16 = -32768..32767
19
- RANGE_INT32 = -2147483648..2147483647
20
- RANGE_INT64 = -9223372036854775808..9223372036854775807
18
+ RANGE_INT16 = -32_768..32_767
19
+ RANGE_INT32 = -2_147_483_648..2_147_483_647
20
+ RANGE_INT64 = -9_223_372_036_854_775_808..9_223_372_036_854_775_807
21
21
 
22
+ # binds i-th parameter with SQL prepared statement.
23
+ # The first argument is index of parameter.
24
+ # The index of first parameter is 1 not 0.
25
+ # The second argument value is to expected Integer value.
26
+ # This method uses bind_varchar internally.
27
+ # require 'duckdb'
28
+ # db = DuckDB::Database.open('duckdb_database')
29
+ # con = db.connect
30
+ # sql ='SELECT name FROM users WHERE bigint_col = ?'
31
+ # stmt = PreparedStatement.new(con, sql)
32
+ # stmt.bind_hugeint(1, 1_234_567_890_123_456_789_012_345)
22
33
  def bind_hugeint(i, value)
23
34
  case value
24
35
  when Integer
@@ -28,6 +39,22 @@ module DuckDB
28
39
  end
29
40
  end
30
41
 
42
+ # binds i-th parameter with SQL prepared statement.
43
+ # The first argument is index of parameter.
44
+ # The index of first parameter is 1 not 0.
45
+ # The second argument value must be Integer value.
46
+ # This method uses duckdb_bind_hugeint internally.
47
+ # require 'duckdb'
48
+ # db = DuckDB::Database.open('duckdb_database')
49
+ # con = db.connect
50
+ # sql ='SELECT name FROM users WHERE bigint_col = ?'
51
+ # stmt = PreparedStatement.new(con, sql)
52
+ # stmt.bind_hugeint_internal(1, 1_234_567_890_123_456_789_012_345)
53
+ def bind_hugeint_internal(index, value)
54
+ lower, upper = integer_to_hugeint(value)
55
+ _bind_hugeint(index, lower, upper)
56
+ end
57
+
31
58
  # binds i-th parameter with SQL prepared statement.
32
59
  # The first argument is index of parameter.
33
60
  # The index of first parameter is 1 not 0.
@@ -1,5 +1,5 @@
1
1
  module DuckDB
2
2
  # The version string of ruby-duckdb.
3
3
  # Currently, ruby-duckdb is NOT semantic versioning.
4
- VERSION = '0.5.1.1'.freeze
4
+ VERSION = '0.7.0'.freeze
5
5
  end
data/lib/duckdb.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'duckdb/duckdb_native'
2
+ require 'duckdb/library_version'
2
3
  require 'duckdb/version'
3
4
  require 'duckdb/converter'
4
5
  require 'duckdb/database'
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.5.1.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Suketa
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-13 00:00:00.000000000 Z
11
+ date: 2023-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -119,6 +119,7 @@ files:
119
119
  - lib/duckdb/connection.rb
120
120
  - lib/duckdb/converter.rb
121
121
  - lib/duckdb/database.rb
122
+ - lib/duckdb/library_version.rb
122
123
  - lib/duckdb/prepared_statement.rb
123
124
  - lib/duckdb/result.rb
124
125
  - lib/duckdb/version.rb
@@ -129,7 +130,7 @@ metadata:
129
130
  homepage_uri: https://github.com/suketa/ruby-duckdb
130
131
  source_code_uri: https://github.com/suketa/ruby-duckdb
131
132
  changelog_uri: https://github.com/suketa/ruby-duckdb/blob/master/CHANGELOG.md
132
- post_install_message:
133
+ post_install_message:
133
134
  rdoc_options: []
134
135
  require_paths:
135
136
  - lib
@@ -137,15 +138,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
139
  - - ">="
139
140
  - !ruby/object:Gem::Version
140
- version: 2.6.0
141
+ version: 2.7.0
141
142
  required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  requirements:
143
144
  - - ">="
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
146
147
  requirements: []
147
- rubygems_version: 3.3.22
148
- signing_key:
148
+ rubygems_version: 3.4.6
149
+ signing_key:
149
150
  specification_version: 4
150
151
  summary: This module is Ruby binding for DuckDB database engine.
151
152
  test_files: []