duckdb 0.2.7.0 → 0.2.8.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 +1 -1
- data/.github/workflows/test_on_ubuntu.yml +15 -15
- data/.travis.yml +6 -6
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +3 -3
- data/README.md +18 -0
- data/ext/duckdb/config.c +80 -0
- data/ext/duckdb/config.h +18 -0
- data/ext/duckdb/database.c +48 -2
- data/ext/duckdb/duckdb.c +6 -0
- data/ext/duckdb/extconf.rb +2 -0
- data/ext/duckdb/ruby-duckdb.h +12 -0
- data/lib/duckdb/appender.rb +3 -3
- data/lib/duckdb/config.rb +65 -0
- data/lib/duckdb/database.rb +15 -2
- 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: a07cf98bca895ec39cc43754e6f69544e22c16cab023554daa632dc0be14d527
|
4
|
+
data.tar.gz: d2e96a7556e9ab139fb4b03f8306961d011c80ff9eb259bb8f29cdbd390ea757
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc64b4021083e0837de1c22470b015be7337f2e43754771c36b4265f133542bb7161762fa51a46f2ec9f9ac992bf67bb45e7d8031206f4cd385f248bddcff14d
|
7
|
+
data.tar.gz: 131cb3b1ee245cb765b8b7081d8fb900634055cf6570e6220121991e275d53e7be44ac1c1274c64f4c8991cd3252823274fd887fa3b49a31c8dc9578dd4aade6
|
@@ -8,8 +8,8 @@ jobs:
|
|
8
8
|
runs-on: ubuntu-latest
|
9
9
|
strategy:
|
10
10
|
matrix:
|
11
|
-
ruby: ['2.5.8', '2.6.
|
12
|
-
duckdb: ['0.2.
|
11
|
+
ruby: ['2.5.8', '2.6.8', '2.7.4', '3.0.2', 'head']
|
12
|
+
duckdb: ['0.2.8', '0.2.7']
|
13
13
|
|
14
14
|
steps:
|
15
15
|
- uses: actions/checkout@v2
|
@@ -19,14 +19,14 @@ jobs:
|
|
19
19
|
with:
|
20
20
|
ruby-version: ${{ matrix.ruby }}
|
21
21
|
|
22
|
-
- name: duckdb 0.2.
|
23
|
-
id: duckdb-cache-
|
22
|
+
- name: duckdb 0.2.8 cache
|
23
|
+
id: duckdb-cache-v0_2_8
|
24
24
|
uses: actions/cache@v1.1.0
|
25
25
|
with:
|
26
|
-
path: duckdb-v0.2.
|
27
|
-
key: ${{ runner.os }}-duckdb-
|
26
|
+
path: duckdb-v0.2.8
|
27
|
+
key: ${{ runner.os }}-duckdb-v0_2_8_001
|
28
28
|
restore-keys: |
|
29
|
-
${{ runner.os }}-duckdb-
|
29
|
+
${{ runner.os }}-duckdb-v0_2_8
|
30
30
|
|
31
31
|
- name: duckdb 0.2.7 cache
|
32
32
|
id: duckdb-cache-v0_2_7
|
@@ -37,15 +37,15 @@ jobs:
|
|
37
37
|
restore-keys: |
|
38
38
|
${{ runner.os }}-duckdb-v0_2_7
|
39
39
|
|
40
|
-
- name: Build duckdb 0.2.
|
41
|
-
if: steps.duckdb-cache-
|
40
|
+
- name: Build duckdb 0.2.8
|
41
|
+
if: steps.duckdb-cache-v0_2_8.outputs.cache-hit != 'true'
|
42
42
|
run: |
|
43
|
-
git clone -b v0.2.
|
44
|
-
cd duckdb-tmp-v0.2.
|
45
|
-
rm -rf duckdb-v0.2.
|
46
|
-
mkdir -p duckdb-v0.2.
|
47
|
-
cp -rip duckdb-tmp-v0.2.
|
48
|
-
cp -rip duckdb-tmp-v0.2.
|
43
|
+
git clone -b v0.2.8 https://github.com/cwida/duckdb.git duckdb-tmp-v0.2.8
|
44
|
+
cd duckdb-tmp-v0.2.8 && make && cd ..
|
45
|
+
rm -rf duckdb-v0.2.8
|
46
|
+
mkdir -p duckdb-v0.2.8/build/release/src duckdb-v0.2.8/src
|
47
|
+
cp -rip duckdb-tmp-v0.2.8/build/release/src/*.so duckdb-v0.2.8/build/release/src
|
48
|
+
cp -rip duckdb-tmp-v0.2.8/src/include duckdb-v0.2.8/src/
|
49
49
|
|
50
50
|
- name: Build duckdb 0.2.7
|
51
51
|
if: steps.duckdb-cache-v0_2_7.outputs.cache-hit != 'true'
|
data/.travis.yml
CHANGED
@@ -2,17 +2,17 @@ language: ruby
|
|
2
2
|
cache:
|
3
3
|
bundler: true
|
4
4
|
directories:
|
5
|
-
- ${HOME}/duckdb-v0.2.
|
5
|
+
- ${HOME}/duckdb-v0.2.8
|
6
6
|
before_install:
|
7
7
|
- yes | gem update --system
|
8
|
-
- if [[ ! -d ${HOME}/duckdb-v0.2.
|
8
|
+
- if [[ ! -d ${HOME}/duckdb-v0.2.8/build ]]; then cd ${HOME} && git clone -b v0.2.8 https://github.com/cwida/duckdb.git duckdb-v0.2.8 && cd duckdb-v0.2.8 && make && cd ${TRAVIS_BUILD_DIR}; fi
|
9
9
|
|
10
10
|
env:
|
11
|
-
- DUCKDB_VERSION=0.2.
|
11
|
+
- DUCKDB_VERSION=0.2.8
|
12
12
|
rvm:
|
13
13
|
- 2.5.8
|
14
|
-
- 2.6.
|
15
|
-
- 2.7.
|
16
|
-
- 3.0.
|
14
|
+
- 2.6.8
|
15
|
+
- 2.7.4
|
16
|
+
- 3.0.2
|
17
17
|
- ruby-head
|
18
18
|
script: bundle exec rake -- --with-duckdb-include=${HOME}/duckdb-v${DUCKDB_VERSION}/src/include --with-duckdb-lib=${HOME}/duckdb-v${DUCKDB_VERSION}/build/release/src/
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# ChangeLog
|
2
2
|
|
3
|
+
- DuckDB::Database.open accepts 2-nd argument as DuckDB::Config object.
|
4
|
+
- add DuckDB::Config
|
5
|
+
- bump duckdb to 0.2.8 in CI
|
6
|
+
- bump Ruby to 2.6.8, 2.7.4, 3.0.2 in CI
|
7
|
+
|
3
8
|
# 0.2.7.0
|
4
9
|
|
5
10
|
- call duckdb_free after calling duckdb_value_blob, duckdb_value_varchar.
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
duckdb (0.2.
|
4
|
+
duckdb (0.2.8.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
minitest (5.14.4)
|
10
|
-
rake (13.0.
|
10
|
+
rake (13.0.6)
|
11
11
|
rake-compiler (1.1.1)
|
12
12
|
rake
|
13
13
|
|
@@ -22,4 +22,4 @@ DEPENDENCIES
|
|
22
22
|
rake-compiler
|
23
23
|
|
24
24
|
BUNDLED WITH
|
25
|
-
2.2.
|
25
|
+
2.2.25
|
data/README.md
CHANGED
@@ -149,3 +149,21 @@ end
|
|
149
149
|
# prepare 0.230457 0.000000 0.230457 ( 0.230460 )
|
150
150
|
# append 0.012666 0.000000 0.012666 ( 0.012670 )
|
151
151
|
```
|
152
|
+
|
153
|
+
### Configuration
|
154
|
+
|
155
|
+
Config class provides Ruby interface of [DuckDB configuration](https://duckdb.org/docs/api/c/config).
|
156
|
+
|
157
|
+
```
|
158
|
+
require 'duckdb'
|
159
|
+
config = DuckDB::Config.new
|
160
|
+
config['default_order'] = 'DESC'
|
161
|
+
db = DuckDB::Database.open(nil, config)
|
162
|
+
con = db.connect
|
163
|
+
con.query('CREATE TABLE numbers (number INTEGER)')
|
164
|
+
con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
165
|
+
|
166
|
+
# number is ordered by descending.
|
167
|
+
r = con.query('SELECT number FROM numbers ORDER BY number')
|
168
|
+
r.first.first # => 4
|
169
|
+
```
|
data/ext/duckdb/config.c
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#include "ruby-duckdb.h"
|
2
|
+
|
3
|
+
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
4
|
+
|
5
|
+
VALUE cDuckDBConfig;
|
6
|
+
|
7
|
+
static void deallocate(void *);
|
8
|
+
static VALUE allocate(VALUE klass);
|
9
|
+
static VALUE config_s_size(VALUE klass);
|
10
|
+
static VALUE config_s_get_config_flag(VALUE self, VALUE value);
|
11
|
+
static VALUE config_initialize(VALUE self);
|
12
|
+
static VALUE config_set_config(VALUE self, VALUE key, VALUE value);
|
13
|
+
|
14
|
+
static void deallocate(void * ctx)
|
15
|
+
{
|
16
|
+
rubyDuckDBConfig *p = (rubyDuckDBConfig *)ctx;
|
17
|
+
|
18
|
+
duckdb_destroy_config(&(p->config));
|
19
|
+
xfree(p);
|
20
|
+
}
|
21
|
+
|
22
|
+
static VALUE allocate(VALUE klass)
|
23
|
+
{
|
24
|
+
rubyDuckDBConfig *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBConfig));
|
25
|
+
return Data_Wrap_Struct(klass, NULL, deallocate, ctx);
|
26
|
+
}
|
27
|
+
|
28
|
+
static VALUE config_initialize(VALUE self) {
|
29
|
+
rubyDuckDBConfig *ctx;
|
30
|
+
|
31
|
+
Data_Get_Struct(self, rubyDuckDBConfig, ctx);
|
32
|
+
|
33
|
+
if (duckdb_create_config(&(ctx->config)) == DuckDBError) {
|
34
|
+
rb_raise(eDuckDBError, "failed to create config");
|
35
|
+
}
|
36
|
+
return self;
|
37
|
+
}
|
38
|
+
|
39
|
+
static VALUE config_s_size(VALUE self) {
|
40
|
+
return INT2NUM(duckdb_config_count());
|
41
|
+
}
|
42
|
+
|
43
|
+
static VALUE config_s_get_config_flag(VALUE klass, VALUE value) {
|
44
|
+
const char *pkey;
|
45
|
+
const char *pdesc;
|
46
|
+
|
47
|
+
size_t i = NUM2INT(value);
|
48
|
+
|
49
|
+
if (duckdb_get_config_flag(i, &pkey, &pdesc) == DuckDBError) {
|
50
|
+
rb_raise(eDuckDBError, "failed to get config information of index %ld", i);
|
51
|
+
}
|
52
|
+
|
53
|
+
return rb_ary_new3(2, rb_str_new2(pkey), rb_str_new2(pdesc));
|
54
|
+
}
|
55
|
+
|
56
|
+
static VALUE config_set_config(VALUE self, VALUE key, VALUE value) {
|
57
|
+
const char *pkey = StringValuePtr(key);
|
58
|
+
const char *pval = StringValuePtr(value);
|
59
|
+
|
60
|
+
rubyDuckDBConfig *ctx;
|
61
|
+
Data_Get_Struct(self, rubyDuckDBConfig, ctx);
|
62
|
+
|
63
|
+
if (duckdb_set_config(ctx->config, pkey, pval) == DuckDBError) {
|
64
|
+
rb_raise(eDuckDBError, "failed to set config %s => %s", pkey, pval);
|
65
|
+
}
|
66
|
+
return self;
|
67
|
+
}
|
68
|
+
|
69
|
+
void init_duckdb_config(void) {
|
70
|
+
cDuckDBConfig = rb_define_class_under(mDuckDB, "Config", rb_cObject);
|
71
|
+
rb_define_alloc_func(cDuckDBConfig, allocate);
|
72
|
+
rb_define_singleton_method(cDuckDBConfig, "size", config_s_size, 0);
|
73
|
+
rb_define_singleton_method(cDuckDBConfig, "get_config_flag", config_s_get_config_flag, 1);
|
74
|
+
|
75
|
+
rb_define_method(cDuckDBConfig, "initialize", config_initialize, 0);
|
76
|
+
rb_define_method(cDuckDBConfig, "set_config", config_set_config, 2);
|
77
|
+
}
|
78
|
+
|
79
|
+
#endif
|
80
|
+
|
data/ext/duckdb/config.h
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#ifndef RUBY_DUCKDB_CONFIG_H
|
2
|
+
#define RUBY_DUCKDB_CONFIG_H
|
3
|
+
|
4
|
+
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
5
|
+
|
6
|
+
struct _rubyDuckDBConfig {
|
7
|
+
duckdb_config config;
|
8
|
+
};
|
9
|
+
|
10
|
+
typedef struct _rubyDuckDBConfig rubyDuckDBConfig;
|
11
|
+
|
12
|
+
void init_duckdb_config(void);
|
13
|
+
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#endif
|
17
|
+
|
18
|
+
|
data/ext/duckdb/database.c
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
VALUE cDuckDBDatabase;
|
4
4
|
|
5
|
+
static void close_database(rubyDuckDB *p);
|
6
|
+
static void deallocate(void * ctx);
|
7
|
+
static VALUE allocate(VALUE klass);
|
8
|
+
static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase);
|
9
|
+
static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBDatabase);
|
10
|
+
|
5
11
|
static void close_database(rubyDuckDB *p)
|
6
12
|
{
|
7
13
|
duckdb_close(&(p->db));
|
@@ -25,6 +31,7 @@ static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase
|
|
25
31
|
{
|
26
32
|
rubyDuckDB *ctx;
|
27
33
|
VALUE obj;
|
34
|
+
|
28
35
|
char *pfile = NULL;
|
29
36
|
VALUE file = Qnil;
|
30
37
|
|
@@ -36,13 +43,49 @@ static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase
|
|
36
43
|
|
37
44
|
obj = allocate(cDuckDBDatabase);
|
38
45
|
Data_Get_Struct(obj, rubyDuckDB, ctx);
|
39
|
-
if (duckdb_open(pfile, &(ctx->db)) == DuckDBError)
|
40
|
-
{
|
46
|
+
if (duckdb_open(pfile, &(ctx->db)) == DuckDBError) {
|
41
47
|
rb_raise(eDuckDBError, "Failed to open database"); /* FIXME */
|
42
48
|
}
|
43
49
|
return obj;
|
44
50
|
}
|
45
51
|
|
52
|
+
#ifdef HAVE_DUCKDB_OPEN_EXT
|
53
|
+
static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBDatabase)
|
54
|
+
{
|
55
|
+
rubyDuckDB *ctx;
|
56
|
+
VALUE obj;
|
57
|
+
rubyDuckDBConfig *ctx_config;
|
58
|
+
char *perror;
|
59
|
+
|
60
|
+
char *pfile = NULL;
|
61
|
+
VALUE file = Qnil;
|
62
|
+
VALUE config = Qnil;
|
63
|
+
|
64
|
+
rb_scan_args(argc, argv, "02", &file, &config);
|
65
|
+
|
66
|
+
if (!NIL_P(file)) {
|
67
|
+
pfile = StringValuePtr(file);
|
68
|
+
}
|
69
|
+
|
70
|
+
obj = allocate(cDuckDBDatabase);
|
71
|
+
Data_Get_Struct(obj, rubyDuckDB, ctx);
|
72
|
+
if (!NIL_P(config)) {
|
73
|
+
if (!rb_obj_is_kind_of(config, cDuckDBConfig)) {
|
74
|
+
rb_raise(rb_eTypeError, "The second argument must be DuckDB::Config object.");
|
75
|
+
}
|
76
|
+
Data_Get_Struct(config, rubyDuckDBConfig, ctx_config);
|
77
|
+
if (duckdb_open_ext(pfile, &(ctx->db), ctx_config->config, &perror) == DuckDBError) {
|
78
|
+
rb_raise(eDuckDBError, "Failed to open database %s", perror);
|
79
|
+
}
|
80
|
+
} else {
|
81
|
+
if (duckdb_open(pfile, &(ctx->db)) == DuckDBError) {
|
82
|
+
rb_raise(eDuckDBError, "Failed to open database"); /* FIXME */
|
83
|
+
}
|
84
|
+
}
|
85
|
+
return obj;
|
86
|
+
}
|
87
|
+
#endif /* HAVE_DUCKDB_OPEN_EXT */
|
88
|
+
|
46
89
|
static VALUE duckdb_database_connect(VALUE self)
|
47
90
|
{
|
48
91
|
return create_connection(self);
|
@@ -67,6 +110,9 @@ void init_duckdb_database(void)
|
|
67
110
|
cDuckDBDatabase = rb_define_class_under(mDuckDB, "Database", rb_cObject);
|
68
111
|
rb_define_alloc_func(cDuckDBDatabase, allocate);
|
69
112
|
rb_define_singleton_method(cDuckDBDatabase, "_open", duckdb_database_s_open, -1);
|
113
|
+
#ifdef HAVE_DUCKDB_OPEN_EXT
|
114
|
+
rb_define_singleton_method(cDuckDBDatabase, "_open_ext", duckdb_database_s_open_ext, -1);
|
115
|
+
#endif
|
70
116
|
rb_define_private_method(cDuckDBDatabase, "_connect", duckdb_database_connect, 0);
|
71
117
|
rb_define_method(cDuckDBDatabase, "close", duckdb_database_close, 0);
|
72
118
|
}
|
data/ext/duckdb/duckdb.c
CHANGED
data/ext/duckdb/extconf.rb
CHANGED
@@ -6,5 +6,7 @@ if have_library('duckdb')
|
|
6
6
|
have_func('duckdb_bind_blob', 'duckdb.h')
|
7
7
|
have_func('duckdb_appender_create', 'duckdb.h')
|
8
8
|
have_func('duckdb_free', 'duckdb.h')
|
9
|
+
have_func('duckdb_create_config', 'duckdb.h')
|
10
|
+
have_func('duckdb_open_ext', 'duckdb.h')
|
9
11
|
create_makefile('duckdb/duckdb_native')
|
10
12
|
end
|
data/ext/duckdb/ruby-duckdb.h
CHANGED
@@ -21,6 +21,12 @@
|
|
21
21
|
|
22
22
|
#endif /* HAVE_DUCKDB_APPENDER_CREATE */
|
23
23
|
|
24
|
+
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
25
|
+
|
26
|
+
#include "./config.h"
|
27
|
+
|
28
|
+
#endif /* HAVE_DUCKDB_CREATE_CONFIG */
|
29
|
+
|
24
30
|
extern VALUE mDuckDB;
|
25
31
|
extern VALUE cDuckDBDatabase;
|
26
32
|
extern VALUE cDuckDBConnection;
|
@@ -31,6 +37,12 @@ extern VALUE cDuckDBBlob;
|
|
31
37
|
|
32
38
|
#endif /* HAVE_DUCKDB_VALUE_BLOB */
|
33
39
|
|
40
|
+
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
41
|
+
|
42
|
+
extern VALUE cDuckDBConfig;
|
43
|
+
|
44
|
+
#endif /* HAVE_DUCKDB_CREATE_CONFIG */
|
45
|
+
|
34
46
|
extern VALUE eDuckDBError;
|
35
47
|
|
36
48
|
#endif
|
data/lib/duckdb/appender.rb
CHANGED
@@ -12,9 +12,9 @@ module DuckDB
|
|
12
12
|
# appender.append_row(1, 'Alice')
|
13
13
|
#
|
14
14
|
class Appender
|
15
|
-
RANGE_INT16 =
|
16
|
-
RANGE_INT32 =
|
17
|
-
RANGE_INT64 =
|
15
|
+
RANGE_INT16 = -32_768..32_767
|
16
|
+
RANGE_INT32 = -2_147_483_648..2_147_483_647
|
17
|
+
RANGE_INT64 = -9_223_372_036_854_775_808..9_223_372_036_854_775_807
|
18
18
|
|
19
19
|
def append_hugeint(value)
|
20
20
|
case value
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module DuckDB
|
2
|
+
if defined?(DuckDB::Config)
|
3
|
+
# The DuckDB::Config encapsulates DuckDB Configuration.
|
4
|
+
#
|
5
|
+
# require 'duckdb'
|
6
|
+
# config = DuckDB::Config.new
|
7
|
+
# config['default_order'] = 'DESC'
|
8
|
+
# db = DuckDB::Database.open(nil, config)
|
9
|
+
# con = db.connect
|
10
|
+
# con.query('CREATE TABLE numbers (number INTEGER)')
|
11
|
+
# con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
12
|
+
#
|
13
|
+
# # number is ordered by descending.
|
14
|
+
# r = con.query('SELECT number FROM numbers ORDER BY number)
|
15
|
+
# r.first.first # => 4
|
16
|
+
class Config
|
17
|
+
class << self
|
18
|
+
#
|
19
|
+
# returns available configuration name and the description.
|
20
|
+
# The return value is array object. The first element is the configuration
|
21
|
+
# name. The second is the description.
|
22
|
+
#
|
23
|
+
# key, desc = DuckDB::Config.key_description(0)
|
24
|
+
# key # => "access_mode"
|
25
|
+
# desc # => "Access mode of the database ([AUTOMATIC], READ_ONLY or READ_WRITE)"
|
26
|
+
#
|
27
|
+
alias key_description get_config_flag
|
28
|
+
|
29
|
+
#
|
30
|
+
# returns the Hash object of all available configuration names and
|
31
|
+
# the descriptions.
|
32
|
+
#
|
33
|
+
# configs = DuckDB::Config.key_descriptions
|
34
|
+
# configs['default_order'] # => "The order type used when none is specified ([ASC] or DESC)"
|
35
|
+
#
|
36
|
+
def key_descriptions
|
37
|
+
return @key_descriptions if @key_descriptions
|
38
|
+
|
39
|
+
n = size
|
40
|
+
@key_descriptions = (0...n).each_with_object({}) do |i, hash|
|
41
|
+
key, description = key_description(i)
|
42
|
+
hash[key] = description
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# set configuration value
|
49
|
+
#
|
50
|
+
# config = DuckDB::Config.new
|
51
|
+
# # config.set_config('default_order', 'DESC')
|
52
|
+
# config['default_order'] = 'DESC'
|
53
|
+
#
|
54
|
+
# db = DuckDB::Database.open(nil, config)
|
55
|
+
# con = db.connect
|
56
|
+
# con.query('CREATE TABLE numbers (number INTEGER)')
|
57
|
+
# con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
58
|
+
#
|
59
|
+
# # numbers are ordered by descending.
|
60
|
+
# r = con.query('SELECT number FROM numbers ORDER BY number)
|
61
|
+
# r.first.first # => 4
|
62
|
+
alias []= set_config
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/duckdb/database.rb
CHANGED
@@ -21,6 +21,7 @@ module DuckDB
|
|
21
21
|
#
|
22
22
|
class Database
|
23
23
|
private_class_method :_open
|
24
|
+
private_class_method :_open_ext if defined?(DuckDB::Config)
|
24
25
|
|
25
26
|
class << self
|
26
27
|
##
|
@@ -38,8 +39,8 @@ module DuckDB
|
|
38
39
|
# con.query('CREATE TABLE users (id INTEGER, name VARCHAR(30))')
|
39
40
|
# end
|
40
41
|
#
|
41
|
-
def open(
|
42
|
-
db =
|
42
|
+
def open(dbpath = nil, config = nil)
|
43
|
+
db = _db_open(dbpath, config)
|
43
44
|
return db unless block_given?
|
44
45
|
|
45
46
|
begin
|
@@ -48,6 +49,18 @@ module DuckDB
|
|
48
49
|
db.close
|
49
50
|
end
|
50
51
|
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def _db_open(dbpath, config)
|
56
|
+
if defined?(DuckDB::Config) && config
|
57
|
+
_open_ext(dbpath, config)
|
58
|
+
elsif config
|
59
|
+
_open(dbpath, config)
|
60
|
+
else
|
61
|
+
_open(dbpath)
|
62
|
+
end
|
63
|
+
end
|
51
64
|
end
|
52
65
|
|
53
66
|
##
|
data/lib/duckdb/version.rb
CHANGED
data/lib/duckdb.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duckdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Suketa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -93,6 +93,8 @@ files:
|
|
93
93
|
- ext/duckdb/appender.h
|
94
94
|
- ext/duckdb/blob.c
|
95
95
|
- ext/duckdb/blob.h
|
96
|
+
- ext/duckdb/config.c
|
97
|
+
- ext/duckdb/config.h
|
96
98
|
- ext/duckdb/connection.c
|
97
99
|
- ext/duckdb/connection.h
|
98
100
|
- ext/duckdb/database.c
|
@@ -108,6 +110,7 @@ files:
|
|
108
110
|
- ext/duckdb/ruby-duckdb.h
|
109
111
|
- lib/duckdb.rb
|
110
112
|
- lib/duckdb/appender.rb
|
113
|
+
- lib/duckdb/config.rb
|
111
114
|
- lib/duckdb/connection.rb
|
112
115
|
- lib/duckdb/database.rb
|
113
116
|
- lib/duckdb/prepared_statement.rb
|
@@ -135,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
138
|
- !ruby/object:Gem::Version
|
136
139
|
version: '0'
|
137
140
|
requirements: []
|
138
|
-
rubygems_version: 3.2.
|
141
|
+
rubygems_version: 3.2.22
|
139
142
|
signing_key:
|
140
143
|
specification_version: 4
|
141
144
|
summary: This module is Ruby binding for DuckDB database engine.
|