Skip to content

Commit f2ad911

Browse files
committed
Convert SQLite3::Backup objects to TypedData API
The replacement API was introduced in Ruby 1.9.2 (2010), and the old untyped data API was marked a deprecated in the documentation as of Ruby 2.3.0 (2015) Ref: https://bugs.ruby-lang.org/issues/19998
1 parent 61d8e1f commit f2ad911

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

ext/sqlite3/backup.c

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,29 @@
88

99
VALUE cSqlite3Backup;
1010

11-
static void deallocate(void * ctx)
11+
static size_t backup_memsize(const void *data)
1212
{
13-
sqlite3BackupRubyPtr c = (sqlite3BackupRubyPtr)ctx;
14-
xfree(c);
13+
sqlite3BackupRubyPtr ctx = (sqlite3BackupRubyPtr)data;
14+
// NB: can't account for ctx->p because the type is incomplete.
15+
return sizeof(*ctx);
1516
}
1617

18+
static const rb_data_type_t backup_type = {
19+
"SQLite3::Backup",
20+
{
21+
NULL,
22+
RUBY_TYPED_DEFAULT_FREE,
23+
backup_memsize,
24+
},
25+
0,
26+
0,
27+
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
28+
};
29+
1730
static VALUE allocate(VALUE klass)
1831
{
19-
sqlite3BackupRubyPtr ctx = xcalloc((size_t)1, sizeof(sqlite3BackupRuby));
20-
return Data_Wrap_Struct(klass, NULL, deallocate, ctx);
32+
sqlite3BackupRubyPtr ctx;
33+
return TypedData_Make_Struct(klass, sqlite3BackupRuby, &backup_type, ctx);
2134
}
2235

2336
/* call-seq: SQLite3::Backup.new(dstdb, dstname, srcdb, srcname)
@@ -62,7 +75,7 @@ static VALUE initialize(VALUE self, VALUE dstdb, VALUE dstname, VALUE srcdb, VAL
6275
sqlite3RubyPtr ddb_ctx, sdb_ctx;
6376
sqlite3_backup *pBackup;
6477

65-
Data_Get_Struct(self, sqlite3BackupRuby, ctx);
78+
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
6679
Data_Get_Struct(dstdb, sqlite3Ruby, ddb_ctx);
6780
Data_Get_Struct(srcdb, sqlite3Ruby, sdb_ctx);
6881

@@ -97,7 +110,7 @@ static VALUE step(VALUE self, VALUE nPage)
97110
sqlite3BackupRubyPtr ctx;
98111
int status;
99112

100-
Data_Get_Struct(self, sqlite3BackupRuby, ctx);
113+
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
101114
REQUIRE_OPEN_BACKUP(ctx);
102115
status = sqlite3_backup_step(ctx->p, NUM2INT(nPage));
103116
return INT2NUM(status);
@@ -111,7 +124,7 @@ static VALUE finish(VALUE self)
111124
{
112125
sqlite3BackupRubyPtr ctx;
113126

114-
Data_Get_Struct(self, sqlite3BackupRuby, ctx);
127+
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
115128
REQUIRE_OPEN_BACKUP(ctx);
116129
(void)sqlite3_backup_finish(ctx->p);
117130
ctx->p = NULL;
@@ -129,7 +142,7 @@ static VALUE remaining(VALUE self)
129142
{
130143
sqlite3BackupRubyPtr ctx;
131144

132-
Data_Get_Struct(self, sqlite3BackupRuby, ctx);
145+
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
133146
REQUIRE_OPEN_BACKUP(ctx);
134147
return INT2NUM(sqlite3_backup_remaining(ctx->p));
135148
}
@@ -145,7 +158,7 @@ static VALUE pagecount(VALUE self)
145158
{
146159
sqlite3BackupRubyPtr ctx;
147160

148-
Data_Get_Struct(self, sqlite3BackupRuby, ctx);
161+
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
149162
REQUIRE_OPEN_BACKUP(ctx);
150163
return INT2NUM(sqlite3_backup_pagecount(ctx->p));
151164
}

0 commit comments

Comments
 (0)