Multiple changes.
- Add build manifests for SourceHut. - Update README destination links. - Fix manifest for prerelease gem. - Reopen env handles when #clear is successful. - Fix #each when there is only one key. - Always use io_vec lengths when creating new strings. - Hook for rdoc generation. - Rename #open to #reopen, don't alias it. - Add a Rollback exception for upcoming transaction block work FossilOrigin-Name: d6ddedc51b0ac67f395d5749aa3e6adbeebdaf2843c6402ace757b0afffc2be9
This commit is contained in:
parent
5ed44e52fa
commit
770a931d77
11 changed files with 108 additions and 33 deletions
26
.builds/freebsd.yml
Normal file
26
.builds/freebsd.yml
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
image: freebsd/12.x
|
||||||
|
shell: true
|
||||||
|
packages:
|
||||||
|
- ruby
|
||||||
|
sources:
|
||||||
|
- hg+https://hg.sr.ht/~mahlon/ruby-mdbx
|
||||||
|
tasks:
|
||||||
|
- env-setup: |
|
||||||
|
sudo sh -c 'echo "DEFAULT_VERSIONS+=ruby=2.7" > /etc/make.conf'
|
||||||
|
sudo portsnap fetch extract
|
||||||
|
cd /usr/ports/devel/ruby-gems
|
||||||
|
sudo make -DBATCH install
|
||||||
|
cd /usr/ports/databases/mdbx
|
||||||
|
sudo make -DBATCH install
|
||||||
|
- project-setup: |
|
||||||
|
cd ~/ruby-mdbx
|
||||||
|
sudo gem install -Ng
|
||||||
|
- test: |
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
cd ~/ruby-mdbx
|
||||||
|
rake test
|
||||||
|
triggers:
|
||||||
|
- action: email
|
||||||
|
condition: always
|
||||||
|
to: mahlon@martini.nu
|
||||||
|
|
||||||
29
.builds/ubuntu.yml
Normal file
29
.builds/ubuntu.yml
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
image: ubuntu/lts
|
||||||
|
shell: true
|
||||||
|
packages:
|
||||||
|
- ruby
|
||||||
|
- ruby-dev
|
||||||
|
sources:
|
||||||
|
- hg+https://hg.sr.ht/~mahlon/ruby-mdbx
|
||||||
|
tasks:
|
||||||
|
- env-setup: |
|
||||||
|
git clone https://github.com/erthink/libmdbx.git
|
||||||
|
cd libmdbx
|
||||||
|
make dist
|
||||||
|
cd dist
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
- project-setup: |
|
||||||
|
cd ~/ruby-mdbx
|
||||||
|
sudo gem install -Ng
|
||||||
|
- test: |
|
||||||
|
sudo locale-gen en_US.UTF-8
|
||||||
|
sudo update-locale LANG=en_US.UTF-8
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
cd ~/ruby-mdbx
|
||||||
|
rake test
|
||||||
|
triggers:
|
||||||
|
- action: email
|
||||||
|
condition: always
|
||||||
|
to: mahlon@martini.nu
|
||||||
|
|
||||||
1
.pryrc
1
.pryrc
|
|
@ -11,4 +11,5 @@ rescue Exception => e
|
||||||
e.backtrace.join( "\n\t" )
|
e.backtrace.join( "\n\t" )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
db = MDBX::Database.open( 'tmp/testdb', max_collections: 50 )
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Release History for mdbx
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v0.0.1 [2020-12-16] Mahlon E. Smith <mahlon@martini.nu>
|
||||||
|
|
||||||
|
Early release, initial basic functionality.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
History.md
|
History.md
|
||||||
LICENSE.txt
|
|
||||||
README.md
|
README.md
|
||||||
|
ext/mdbx_ext/extconf.rb
|
||||||
|
ext/mdbx_ext/mdbx_ext.c
|
||||||
|
ext/mdbx_ext/mdbx_ext.h
|
||||||
|
ext/mdbx_ext/database.c
|
||||||
|
lib/mdbx.rb
|
||||||
|
lib/mdbx_ext.so
|
||||||
|
lib/mdbx/database.rb
|
||||||
|
|
|
||||||
13
README.md
13
README.md
|
|
@ -1,21 +1,22 @@
|
||||||
# Ruby MDBX
|
# Ruby MDBX
|
||||||
|
|
||||||
home
|
home
|
||||||
: https://gitlab.com/mahlon/ruby-mdbx
|
: https://code.martini.nu/ruby-mdbx
|
||||||
|
|
||||||
code
|
code
|
||||||
: https://code.martini.nu/ruby-mdbx
|
: https://code.martini.nu/ruby-mdbx
|
||||||
|
|
||||||
|
docs
|
||||||
|
: https://martini.nu/docs/ruby-mdbx
|
||||||
|
|
||||||
github
|
github
|
||||||
: https://github.com/mahlon/ruby-mdbx
|
: https://github.com/mahlon/ruby-mdbx
|
||||||
|
|
||||||
gitlab
|
gitlab
|
||||||
: https://gitlab.com/mahlon/ruby-mdbx/-/tree-master
|
: https://gitlab.com/mahlon/ruby-mdbx
|
||||||
|
|
||||||
|
sourcehut:
|
||||||
docs
|
: https://hg.sr.ht/~mahlon/ruby-mdbx
|
||||||
: https://martini.nu/docs/ruby-mdbx
|
|
||||||
#FIXME: ....... somewhere on martini
|
|
||||||
|
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ rmdbx_open_env( VALUE self )
|
||||||
rb_raise( rmdbx_eDatabaseError, "mdbx_env_create: (%d) %s", rc, mdbx_strerror(rc) );
|
rb_raise( rmdbx_eDatabaseError, "mdbx_env_create: (%d) %s", rc, mdbx_strerror(rc) );
|
||||||
|
|
||||||
/* Set the maximum number of named databases for the environment. */
|
/* Set the maximum number of named databases for the environment. */
|
||||||
|
// FIXME: potenially more env setups here? maxreaders, pagesize?
|
||||||
mdbx_env_set_maxdbs( db->env, db->max_collections );
|
mdbx_env_set_maxdbs( db->env, db->max_collections );
|
||||||
|
|
||||||
rc = mdbx_env_open( db->env, db->path, db->env_flags, db->mode );
|
rc = mdbx_env_open( db->env, db->path, db->env_flags, db->mode );
|
||||||
|
|
@ -184,18 +185,13 @@ rmdbx_clear( VALUE self )
|
||||||
rmdbx_open_txn( self, MDBX_TXN_READWRITE );
|
rmdbx_open_txn( self, MDBX_TXN_READWRITE );
|
||||||
int rc = mdbx_drop( db->txn, db->dbi, true );
|
int rc = mdbx_drop( db->txn, db->dbi, true );
|
||||||
|
|
||||||
if ( rc != 0 )
|
if ( rc != MDBX_SUCCESS )
|
||||||
rb_raise( rmdbx_eDatabaseError, "mdbx_drop: (%d) %s", rc, mdbx_strerror(rc) );
|
rb_raise( rmdbx_eDatabaseError, "mdbx_drop: (%d) %s", rc, mdbx_strerror(rc) );
|
||||||
|
|
||||||
mdbx_txn_commit( db->txn );
|
mdbx_txn_commit( db->txn );
|
||||||
|
|
||||||
// Close the current handle, will be re-opened
|
/* Refresh the environment handles. */
|
||||||
// on the next txn.
|
rmdbx_open_env( self );
|
||||||
//
|
|
||||||
if ( db->dbi ) {
|
|
||||||
mdbx_dbi_close( db->env, db->dbi );
|
|
||||||
db->dbi = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
@ -263,11 +259,13 @@ rmdbx_keys( VALUE self )
|
||||||
rb_raise( rmdbx_eDatabaseError, "Unable to open cursor: (%d) %s", rc, mdbx_strerror(rc) );
|
rb_raise( rmdbx_eDatabaseError, "Unable to open cursor: (%d) %s", rc, mdbx_strerror(rc) );
|
||||||
}
|
}
|
||||||
|
|
||||||
mdbx_cursor_get( db->cursor, &key, &data, MDBX_FIRST );
|
rc = mdbx_cursor_get( db->cursor, &key, &data, MDBX_FIRST );
|
||||||
|
if ( rc == MDBX_SUCCESS ) {
|
||||||
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) );
|
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) );
|
||||||
while ( mdbx_cursor_get( db->cursor, &key, &data, MDBX_NEXT ) == 0 ) {
|
while ( mdbx_cursor_get( db->cursor, &key, &data, MDBX_NEXT ) == 0 ) {
|
||||||
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) );
|
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mdbx_cursor_close( db->cursor );
|
mdbx_cursor_close( db->cursor );
|
||||||
db->cursor = NULL;
|
db->cursor = NULL;
|
||||||
|
|
@ -300,12 +298,10 @@ rmdbx_get_val( VALUE self, VALUE key )
|
||||||
switch ( rc ) {
|
switch ( rc ) {
|
||||||
case MDBX_SUCCESS:
|
case MDBX_SUCCESS:
|
||||||
deserialize_proc = rb_iv_get( self, "@deserializer" );
|
deserialize_proc = rb_iv_get( self, "@deserializer" );
|
||||||
if ( ! NIL_P( deserialize_proc ) ) {
|
VALUE rv = rb_str_new( data.iov_base, data.iov_len );
|
||||||
return rb_funcall( deserialize_proc, rb_intern("call"), 1, rb_str_new_cstr(data.iov_base) );
|
if ( ! NIL_P( deserialize_proc ) )
|
||||||
}
|
return rb_funcall( deserialize_proc, rb_intern("call"), 1, rv );
|
||||||
else {
|
return rv;
|
||||||
return rb_str_new_cstr( data.iov_base );
|
|
||||||
}
|
|
||||||
|
|
||||||
case MDBX_NOTFOUND:
|
case MDBX_NOTFOUND:
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
|
@ -494,12 +490,16 @@ rmdbx_init_database()
|
||||||
{
|
{
|
||||||
rmdbx_cDatabase = rb_define_class_under( rmdbx_mMDBX, "Database", rb_cData );
|
rmdbx_cDatabase = rb_define_class_under( rmdbx_mMDBX, "Database", rb_cData );
|
||||||
|
|
||||||
|
#ifdef FOR_RDOC
|
||||||
|
rmdbx_mMDBX = rb_define_module( "MDBX" );
|
||||||
|
#endif
|
||||||
|
|
||||||
rb_define_alloc_func( rmdbx_cDatabase, rmdbx_alloc );
|
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", rmdbx_database_initialize, -1 );
|
||||||
rb_define_method( rmdbx_cDatabase, "collection", rmdbx_set_subdb, -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, "close", rmdbx_close, 0 );
|
||||||
rb_define_method( rmdbx_cDatabase, "open", rmdbx_open_env, 0 );
|
rb_define_method( rmdbx_cDatabase, "reopen", rmdbx_open_env, 0 );
|
||||||
rb_define_method( rmdbx_cDatabase, "closed?", rmdbx_closed_p, 0 );
|
rb_define_method( rmdbx_cDatabase, "closed?", rmdbx_closed_p, 0 );
|
||||||
rb_define_method( rmdbx_cDatabase, "clear", rmdbx_clear, 0 );
|
rb_define_method( rmdbx_cDatabase, "clear", rmdbx_clear, 0 );
|
||||||
rb_define_method( rmdbx_cDatabase, "keys", rmdbx_keys, 0 );
|
rb_define_method( rmdbx_cDatabase, "keys", rmdbx_keys, 0 );
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
VALUE rmdbx_mMDBX;
|
VALUE rmdbx_mMDBX;
|
||||||
VALUE rmdbx_eDatabaseError;
|
VALUE rmdbx_eDatabaseError;
|
||||||
|
VALUE rmdbx_eRollback;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MDBX initialization
|
* MDBX initialization
|
||||||
|
|
@ -18,6 +19,7 @@ Init_mdbx_ext()
|
||||||
rb_define_const( rmdbx_mMDBX, "LIBRARY_VERSION", version );
|
rb_define_const( rmdbx_mMDBX, "LIBRARY_VERSION", version );
|
||||||
|
|
||||||
rmdbx_eDatabaseError = rb_define_class_under( rmdbx_mMDBX, "DatabaseError", rb_eRuntimeError );
|
rmdbx_eDatabaseError = rb_define_class_under( rmdbx_mMDBX, "DatabaseError", rb_eRuntimeError );
|
||||||
|
rmdbx_eRollback = rb_define_class_under( rmdbx_mMDBX, "Rollback", rb_eRuntimeError );
|
||||||
|
|
||||||
rmdbx_init_database();
|
rmdbx_init_database();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
extern VALUE rmdbx_mMDBX;
|
extern VALUE rmdbx_mMDBX;
|
||||||
extern VALUE rmdbx_cDatabase;
|
extern VALUE rmdbx_cDatabase;
|
||||||
extern VALUE rmdbx_eDatabaseError;
|
extern VALUE rmdbx_eDatabaseError;
|
||||||
|
extern VALUE rmdbx_eRollback;
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
/* ------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ module MDBX
|
||||||
|
|
||||||
# The version of this gem.
|
# The version of this gem.
|
||||||
#
|
#
|
||||||
# Note: the MDBX library version can be found in
|
# Note: the MDBX library version this gem was built
|
||||||
# the 'LIBRARY_VERSION' constant.
|
# against can be found in the 'LIBRARY_VERSION' constant.
|
||||||
#
|
#
|
||||||
VERSION = '0.0.1'
|
VERSION = '0.0.1'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ class MDBX::Database
|
||||||
### db[ 'key' ] #=> value
|
### db[ 'key' ] #=> value
|
||||||
### end
|
### end
|
||||||
###
|
###
|
||||||
|
### FIXME: options!
|
||||||
|
###
|
||||||
def self::open( *args, &block )
|
def self::open( *args, &block )
|
||||||
db = new( *args )
|
db = new( *args )
|
||||||
|
|
||||||
|
|
@ -53,16 +55,14 @@ class MDBX::Database
|
||||||
attr_accessor :deserializer
|
attr_accessor :deserializer
|
||||||
|
|
||||||
|
|
||||||
# Allow for some common nomenclature.
|
|
||||||
alias_method :namespace, :collection
|
|
||||||
alias_method :reopen, :open
|
|
||||||
|
|
||||||
|
|
||||||
### Switch to the top-level collection.
|
### Switch to the top-level collection.
|
||||||
###
|
###
|
||||||
def main
|
def main
|
||||||
return self.collection( nil )
|
return self.collection( nil )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Allow for some common nomenclature.
|
||||||
|
alias_method :namespace, :collection
|
||||||
|
|
||||||
end # class MDBX::Database
|
end # class MDBX::Database
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue