duckdb 0.2.7.0 → 0.2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|