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

View file

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

View file

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

View file

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

View file

@ -15,6 +15,7 @@
extern VALUE rmdbx_mMDBX;
extern VALUE rmdbx_cDatabase;
extern VALUE rmdbx_eDatabaseError;
extern VALUE rmdbx_eRollback;
/* ------------------------------------------------------------

View file

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

View file

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