/* call-seq: SQLite3::Backup.new(dstdb, dstname, srcdb, srcname) * * Initialize backup the backup. * * dstdb: * the destination SQLite3::Database object. * dstname: * the destination's database name. * srcdb: * the source SQLite3::Database object. * srcname: * the source's database name. * * The database name is "main", "temp", or the name specified in an * ATTACH statement. * * This feature requires SQLite 3.6.11 or later. * * require 'sqlite3' * sdb = SQLite3::Database.new('src.sqlite3') * * ddb = SQLite3::Database.new(':memory:') * b = SQLite3::Backup.new(ddb, 'main', sdb, 'main') * p [b.remaining, b.pagecount] # invalid value; for example [0, 0] * begin * p b.step(1) #=> OK or DONE * p [b.remaining, b.pagecount] * end while b.remaining > 0 * b.finish * * ddb = SQLite3::Database.new(':memory:') * b = SQLite3::Backup.new(ddb, 'main', sdb, 'main') * b.step(-1) #=> DONE * b.finish * */ static VALUE initialize(VALUE self, VALUE dstdb, VALUE dstname, VALUE srcdb, VALUE srcname) { sqlite3BackupRubyPtr ctx; sqlite3RubyPtr ddb_ctx, sdb_ctx; sqlite3_backup *pBackup; Data_Get_Struct(self, sqlite3BackupRuby, ctx); Data_Get_Struct(dstdb, sqlite3Ruby, ddb_ctx); Data_Get_Struct(srcdb, sqlite3Ruby, sdb_ctx); if(!sdb_ctx->db) rb_raise(rb_eArgError, "cannot backup from a closed database"); if(!ddb_ctx->db) rb_raise(rb_eArgError, "cannot backup to a closed database"); pBackup = sqlite3_backup_init(ddb_ctx->db, StringValuePtr(dstname), sdb_ctx->db, StringValuePtr(srcname)); if( pBackup ){ ctx->p = pBackup; } else { CHECK(ddb_ctx->db, sqlite3_errcode(ddb_ctx->db)); } return self; }