duckdb 0.3.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
- void init_duckdb_config(void);
10
+ rubyDuckDBConfig *get_struct_config(VALUE obj);
13
11
 
14
- #endif
12
+ void init_duckdb_config(void);
15
13
 
16
14
  #endif
17
-
18
-
@@ -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 Data_Wrap_Struct(klass, NULL, deallocate, ctx);
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
- Data_Get_Struct(oDuckDBDatabase, rubyDuckDB, ctxdb);
45
+ ctxdb = get_struct_database(oDuckDBDatabase);
29
46
 
30
47
  obj = allocate(cDuckDBConnection);
31
- Data_Get_Struct(obj, rubyDuckDBConnection, ctxcon);
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
- Data_Get_Struct(self, rubyDuckDBConnection, ctx);
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
- Data_Get_Struct(oDuckDBDatabase, rubyDuckDB, ctxdb);
58
- Data_Get_Struct(self, rubyDuckDBConnection, ctx);
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
- Data_Get_Struct(self, rubyDuckDBConnection, ctx);
74
- Data_Get_Struct(result, rubyDuckDBResult, ctxr);
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");
@@ -7,6 +7,7 @@ struct _rubyDuckDBConnection {
7
7
 
8
8
  typedef struct _rubyDuckDBConnection rubyDuckDBConnection;
9
9
 
10
+ rubyDuckDBConnection *get_struct_connection(VALUE obj);
10
11
  void init_duckdb_connection(void);
11
12
  VALUE create_connection(VALUE oDuckDBDatabase);
12
13
 
@@ -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 Data_Wrap_Struct(klass, NULL, deallocate, ctx);
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
- Data_Get_Struct(obj, rubyDuckDB, ctx);
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
- Data_Get_Struct(obj, rubyDuckDB, ctx);
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
- Data_Get_Struct(config, rubyDuckDBConfig, ctx_config);
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
- Data_Get_Struct(self, rubyDuckDB, ctx);
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
  }
@@ -7,6 +7,7 @@ struct _rubyDuckDB {
7
7
 
8
8
  typedef struct _rubyDuckDB rubyDuckDB;
9
9
 
10
+ rubyDuckDB *get_struct_database(VALUE obj);
10
11
  void init_duckdb_database(void);
11
12
 
12
13
  #endif
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
  }
@@ -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 Data_Wrap_Struct(klass, NULL, deallocate, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
47
- Data_Get_Struct(con, rubyDuckDBConnection, ctxcon);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
74
- Data_Get_Struct(result, rubyDuckDBResult, ctxr);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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
- Data_Get_Struct(self, rubyDuckDBPreparedStatement, ctx);
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) {