diff --git a/ext/bdb.c b/ext/bdb.c index 7ed27ea..07dbf32 100644 --- a/ext/bdb.c +++ b/ext/bdb.c @@ -616,20 +616,22 @@ VALUE db_get(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vdata, VALUE vflags) StringValue(vkey); - key.data = RSTRING_PTR(vkey); - key.size = RSTRING_LEN(vkey); - key.flags = LMEMFLAG; + key.data = RSTRING_PTR(vkey); + key.size = RSTRING_LEN(vkey); + key.flags = LMEMFLAG; if ( ! NIL_P(vdata) ) { StringValue(vdata); data.data = RSTRING_PTR(vdata); data.size = RSTRING_LEN(vdata); - data.flags = LMEMFLAG; } + data.flags = DB_DBT_MALLOC; rv = dbh->db->get(dbh->db,txn?txn->txn:NULL,&key,&data,flags); if ( rv == 0 ) { - return rb_str_new(data.data,data.size); + str = rb_str_new(data.data,data.size); + if (data.data) free(data.data); + return str; } else if (rv == DB_NOTFOUND) { return Qnil; } else { diff --git a/lib/bdb/database.rb b/lib/bdb/database.rb index 10434b5..16c5955 100644 --- a/lib/bdb/database.rb +++ b/lib/bdb/database.rb @@ -61,7 +61,7 @@ class Bdb::Database < Bdb::Base set = Bdb::ResultSet.new(opts, &block) flags = opts[:modify] ? Bdb::DB_RMW : 0 flags = 0 if environment.disable_transactions? - + keys.each do |key| key = get_key(key, opts) if key == :all diff --git a/lib/bdb/environment.rb b/lib/bdb/environment.rb index 1a907eb..8999602 100644 --- a/lib/bdb/environment.rb +++ b/lib/bdb/environment.rb @@ -1,8 +1,9 @@ class Bdb::Environment @@env = {} - def self.new(path, database) + def self.new(path, database = nil) + path = File.expand_path(path) @@env[path] ||= super(path) - @@env[path].databases << database + @@env[path].databases << database if database @@env[path] end @@ -38,7 +39,7 @@ class Bdb::Environment env_flags = Bdb::DB_CREATE | Bdb::DB_INIT_MPOOL else env_flags = Bdb::DB_CREATE | Bdb::DB_INIT_TXN | Bdb::DB_INIT_LOCK | - Bdb::DB_REGISTER | Bdb::DB_RECOVER | Bdb::DB_INIT_MPOOL + Bdb::DB_REGISTER | Bdb::DB_RECOVER | Bdb::DB_INIT_MPOOL | Bdb::DB_THREAD end @env.cachesize = config[:cache_size] if config[:cache_size]