duckdb 0.3.4.0 → 0.5.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 +10 -3
- data/.github/workflows/test_on_ubuntu.yml +10 -4
- data/.github/workflows/test_on_windows.yml +10 -3
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +4 -4
- data/README.md +9 -9
- data/duckdb.gemspec +1 -1
- data/ext/duckdb/appender.c +38 -37
- data/ext/duckdb/column.c +30 -13
- data/ext/duckdb/config.c +21 -9
- data/ext/duckdb/config.h +2 -6
- data/ext/duckdb/connection.c +25 -8
- data/ext/duckdb/connection.h +1 -0
- data/ext/duckdb/database.c +22 -9
- data/ext/duckdb/database.h +1 -0
- data/ext/duckdb/duckdb.c +0 -5
- data/ext/duckdb/extconf.rb +1 -6
- data/ext/duckdb/prepared_statement.c +39 -25
- data/ext/duckdb/result.c +238 -77
- data/ext/duckdb/result.h +1 -0
- data/ext/duckdb/ruby-duckdb.h +0 -5
- data/ext/duckdb/util.c +0 -3
- data/ext/duckdb/util.h +0 -4
- data/lib/duckdb/result.rb +50 -0
- data/lib/duckdb/version.rb +1 -1
- metadata +5 -5
data/ext/duckdb/config.h
CHANGED
@@ -1,18 +1,14 @@
|
|
1
1
|
#ifndef RUBY_DUCKDB_CONFIG_H
|
2
2
|
#define RUBY_DUCKDB_CONFIG_H
|
3
3
|
|
4
|
-
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
5
|
-
|
6
4
|
struct _rubyDuckDBConfig {
|
7
5
|
duckdb_config config;
|
8
6
|
};
|
9
7
|
|
10
8
|
typedef struct _rubyDuckDBConfig rubyDuckDBConfig;
|
11
9
|
|
12
|
-
|
10
|
+
rubyDuckDBConfig *get_struct_config(VALUE obj);
|
13
11
|
|
14
|
-
|
12
|
+
void init_duckdb_config(void);
|
15
13
|
|
16
14
|
#endif
|
17
|
-
|
18
|
-
|
data/ext/duckdb/connection.c
CHANGED
@@ -4,10 +4,17 @@ VALUE cDuckDBConnection;
|
|
4
4
|
|
5
5
|
static void deallocate(void *ctx);
|
6
6
|
static VALUE allocate(VALUE klass);
|
7
|
+
static size_t memsize(const void *p);
|
7
8
|
static VALUE duckdb_connection_disconnect(VALUE self);
|
8
9
|
static VALUE duckdb_connection_connect(VALUE self, VALUE oDuckDBDatabase);
|
9
10
|
static VALUE duckdb_connection_query_sql(VALUE self, VALUE str);
|
10
11
|
|
12
|
+
static const rb_data_type_t connection_data_type = {
|
13
|
+
"DuckDB/Connection",
|
14
|
+
{NULL, deallocate, memsize,},
|
15
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
16
|
+
};
|
17
|
+
|
11
18
|
static void deallocate(void *ctx) {
|
12
19
|
rubyDuckDBConnection *p = (rubyDuckDBConnection *)ctx;
|
13
20
|
|
@@ -17,7 +24,17 @@ static void deallocate(void *ctx) {
|
|
17
24
|
|
18
25
|
static VALUE allocate(VALUE klass) {
|
19
26
|
rubyDuckDBConnection *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBConnection));
|
20
|
-
return
|
27
|
+
return TypedData_Wrap_Struct(klass, &connection_data_type, ctx);
|
28
|
+
}
|
29
|
+
|
30
|
+
static size_t memsize(const void *p) {
|
31
|
+
return sizeof(rubyDuckDBConnection);
|
32
|
+
}
|
33
|
+
|
34
|
+
rubyDuckDBConnection *get_struct_connection(VALUE obj) {
|
35
|
+
rubyDuckDBConnection *ctx;
|
36
|
+
TypedData_Get_Struct(obj, rubyDuckDBConnection, &connection_data_type, ctx);
|
37
|
+
return ctx;
|
21
38
|
}
|
22
39
|
|
23
40
|
VALUE create_connection(VALUE oDuckDBDatabase) {
|
@@ -25,10 +42,10 @@ VALUE create_connection(VALUE oDuckDBDatabase) {
|
|
25
42
|
rubyDuckDBConnection *ctxcon;
|
26
43
|
VALUE obj;
|
27
44
|
|
28
|
-
|
45
|
+
ctxdb = get_struct_database(oDuckDBDatabase);
|
29
46
|
|
30
47
|
obj = allocate(cDuckDBConnection);
|
31
|
-
|
48
|
+
TypedData_Get_Struct(obj, rubyDuckDBConnection, &connection_data_type, ctxcon);
|
32
49
|
|
33
50
|
if (duckdb_connect(ctxdb->db, &(ctxcon->con)) == DuckDBError) {
|
34
51
|
rb_raise(eDuckDBError, "connection error");
|
@@ -41,7 +58,7 @@ VALUE create_connection(VALUE oDuckDBDatabase) {
|
|
41
58
|
static VALUE duckdb_connection_disconnect(VALUE self) {
|
42
59
|
rubyDuckDBConnection *ctx;
|
43
60
|
|
44
|
-
|
61
|
+
TypedData_Get_Struct(self, rubyDuckDBConnection, &connection_data_type, ctx);
|
45
62
|
duckdb_disconnect(&(ctx->con));
|
46
63
|
|
47
64
|
return self;
|
@@ -54,8 +71,8 @@ static VALUE duckdb_connection_connect(VALUE self, VALUE oDuckDBDatabase) {
|
|
54
71
|
if (!rb_obj_is_kind_of(oDuckDBDatabase, cDuckDBDatabase)) {
|
55
72
|
rb_raise(rb_eTypeError, "The first argument must be DuckDB::Database object.");
|
56
73
|
}
|
57
|
-
|
58
|
-
|
74
|
+
ctxdb = get_struct_database(oDuckDBDatabase);
|
75
|
+
TypedData_Get_Struct(self, rubyDuckDBConnection, &connection_data_type, ctx);
|
59
76
|
|
60
77
|
if (duckdb_connect(ctxdb->db, &(ctx->con)) == DuckDBError) {
|
61
78
|
rb_raise(eDuckDBError, "connection error");
|
@@ -70,8 +87,8 @@ static VALUE duckdb_connection_query_sql(VALUE self, VALUE str) {
|
|
70
87
|
|
71
88
|
VALUE result = create_result();
|
72
89
|
|
73
|
-
|
74
|
-
|
90
|
+
TypedData_Get_Struct(self, rubyDuckDBConnection, &connection_data_type, ctx);
|
91
|
+
ctxr = get_struct_result(result);
|
75
92
|
|
76
93
|
if (!(ctx->con)) {
|
77
94
|
rb_raise(eDuckDBError, "Database connection closed");
|
data/ext/duckdb/connection.h
CHANGED
data/ext/duckdb/database.c
CHANGED
@@ -5,11 +5,18 @@ VALUE cDuckDBDatabase;
|
|
5
5
|
static void close_database(rubyDuckDB *p);
|
6
6
|
static void deallocate(void * ctx);
|
7
7
|
static VALUE allocate(VALUE klass);
|
8
|
+
static size_t memsize(const void *p);
|
8
9
|
static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase);
|
9
10
|
static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBDatabase);
|
10
11
|
static VALUE duckdb_database_connect(VALUE self);
|
11
12
|
static VALUE duckdb_database_close(VALUE self);
|
12
13
|
|
14
|
+
static const rb_data_type_t database_data_type = {
|
15
|
+
"DuckDB/Database",
|
16
|
+
{NULL, deallocate, memsize,},
|
17
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
18
|
+
};
|
19
|
+
|
13
20
|
static void close_database(rubyDuckDB *p) {
|
14
21
|
duckdb_close(&(p->db));
|
15
22
|
}
|
@@ -21,9 +28,19 @@ static void deallocate(void * ctx) {
|
|
21
28
|
xfree(p);
|
22
29
|
}
|
23
30
|
|
31
|
+
static size_t memsize(const void *p) {
|
32
|
+
return sizeof(rubyDuckDB);
|
33
|
+
}
|
34
|
+
|
24
35
|
static VALUE allocate(VALUE klass) {
|
25
36
|
rubyDuckDB *ctx = xcalloc((size_t)1, sizeof(rubyDuckDB));
|
26
|
-
return
|
37
|
+
return TypedData_Wrap_Struct(klass, &database_data_type, ctx);
|
38
|
+
}
|
39
|
+
|
40
|
+
rubyDuckDB *get_struct_database(VALUE obj) {
|
41
|
+
rubyDuckDB *ctx;
|
42
|
+
TypedData_Get_Struct(obj, rubyDuckDB, &database_data_type, ctx);
|
43
|
+
return ctx;
|
27
44
|
}
|
28
45
|
|
29
46
|
static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase) {
|
@@ -40,14 +57,13 @@ static VALUE duckdb_database_s_open(int argc, VALUE *argv, VALUE cDuckDBDatabase
|
|
40
57
|
}
|
41
58
|
|
42
59
|
obj = allocate(cDuckDBDatabase);
|
43
|
-
|
60
|
+
TypedData_Get_Struct(obj, rubyDuckDB, &database_data_type, ctx);
|
44
61
|
if (duckdb_open(pfile, &(ctx->db)) == DuckDBError) {
|
45
62
|
rb_raise(eDuckDBError, "Failed to open database"); /* FIXME */
|
46
63
|
}
|
47
64
|
return obj;
|
48
65
|
}
|
49
66
|
|
50
|
-
#ifdef HAVE_DUCKDB_OPEN_EXT
|
51
67
|
static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBDatabase) {
|
52
68
|
rubyDuckDB *ctx;
|
53
69
|
VALUE obj;
|
@@ -65,12 +81,12 @@ static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBData
|
|
65
81
|
}
|
66
82
|
|
67
83
|
obj = allocate(cDuckDBDatabase);
|
68
|
-
|
84
|
+
TypedData_Get_Struct(obj, rubyDuckDB, &database_data_type, ctx);
|
69
85
|
if (!NIL_P(config)) {
|
70
86
|
if (!rb_obj_is_kind_of(config, cDuckDBConfig)) {
|
71
87
|
rb_raise(rb_eTypeError, "The second argument must be DuckDB::Config object.");
|
72
88
|
}
|
73
|
-
|
89
|
+
ctx_config = get_struct_config(config);
|
74
90
|
if (duckdb_open_ext(pfile, &(ctx->db), ctx_config->config, &perror) == DuckDBError) {
|
75
91
|
rb_raise(eDuckDBError, "Failed to open database %s", perror);
|
76
92
|
}
|
@@ -81,7 +97,6 @@ static VALUE duckdb_database_s_open_ext(int argc, VALUE *argv, VALUE cDuckDBData
|
|
81
97
|
}
|
82
98
|
return obj;
|
83
99
|
}
|
84
|
-
#endif /* HAVE_DUCKDB_OPEN_EXT */
|
85
100
|
|
86
101
|
static VALUE duckdb_database_connect(VALUE self) {
|
87
102
|
return create_connection(self);
|
@@ -95,7 +110,7 @@ static VALUE duckdb_database_connect(VALUE self) {
|
|
95
110
|
*/
|
96
111
|
static VALUE duckdb_database_close(VALUE self) {
|
97
112
|
rubyDuckDB *ctx;
|
98
|
-
|
113
|
+
TypedData_Get_Struct(self, rubyDuckDB, &database_data_type, ctx);
|
99
114
|
close_database(ctx);
|
100
115
|
return self;
|
101
116
|
}
|
@@ -104,9 +119,7 @@ void init_duckdb_database(void) {
|
|
104
119
|
cDuckDBDatabase = rb_define_class_under(mDuckDB, "Database", rb_cObject);
|
105
120
|
rb_define_alloc_func(cDuckDBDatabase, allocate);
|
106
121
|
rb_define_singleton_method(cDuckDBDatabase, "_open", duckdb_database_s_open, -1);
|
107
|
-
#ifdef HAVE_DUCKDB_OPEN_EXT
|
108
122
|
rb_define_singleton_method(cDuckDBDatabase, "_open_ext", duckdb_database_s_open_ext, -1);
|
109
|
-
#endif
|
110
123
|
rb_define_private_method(cDuckDBDatabase, "_connect", duckdb_database_connect, 0);
|
111
124
|
rb_define_method(cDuckDBDatabase, "close", duckdb_database_close, 0);
|
112
125
|
}
|
data/ext/duckdb/database.h
CHANGED
data/ext/duckdb/duckdb.c
CHANGED
@@ -13,12 +13,7 @@ Init_duckdb_native(void) {
|
|
13
13
|
init_duckdb_column();
|
14
14
|
init_duckdb_prepared_statement();
|
15
15
|
init_duckdb_blob();
|
16
|
-
|
17
16
|
init_duckdb_appender();
|
18
|
-
|
19
|
-
#ifdef HAVE_DUCKDB_CREATE_CONFIG
|
20
|
-
|
21
17
|
init_duckdb_config();
|
22
18
|
|
23
|
-
#endif /* HAVE_DUCKDB_CREATE_CONFIG */
|
24
19
|
}
|
data/ext/duckdb/extconf.rb
CHANGED
@@ -6,15 +6,10 @@ raise 'duckdb library is not found. Install duckdb library file and header file.
|
|
6
6
|
|
7
7
|
raise 'duckdb >= 0.2.9 is required. Install duckdb >= 0.2.9' unless have_func('duckdb_value_is_null', 'duckdb.h')
|
8
8
|
|
9
|
+
# check duckdb >= 0.3.3
|
9
10
|
# ducdb >= 0.3.3 if duckdb_append_data_chunk() is defined.
|
10
11
|
have_func('duckdb_append_data_chunk', 'duckdb.h')
|
11
12
|
|
12
13
|
have_func('duckdb_free', 'duckdb.h')
|
13
14
|
|
14
|
-
have_func('duckdb_create_config', 'duckdb.h')
|
15
|
-
have_func('duckdb_open_ext', 'duckdb.h')
|
16
|
-
have_func('duckdb_prepare_error', 'duckdb.h')
|
17
|
-
|
18
|
-
have_func('duckdb_append_date', 'duckdb.h')
|
19
|
-
|
20
15
|
create_makefile('duckdb/duckdb_native')
|
@@ -4,6 +4,7 @@ static VALUE cDuckDBPreparedStatement;
|
|
4
4
|
|
5
5
|
static void deallocate(void *ctx);
|
6
6
|
static VALUE allocate(VALUE klass);
|
7
|
+
static size_t memsize(const void *p);
|
7
8
|
static VALUE duckdb_prepared_statement_initialize(VALUE self, VALUE con, VALUE query);
|
8
9
|
static VALUE duckdb_prepared_statement_nparams(VALUE self);
|
9
10
|
static VALUE duckdb_prepared_statement_execute(VALUE self);
|
@@ -23,6 +24,12 @@ static VALUE duckdb_prepared_statement__bind_time(VALUE self, VALUE vidx, VALUE
|
|
23
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);
|
24
25
|
static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VALUE months, VALUE days, VALUE micros);
|
25
26
|
|
27
|
+
static const rb_data_type_t prepared_statement_data_type = {
|
28
|
+
"DuckDB/PreparedStatement",
|
29
|
+
{NULL, deallocate, memsize,},
|
30
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
31
|
+
};
|
32
|
+
|
26
33
|
static void deallocate(void *ctx) {
|
27
34
|
rubyDuckDBPreparedStatement *p = (rubyDuckDBPreparedStatement *)ctx;
|
28
35
|
|
@@ -32,7 +39,11 @@ static void deallocate(void *ctx) {
|
|
32
39
|
|
33
40
|
static VALUE allocate(VALUE klass) {
|
34
41
|
rubyDuckDBPreparedStatement *ctx = xcalloc((size_t)1, sizeof(rubyDuckDBPreparedStatement));
|
35
|
-
return
|
42
|
+
return TypedData_Wrap_Struct(klass, &prepared_statement_data_type, ctx);
|
43
|
+
}
|
44
|
+
|
45
|
+
static size_t memsize(const void *p) {
|
46
|
+
return sizeof(rubyDuckDBPreparedStatement);
|
36
47
|
}
|
37
48
|
|
38
49
|
static VALUE duckdb_prepared_statement_initialize(VALUE self, VALUE con, VALUE query) {
|
@@ -43,24 +54,19 @@ static VALUE duckdb_prepared_statement_initialize(VALUE self, VALUE con, VALUE q
|
|
43
54
|
rb_raise(rb_eTypeError, "1st argument should be instance of DackDB::Connection");
|
44
55
|
}
|
45
56
|
|
46
|
-
|
47
|
-
|
57
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
58
|
+
ctxcon = get_struct_connection(con);
|
48
59
|
|
49
60
|
if (duckdb_prepare(ctxcon->con, StringValuePtr(query), &(ctx->prepared_statement)) == DuckDBError) {
|
50
|
-
#ifdef HAVE_DUCKDB_PREPARE_ERROR
|
51
61
|
const char *error = duckdb_prepare_error(ctx->prepared_statement);
|
52
62
|
rb_raise(eDuckDBError, "%s", error);
|
53
|
-
#else
|
54
|
-
/* TODO: include query parameter information in error message. */
|
55
|
-
rb_raise(eDuckDBError, "failed to prepare statement");
|
56
|
-
#endif
|
57
63
|
}
|
58
64
|
return self;
|
59
65
|
}
|
60
66
|
|
61
67
|
static VALUE duckdb_prepared_statement_nparams(VALUE self) {
|
62
68
|
rubyDuckDBPreparedStatement *ctx;
|
63
|
-
|
69
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
64
70
|
return rb_int2big(duckdb_nparams(ctx->prepared_statement));
|
65
71
|
}
|
66
72
|
|
@@ -70,8 +76,8 @@ static VALUE duckdb_prepared_statement_execute(VALUE self) {
|
|
70
76
|
rubyDuckDBResult *ctxr;
|
71
77
|
VALUE result = create_result();
|
72
78
|
|
73
|
-
|
74
|
-
|
79
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
80
|
+
ctxr = get_struct_result(result);
|
75
81
|
if (duckdb_execute_prepared(ctx->prepared_statement, &(ctxr->result)) == DuckDBError) {
|
76
82
|
rb_raise(eDuckDBError, "%s", duckdb_result_error(&(ctxr->result)));
|
77
83
|
}
|
@@ -90,7 +96,7 @@ static VALUE duckdb_prepared_statement_bind_bool(VALUE self, VALUE vidx, VALUE v
|
|
90
96
|
rubyDuckDBPreparedStatement *ctx;
|
91
97
|
idx_t idx = check_index(vidx);
|
92
98
|
|
93
|
-
|
99
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
94
100
|
if (val != Qtrue && val != Qfalse) {
|
95
101
|
rb_raise(rb_eArgError, "binding value must be boolean");
|
96
102
|
}
|
@@ -106,7 +112,7 @@ static VALUE duckdb_prepared_statement_bind_int8(VALUE self, VALUE vidx, VALUE v
|
|
106
112
|
idx_t idx = check_index(vidx);
|
107
113
|
int8_t i8val = (int8_t)NUM2INT(val);
|
108
114
|
|
109
|
-
|
115
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
110
116
|
|
111
117
|
if (duckdb_bind_int8(ctx->prepared_statement, idx, i8val) == DuckDBError) {
|
112
118
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -119,7 +125,7 @@ static VALUE duckdb_prepared_statement_bind_int16(VALUE self, VALUE vidx, VALUE
|
|
119
125
|
idx_t idx = check_index(vidx);
|
120
126
|
int16_t i16val = NUM2INT(val);
|
121
127
|
|
122
|
-
|
128
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
123
129
|
|
124
130
|
if (duckdb_bind_int16(ctx->prepared_statement, idx, i16val) == DuckDBError) {
|
125
131
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -132,7 +138,7 @@ static VALUE duckdb_prepared_statement_bind_int32(VALUE self, VALUE vidx, VALUE
|
|
132
138
|
idx_t idx = check_index(vidx);
|
133
139
|
int32_t i32val = NUM2INT(val);
|
134
140
|
|
135
|
-
|
141
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
136
142
|
|
137
143
|
if (duckdb_bind_int32(ctx->prepared_statement, idx, i32val) == DuckDBError) {
|
138
144
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -145,7 +151,7 @@ static VALUE duckdb_prepared_statement_bind_int64(VALUE self, VALUE vidx, VALUE
|
|
145
151
|
idx_t idx = check_index(vidx);
|
146
152
|
int64_t i64val = NUM2LL(val);
|
147
153
|
|
148
|
-
|
154
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
149
155
|
|
150
156
|
if (duckdb_bind_int64(ctx->prepared_statement, idx, i64val) == DuckDBError) {
|
151
157
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -158,7 +164,7 @@ static VALUE duckdb_prepared_statement_bind_float(VALUE self, VALUE vidx, VALUE
|
|
158
164
|
idx_t idx = check_index(vidx);
|
159
165
|
double dbl = NUM2DBL(val);
|
160
166
|
|
161
|
-
|
167
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
162
168
|
|
163
169
|
if (duckdb_bind_float(ctx->prepared_statement, idx, (float)dbl) == DuckDBError) {
|
164
170
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -171,7 +177,7 @@ static VALUE duckdb_prepared_statement_bind_double(VALUE self, VALUE vidx, VALUE
|
|
171
177
|
idx_t idx = check_index(vidx);
|
172
178
|
double dbl = NUM2DBL(val);
|
173
179
|
|
174
|
-
|
180
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
175
181
|
|
176
182
|
if (duckdb_bind_double(ctx->prepared_statement, idx, dbl) == DuckDBError) {
|
177
183
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -183,7 +189,8 @@ static VALUE duckdb_prepared_statement_bind_varchar(VALUE self, VALUE vidx, VALU
|
|
183
189
|
rubyDuckDBPreparedStatement *ctx;
|
184
190
|
idx_t idx = check_index(vidx);
|
185
191
|
|
186
|
-
|
192
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
193
|
+
|
187
194
|
if (duckdb_bind_varchar(ctx->prepared_statement, idx, StringValuePtr(str)) == DuckDBError) {
|
188
195
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
189
196
|
}
|
@@ -194,7 +201,8 @@ static VALUE duckdb_prepared_statement_bind_blob(VALUE self, VALUE vidx, VALUE b
|
|
194
201
|
rubyDuckDBPreparedStatement *ctx;
|
195
202
|
idx_t idx = check_index(vidx);
|
196
203
|
|
197
|
-
|
204
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
205
|
+
|
198
206
|
if (duckdb_bind_blob(ctx->prepared_statement, idx, (const void *)StringValuePtr(blob), (idx_t)RSTRING_LEN(blob)) == DuckDBError) {
|
199
207
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
200
208
|
}
|
@@ -205,7 +213,8 @@ static VALUE duckdb_prepared_statement_bind_null(VALUE self, VALUE vidx) {
|
|
205
213
|
rubyDuckDBPreparedStatement *ctx;
|
206
214
|
idx_t idx = check_index(vidx);
|
207
215
|
|
208
|
-
|
216
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
217
|
+
|
209
218
|
if (duckdb_bind_null(ctx->prepared_statement, idx) == DuckDBError) {
|
210
219
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
211
220
|
}
|
@@ -219,10 +228,12 @@ static VALUE duckdb_prepared_statement__bind_date(VALUE self, VALUE vidx, VALUE
|
|
219
228
|
|
220
229
|
dt = to_duckdb_date_from_value(year, month, day);
|
221
230
|
|
222
|
-
|
231
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
232
|
+
|
223
233
|
if (duckdb_bind_date(ctx->prepared_statement, idx, dt) == DuckDBError) {
|
224
234
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
225
235
|
}
|
236
|
+
|
226
237
|
return self;
|
227
238
|
}
|
228
239
|
|
@@ -234,10 +245,12 @@ static VALUE duckdb_prepared_statement__bind_time(VALUE self, VALUE vidx, VALUE
|
|
234
245
|
|
235
246
|
time = to_duckdb_time_from_value(hour, min, sec, micros);
|
236
247
|
|
237
|
-
|
248
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
249
|
+
|
238
250
|
if (duckdb_bind_time(ctx->prepared_statement, idx, time) == DuckDBError) {
|
239
251
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
240
252
|
}
|
253
|
+
|
241
254
|
return self;
|
242
255
|
}
|
243
256
|
|
@@ -247,7 +260,7 @@ static VALUE duckdb_prepared_statement__bind_timestamp(VALUE self, VALUE vidx, V
|
|
247
260
|
idx_t idx = check_index(vidx);
|
248
261
|
|
249
262
|
timestamp = to_duckdb_timestamp_from_value(year, month, day, hour, min, sec, micros);
|
250
|
-
|
263
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
251
264
|
|
252
265
|
if (duckdb_bind_timestamp(ctx->prepared_statement, idx, timestamp) == DuckDBError) {
|
253
266
|
rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
|
@@ -260,7 +273,8 @@ static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VA
|
|
260
273
|
rubyDuckDBPreparedStatement *ctx;
|
261
274
|
idx_t idx = check_index(vidx);
|
262
275
|
|
263
|
-
|
276
|
+
TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
|
277
|
+
|
264
278
|
to_duckdb_interval_from_value(&interval, months, days, micros);
|
265
279
|
|
266
280
|
if (duckdb_bind_interval(ctx->prepared_statement, idx, interval) == DuckDBError) {
|