diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml new file mode 100644 index 0000000..628129c --- /dev/null +++ b/.builds/freebsd.yml @@ -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 + diff --git a/.builds/ubuntu.yml b/.builds/ubuntu.yml new file mode 100644 index 0000000..c5865cd --- /dev/null +++ b/.builds/ubuntu.yml @@ -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 + diff --git a/.pryrc b/.pryrc index 3b34fda..7086754 100644 --- a/.pryrc +++ b/.pryrc @@ -11,4 +11,5 @@ rescue Exception => e e.backtrace.join( "\n\t" ) end +db = MDBX::Database.open( 'tmp/testdb', max_collections: 50 ) diff --git a/History.md b/History.md index e69de29..c651952 100644 --- a/History.md +++ b/History.md @@ -0,0 +1,9 @@ +# Release History for mdbx + +--- + +## v0.0.1 [2020-12-16] Mahlon E. Smith + +Early release, initial basic functionality. + + diff --git a/Manifest.txt b/Manifest.txt index f4069b7..83b9ab6 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -1,3 +1,9 @@ History.md -LICENSE.txt 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 diff --git a/README.md b/README.md index 8f3de2b..0498482 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@ # Ruby MDBX home -: https://gitlab.com/mahlon/ruby-mdbx +: https://code.martini.nu/ruby-mdbx code : https://code.martini.nu/ruby-mdbx +docs +: https://martini.nu/docs/ruby-mdbx + github : https://github.com/mahlon/ruby-mdbx gitlab -: https://gitlab.com/mahlon/ruby-mdbx/-/tree-master +: https://gitlab.com/mahlon/ruby-mdbx - -docs -: https://martini.nu/docs/ruby-mdbx -#FIXME: ....... somewhere on martini +sourcehut: +: https://hg.sr.ht/~mahlon/ruby-mdbx ## Description diff --git a/ext/mdbx_ext/database.c b/ext/mdbx_ext/database.c index fd9c367..bd1dd55 100644 --- a/ext/mdbx_ext/database.c +++ b/ext/mdbx_ext/database.c @@ -113,6 +113,7 @@ rmdbx_open_env( VALUE self ) rb_raise( rmdbx_eDatabaseError, "mdbx_env_create: (%d) %s", rc, mdbx_strerror(rc) ); /* 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 ); 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 ); 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) ); mdbx_txn_commit( db->txn ); - // Close the current handle, will be re-opened - // on the next txn. - // - if ( db->dbi ) { - mdbx_dbi_close( db->env, db->dbi ); - db->dbi = 0; - } + /* Refresh the environment handles. */ + rmdbx_open_env( self ); return Qnil; } @@ -263,10 +259,12 @@ rmdbx_keys( VALUE self ) rb_raise( rmdbx_eDatabaseError, "Unable to open cursor: (%d) %s", rc, mdbx_strerror(rc) ); } - mdbx_cursor_get( db->cursor, &key, &data, MDBX_FIRST ); - rb_ary_push( rv, rb_str_new( key.iov_base, key.iov_len ) ); - while ( mdbx_cursor_get( db->cursor, &key, &data, MDBX_NEXT ) == 0 ) { + 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 ) ); + 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 ); @@ -300,12 +298,10 @@ rmdbx_get_val( VALUE self, VALUE key ) switch ( rc ) { case MDBX_SUCCESS: deserialize_proc = rb_iv_get( self, "@deserializer" ); - if ( ! NIL_P( deserialize_proc ) ) { - return rb_funcall( deserialize_proc, rb_intern("call"), 1, rb_str_new_cstr(data.iov_base) ); - } - else { - return rb_str_new_cstr( data.iov_base ); - } + VALUE rv = rb_str_new( data.iov_base, data.iov_len ); + if ( ! NIL_P( deserialize_proc ) ) + return rb_funcall( deserialize_proc, rb_intern("call"), 1, rv ); + return rv; case MDBX_NOTFOUND: 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 * the new collection on next access. - * + * FIXME: Immediate transaction write to auto-create new env? Fetching from here at the moment causes an error if you haven't written anything yet. @@ -494,12 +490,16 @@ rmdbx_init_database() { 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_protected_method( rmdbx_cDatabase, "initialize", rmdbx_database_initialize, -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, "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, "clear", rmdbx_clear, 0 ); rb_define_method( rmdbx_cDatabase, "keys", rmdbx_keys, 0 ); diff --git a/ext/mdbx_ext/mdbx_ext.c b/ext/mdbx_ext/mdbx_ext.c index aa4a050..3bea4c2 100644 --- a/ext/mdbx_ext/mdbx_ext.c +++ b/ext/mdbx_ext/mdbx_ext.c @@ -4,6 +4,7 @@ VALUE rmdbx_mMDBX; VALUE rmdbx_eDatabaseError; +VALUE rmdbx_eRollback; /* * MDBX initialization @@ -18,6 +19,7 @@ Init_mdbx_ext() rb_define_const( rmdbx_mMDBX, "LIBRARY_VERSION", version ); 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(); } diff --git a/ext/mdbx_ext/mdbx_ext.h b/ext/mdbx_ext/mdbx_ext.h index 1d4d4c1..a96c9fb 100644 --- a/ext/mdbx_ext/mdbx_ext.h +++ b/ext/mdbx_ext/mdbx_ext.h @@ -15,6 +15,7 @@ extern VALUE rmdbx_mMDBX; extern VALUE rmdbx_cDatabase; extern VALUE rmdbx_eDatabaseError; +extern VALUE rmdbx_eRollback; /* ------------------------------------------------------------ diff --git a/lib/mdbx.rb b/lib/mdbx.rb index 9cd51b6..092c966 100644 --- a/lib/mdbx.rb +++ b/lib/mdbx.rb @@ -11,8 +11,8 @@ module MDBX # The version of this gem. # - # Note: the MDBX library version can be found in - # the 'LIBRARY_VERSION' constant. + # Note: the MDBX library version this gem was built + # against can be found in the 'LIBRARY_VERSION' constant. # VERSION = '0.0.1' diff --git a/lib/mdbx/database.rb b/lib/mdbx/database.rb index 6c4f927..9a4eb5b 100644 --- a/lib/mdbx/database.rb +++ b/lib/mdbx/database.rb @@ -18,6 +18,8 @@ class MDBX::Database ### db[ 'key' ] #=> value ### end ### + ### FIXME: options! + ### def self::open( *args, &block ) db = new( *args ) @@ -53,16 +55,14 @@ class MDBX::Database attr_accessor :deserializer - # Allow for some common nomenclature. - alias_method :namespace, :collection - alias_method :reopen, :open - - ### Switch to the top-level collection. ### def main return self.collection( nil ) end + # Allow for some common nomenclature. + alias_method :namespace, :collection + end # class MDBX::Database