Skip to content

Commit

Permalink
Convert SQLite3::Backup objects to TypedData API
Browse files Browse the repository at this point in the history
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
  • Loading branch information
byroot committed Nov 30, 2023
1 parent 61d8e1f commit f2ad911
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions ext/sqlite3/backup.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,29 @@

VALUE cSqlite3Backup;

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

static const rb_data_type_t backup_type = {
"SQLite3::Backup",
{
NULL,
RUBY_TYPED_DEFAULT_FREE,
backup_memsize,
},
0,
0,
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
};

static VALUE allocate(VALUE klass)
{
sqlite3BackupRubyPtr ctx = xcalloc((size_t)1, sizeof(sqlite3BackupRuby));
return Data_Wrap_Struct(klass, NULL, deallocate, ctx);
sqlite3BackupRubyPtr ctx;
return TypedData_Make_Struct(klass, sqlite3BackupRuby, &backup_type, ctx);
}

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

Data_Get_Struct(self, sqlite3BackupRuby, ctx);
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
Data_Get_Struct(dstdb, sqlite3Ruby, ddb_ctx);
Data_Get_Struct(srcdb, sqlite3Ruby, sdb_ctx);

Expand Down Expand Up @@ -97,7 +110,7 @@ static VALUE step(VALUE self, VALUE nPage)
sqlite3BackupRubyPtr ctx;
int status;

Data_Get_Struct(self, sqlite3BackupRuby, ctx);
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
REQUIRE_OPEN_BACKUP(ctx);
status = sqlite3_backup_step(ctx->p, NUM2INT(nPage));
return INT2NUM(status);
Expand All @@ -111,7 +124,7 @@ static VALUE finish(VALUE self)
{
sqlite3BackupRubyPtr ctx;

Data_Get_Struct(self, sqlite3BackupRuby, ctx);
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
REQUIRE_OPEN_BACKUP(ctx);
(void)sqlite3_backup_finish(ctx->p);
ctx->p = NULL;
Expand All @@ -129,7 +142,7 @@ static VALUE remaining(VALUE self)
{
sqlite3BackupRubyPtr ctx;

Data_Get_Struct(self, sqlite3BackupRuby, ctx);
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
REQUIRE_OPEN_BACKUP(ctx);
return INT2NUM(sqlite3_backup_remaining(ctx->p));
}
Expand All @@ -145,7 +158,7 @@ static VALUE pagecount(VALUE self)
{
sqlite3BackupRubyPtr ctx;

Data_Get_Struct(self, sqlite3BackupRuby, ctx);
TypedData_Get_Struct(self, sqlite3BackupRuby, &backup_type, ctx);
REQUIRE_OPEN_BACKUP(ctx);
return INT2NUM(sqlite3_backup_pagecount(ctx->p));
}
Expand Down

0 comments on commit f2ad911

Please sign in to comment.