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:
Mahlon E. Smith 2020-12-22 06:24:18 +00:00
parent 5ed44e52fa
commit 770a931d77
11 changed files with 108 additions and 33 deletions

26
.builds/freebsd.yml Normal file
View 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
View 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
View file

@ -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 )

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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,10 +259,12 @@ 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 );
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) ); if ( rc == MDBX_SUCCESS ) {
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 ) );
while ( mdbx_cursor_get( db->cursor, &key, &data, MDBX_NEXT ) == 0 ) {
rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) );
}
} }
mdbx_cursor_close( db->cursor ); mdbx_cursor_close( db->cursor );
@ -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;
@ -384,7 +380,7 @@ rmdbx_set_subdb( int argc, VALUE *argv, VALUE self )
/* Close any currently open dbi handle, to be re-opened with /* Close any currently open dbi handle, to be re-opened with
* the new collection on next access. * the new collection on next access.
* *
FIXME: Immediate transaction write to auto-create new env? FIXME: Immediate transaction write to auto-create new env?
Fetching from here at the moment causes an error if you Fetching from here at the moment causes an error if you
haven't written anything yet. haven't written anything yet.
@ -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 );

View file

@ -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();
} }

View file

@ -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;
/* ------------------------------------------------------------ /* ------------------------------------------------------------

View file

@ -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'

View file

@ -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