@@ -21,10 +21,29 @@ static void deallocate(void * ctx)
21
21
xfree (c );
22
22
}
23
23
24
+ static size_t database_memsize (const void * ctx )
25
+ {
26
+ const sqlite3RubyPtr c = (const sqlite3RubyPtr )ctx ;
27
+ // NB: can't account for ctx->db because the type is incomplete.
28
+ return sizeof (* c );
29
+ }
30
+
31
+ static const rb_data_type_t database_type = {
32
+ "SQLite3::Backup" ,
33
+ {
34
+ NULL ,
35
+ deallocate ,
36
+ database_memsize ,
37
+ },
38
+ 0 ,
39
+ 0 ,
40
+ RUBY_TYPED_WB_PROTECTED , // Not freed immediately because the dfree function do IOs.
41
+ };
42
+
24
43
static VALUE allocate (VALUE klass )
25
44
{
26
- sqlite3RubyPtr ctx = xcalloc (( size_t ) 1 , sizeof ( sqlite3Ruby )) ;
27
- return Data_Wrap_Struct (klass , NULL , deallocate , ctx );
45
+ sqlite3RubyPtr ctx ;
46
+ return TypedData_Make_Struct (klass , sqlite3Ruby , & database_type , ctx );
28
47
}
29
48
30
49
static char *
@@ -37,12 +56,18 @@ utf16_string_value_ptr(VALUE str)
37
56
38
57
static VALUE sqlite3_rb_close (VALUE self );
39
58
59
+ sqlite3RubyPtr sqlite3_database_unwrap (VALUE database ){
60
+ sqlite3RubyPtr ctx ;
61
+ TypedData_Get_Struct (database , sqlite3Ruby , & database_type , ctx );
62
+ return ctx ;
63
+ }
64
+
40
65
static VALUE rb_sqlite3_open_v2 (VALUE self , VALUE file , VALUE mode , VALUE zvfs )
41
66
{
42
67
sqlite3RubyPtr ctx ;
43
68
int status ;
44
69
45
- Data_Get_Struct (self , sqlite3Ruby , ctx );
70
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
46
71
47
72
#if defined TAINTING_SUPPORT
48
73
# if defined StringValueCStr
@@ -69,7 +94,7 @@ static VALUE rb_sqlite3_disable_quirk_mode(VALUE self)
69
94
{
70
95
#if defined SQLITE_DBCONFIG_DQS_DDL
71
96
sqlite3RubyPtr ctx ;
72
- Data_Get_Struct (self , sqlite3Ruby , ctx );
97
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
73
98
74
99
if (!ctx -> db ) return Qfalse ;
75
100
@@ -90,7 +115,7 @@ static VALUE sqlite3_rb_close(VALUE self)
90
115
{
91
116
sqlite3RubyPtr ctx ;
92
117
sqlite3 * db ;
93
- Data_Get_Struct (self , sqlite3Ruby , ctx );
118
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
94
119
95
120
db = ctx -> db ;
96
121
CHECK (db , sqlite3_close (ctx -> db ));
@@ -109,7 +134,7 @@ static VALUE sqlite3_rb_close(VALUE self)
109
134
static VALUE closed_p (VALUE self )
110
135
{
111
136
sqlite3RubyPtr ctx ;
112
- Data_Get_Struct (self , sqlite3Ruby , ctx );
137
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
113
138
114
139
if (!ctx -> db ) return Qtrue ;
115
140
@@ -124,7 +149,7 @@ static VALUE closed_p(VALUE self)
124
149
static VALUE total_changes (VALUE self )
125
150
{
126
151
sqlite3RubyPtr ctx ;
127
- Data_Get_Struct (self , sqlite3Ruby , ctx );
152
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
128
153
REQUIRE_OPEN_DB (ctx );
129
154
130
155
return INT2NUM (sqlite3_total_changes (ctx -> db ));
@@ -150,7 +175,7 @@ static VALUE trace(int argc, VALUE *argv, VALUE self)
150
175
sqlite3RubyPtr ctx ;
151
176
VALUE block ;
152
177
153
- Data_Get_Struct (self , sqlite3Ruby , ctx );
178
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
154
179
REQUIRE_OPEN_DB (ctx );
155
180
156
181
rb_scan_args (argc , argv , "01" , & block );
@@ -195,7 +220,7 @@ static VALUE busy_handler(int argc, VALUE *argv, VALUE self)
195
220
VALUE block ;
196
221
int status ;
197
222
198
- Data_Get_Struct (self , sqlite3Ruby , ctx );
223
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
199
224
REQUIRE_OPEN_DB (ctx );
200
225
201
226
rb_scan_args (argc , argv , "01" , & block );
@@ -220,7 +245,7 @@ static VALUE busy_handler(int argc, VALUE *argv, VALUE self)
220
245
static VALUE last_insert_row_id (VALUE self )
221
246
{
222
247
sqlite3RubyPtr ctx ;
223
- Data_Get_Struct (self , sqlite3Ruby , ctx );
248
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
224
249
REQUIRE_OPEN_DB (ctx );
225
250
226
251
return LL2NUM (sqlite3_last_insert_rowid (ctx -> db ));
@@ -340,7 +365,7 @@ static VALUE define_function_with_flags(VALUE self, VALUE name, VALUE flags)
340
365
VALUE block ;
341
366
int status ;
342
367
343
- Data_Get_Struct (self , sqlite3Ruby , ctx );
368
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
344
369
REQUIRE_OPEN_DB (ctx );
345
370
346
371
block = rb_block_proc ();
@@ -380,7 +405,7 @@ static VALUE define_function(VALUE self, VALUE name)
380
405
static VALUE interrupt (VALUE self )
381
406
{
382
407
sqlite3RubyPtr ctx ;
383
- Data_Get_Struct (self , sqlite3Ruby , ctx );
408
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
384
409
REQUIRE_OPEN_DB (ctx );
385
410
386
411
sqlite3_interrupt (ctx -> db );
@@ -396,7 +421,7 @@ static VALUE interrupt(VALUE self)
396
421
static VALUE errmsg (VALUE self )
397
422
{
398
423
sqlite3RubyPtr ctx ;
399
- Data_Get_Struct (self , sqlite3Ruby , ctx );
424
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
400
425
REQUIRE_OPEN_DB (ctx );
401
426
402
427
return rb_str_new2 (sqlite3_errmsg (ctx -> db ));
@@ -410,7 +435,7 @@ static VALUE errmsg(VALUE self)
410
435
static VALUE errcode_ (VALUE self )
411
436
{
412
437
sqlite3RubyPtr ctx ;
413
- Data_Get_Struct (self , sqlite3Ruby , ctx );
438
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
414
439
REQUIRE_OPEN_DB (ctx );
415
440
416
441
return INT2NUM (sqlite3_errcode (ctx -> db ));
@@ -438,7 +463,7 @@ static VALUE complete_p(VALUE UNUSED(self), VALUE sql)
438
463
static VALUE changes (VALUE self )
439
464
{
440
465
sqlite3RubyPtr ctx ;
441
- Data_Get_Struct (self , sqlite3Ruby , ctx );
466
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
442
467
REQUIRE_OPEN_DB (ctx );
443
468
444
469
return INT2NUM (sqlite3_changes (ctx -> db ));
@@ -483,7 +508,7 @@ static VALUE set_authorizer(VALUE self, VALUE authorizer)
483
508
sqlite3RubyPtr ctx ;
484
509
int status ;
485
510
486
- Data_Get_Struct (self , sqlite3Ruby , ctx );
511
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
487
512
REQUIRE_OPEN_DB (ctx );
488
513
489
514
status = sqlite3_set_authorizer (
@@ -510,7 +535,7 @@ static VALUE set_authorizer(VALUE self, VALUE authorizer)
510
535
static VALUE set_busy_timeout (VALUE self , VALUE timeout )
511
536
{
512
537
sqlite3RubyPtr ctx ;
513
- Data_Get_Struct (self , sqlite3Ruby , ctx );
538
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
514
539
REQUIRE_OPEN_DB (ctx );
515
540
516
541
CHECK (ctx -> db , sqlite3_busy_timeout (ctx -> db , (int )NUM2INT (timeout )));
@@ -526,7 +551,7 @@ static VALUE set_busy_timeout(VALUE self, VALUE timeout)
526
551
static VALUE set_extended_result_codes (VALUE self , VALUE enable )
527
552
{
528
553
sqlite3RubyPtr ctx ;
529
- Data_Get_Struct (self , sqlite3Ruby , ctx );
554
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
530
555
REQUIRE_OPEN_DB (ctx );
531
556
532
557
CHECK (ctx -> db , sqlite3_extended_result_codes (ctx -> db , RTEST (enable ) ? 1 : 0 ));
@@ -571,7 +596,7 @@ int rb_comparator_func(void * ctx, int a_len, const void * a, int b_len, const v
571
596
static VALUE collation (VALUE self , VALUE name , VALUE comparator )
572
597
{
573
598
sqlite3RubyPtr ctx ;
574
- Data_Get_Struct (self , sqlite3Ruby , ctx );
599
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
575
600
REQUIRE_OPEN_DB (ctx );
576
601
577
602
CHECK (ctx -> db , sqlite3_create_collation (
@@ -600,7 +625,7 @@ static VALUE load_extension(VALUE self, VALUE file)
600
625
int status ;
601
626
char * errMsg ;
602
627
VALUE errexp ;
603
- Data_Get_Struct (self , sqlite3Ruby , ctx );
628
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
604
629
REQUIRE_OPEN_DB (ctx );
605
630
606
631
status = sqlite3_load_extension (ctx -> db , StringValuePtr (file ), 0 , & errMsg );
@@ -624,7 +649,7 @@ static VALUE enable_load_extension(VALUE self, VALUE onoff)
624
649
{
625
650
sqlite3RubyPtr ctx ;
626
651
int onoffparam ;
627
- Data_Get_Struct (self , sqlite3Ruby , ctx );
652
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
628
653
REQUIRE_OPEN_DB (ctx );
629
654
630
655
if (Qtrue == onoff ) {
@@ -661,7 +686,7 @@ static VALUE db_encoding(VALUE self)
661
686
sqlite3RubyPtr ctx ;
662
687
VALUE enc ;
663
688
664
- Data_Get_Struct (self , sqlite3Ruby , ctx );
689
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
665
690
REQUIRE_OPEN_DB (ctx );
666
691
667
692
enc = rb_iv_get (self , "@encoding" );
@@ -681,7 +706,7 @@ static VALUE db_encoding(VALUE self)
681
706
static VALUE transaction_active_p (VALUE self )
682
707
{
683
708
sqlite3RubyPtr ctx ;
684
- Data_Get_Struct (self , sqlite3Ruby , ctx );
709
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
685
710
REQUIRE_OPEN_DB (ctx );
686
711
687
712
return sqlite3_get_autocommit (ctx -> db ) ? Qfalse : Qtrue ;
@@ -740,7 +765,7 @@ static VALUE exec_batch(VALUE self, VALUE sql, VALUE results_as_hash)
740
765
char * errMsg ;
741
766
VALUE errexp ;
742
767
743
- Data_Get_Struct (self , sqlite3Ruby , ctx );
768
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
744
769
REQUIRE_OPEN_DB (ctx );
745
770
746
771
if (results_as_hash == Qtrue ) {
@@ -768,7 +793,7 @@ static VALUE db_filename(VALUE self, VALUE db_name)
768
793
{
769
794
sqlite3RubyPtr ctx ;
770
795
const char * fname ;
771
- Data_Get_Struct (self , sqlite3Ruby , ctx );
796
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
772
797
REQUIRE_OPEN_DB (ctx );
773
798
774
799
fname = sqlite3_db_filename (ctx -> db , StringValueCStr (db_name ));
@@ -782,7 +807,7 @@ static VALUE rb_sqlite3_open16(VALUE self, VALUE file)
782
807
int status ;
783
808
sqlite3RubyPtr ctx ;
784
809
785
- Data_Get_Struct (self , sqlite3Ruby , ctx );
810
+ TypedData_Get_Struct (self , sqlite3Ruby , & database_type , ctx );
786
811
787
812
#if defined TAINTING_SUPPORT
788
813
#if defined StringValueCStr
0 commit comments