Support dup/clone.
FossilOrigin-Name: 3e6c6b9213ebbe1d6b5e19e5e2886749b0df46a564f716469be0664ac4602902
This commit is contained in:
parent
00036862df
commit
96cad95e0f
2 changed files with 45 additions and 0 deletions
|
|
@ -717,6 +717,34 @@ rmdbx_database_initialize( int argc, VALUE *argv, VALUE self )
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* db.clone => [copy of db]
|
||||
*
|
||||
* Copy the object (clone/dup). The returned copy is closed and needs
|
||||
* to be reopened before use. This function likely has limited use,
|
||||
* considering you can't open two handles within the same process.
|
||||
*/
|
||||
static VALUE rmdbx_init_copy( VALUE copy, VALUE orig )
|
||||
{
|
||||
rmdbx_db_t *orig_db;
|
||||
rmdbx_db_t *copy_db;
|
||||
|
||||
if ( copy == orig ) return copy;
|
||||
|
||||
TypedData_Get_Struct( orig, rmdbx_db_t, &rmdbx_db_data, orig_db );
|
||||
TypedData_Get_Struct( copy, rmdbx_db_t, &rmdbx_db_data, copy_db );
|
||||
|
||||
/* Copy all fields from the original to the copy, and force-close
|
||||
the copy.
|
||||
*/
|
||||
MEMCPY( copy_db, orig_db, rmdbx_db_t, 1 );
|
||||
rmdbx_close_all( copy_db );
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Initialization for the MDBX::Database class.
|
||||
*/
|
||||
|
|
@ -732,6 +760,7 @@ rmdbx_init_database()
|
|||
rb_define_alloc_func( rmdbx_cDatabase, rmdbx_alloc );
|
||||
|
||||
rb_define_protected_method( rmdbx_cDatabase, "initialize", rmdbx_database_initialize, -1 );
|
||||
rb_define_protected_method( rmdbx_cDatabase, "initialize_copy", rmdbx_init_copy, 1 );
|
||||
rb_define_method( rmdbx_cDatabase, "collection", rmdbx_set_subdb, -1 );
|
||||
rb_define_method( rmdbx_cDatabase, "close", rmdbx_close, 0 );
|
||||
rb_define_method( rmdbx_cDatabase, "reopen", rmdbx_open_env, 0 );
|
||||
|
|
|
|||
|
|
@ -31,6 +31,22 @@ RSpec.describe( MDBX::Database ) do
|
|||
expect( db.closed? ).to be_truthy
|
||||
end
|
||||
|
||||
it "can create a closed clone" do
|
||||
db = described_class.open( TEST_DATABASE.to_s )
|
||||
db[1] = "doopydoo"
|
||||
|
||||
clone = db.clone
|
||||
|
||||
expect( db.closed? ).to be_falsey
|
||||
expect( clone.closed? ).to be_truthy
|
||||
expect( db.path ).to eq( clone.path )
|
||||
db.close
|
||||
|
||||
clone.reopen
|
||||
expect( clone[1] ).to eq( "doopydoo" )
|
||||
clone.close
|
||||
end
|
||||
|
||||
|
||||
context 'an opened database' do
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue