sbdb 0.0.10.1 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -23,21 +23,22 @@ First, open environment and database
23
23
 
24
24
  require 'sbdb'
25
25
  Dir.mkdir 'newenv' rescue Errno::EEXIST
26
- env = SBDB::Env.new 'newenv', SBDB::CREATE
27
- db = env.open SBDB::Btree, 'newdb.db', :flags => SBDB::CREATE
26
+ env = SBDB::Env.new 'newenv', SBDB::CREATE | SBDB::Env::INIT_TRANSACTION
27
+ db = env.btree 'newdb.db', :flags => SBDB::CREATE
28
28
 
29
29
  It works nearly like a Ruby-Hash:
30
30
 
31
31
  db['key'] = 'value'
32
- db['key'] # => 'value'
33
- db.to_hash # => {'key'=>'value'}
34
- db.map {|k, v| [k, v].join ' => '} # => ["key => value"]
35
- db.count # => 1
32
+ db['key'] # => 'value'
33
+ db.to_hash # => {'key'=>'value'}
34
+ db.map {|k, v| "k => v" } # => ["key => value"]
35
+ db.count # => 1
36
+ db.each {|k,v| puts "#{k}: #{v}" }
36
37
 
37
- SBDB::DB#each uses a SBDB::Cursor:
38
+ `SBDB::DB#each` uses a `SBDB::Cursor`:
38
39
 
39
40
  cursor = db.cursor
40
- cursor.each {|k,v| puts "#{k}: ${v}" }
41
+ cursor.each {|k,v| puts "#{k}: #{v}" }
41
42
 
42
43
  **Don't forget to close everything, you've opened!**
43
44
 
@@ -47,10 +48,14 @@ SBDB::DB#each uses a SBDB::Cursor:
47
48
 
48
49
  But you can use a *lambda* to ensure to close everything:
49
50
 
50
- SBDB::Env.new( 'newenv', SBDB::CREATE) do |env|
51
+ SBDB::Env.new( 'newenv', SBDB::CREATE | SBDB::Env::INIT_TRANSACTION) do |env|
51
52
  env.open SBDB::Btree, 'newdb.db', :flags => SBDB::CREATE do |db|
52
53
  db.to_hash
53
54
  end
54
55
  end
55
56
 
56
- SBDB::DB#to_hash creates a cursor and close it later.
57
+ `SBDB::DB#to_hash` creates a cursor and close it later.
58
+
59
+ Tip:
60
+
61
+ Signal.trap 'EXIT', env.method( :close)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10.1
1
+ 0.0.11
@@ -1,4 +1,5 @@
1
1
  require 'bdb'
2
+ require 'ref'
2
3
  require 'sbdb/environment'
3
4
  require 'sbdb/db'
4
5
  require 'sbdb/cursor'
@@ -60,7 +60,11 @@ module SBDB
60
60
 
61
61
  def _txn txn
62
62
  txn ||= @txn
63
- txn && t.bdb_object
63
+ txn && txn.bdb_object
64
+ end
65
+
66
+ def transaction flg = nil, &exe
67
+ block_given? ? home.transaction( flg, &exe) : home.transaction( flg)
64
68
  end
65
69
 
66
70
  # Arguments:
@@ -61,7 +61,7 @@ module SBDB
61
61
  def initialize *args
62
62
  opts = ::Hash === args.last ? args.pop : {}
63
63
  opts = {:dir => args[0], :flags => args[1], :mode => args[2]}.update opts
64
- @dbs, @env = WeakHash.new, Bdb::Env.new( 0)
64
+ @dbs, @env = Ref::WeakValueMap.new, Bdb::Env.new( 0)
65
65
  @env.log_config opts[:log_config], 1 if opts[:log_config]
66
66
  @env.lg_bsize = opts[:lg_bsize] if opts[:lg_bsize]
67
67
  @env.lg_max = opts[:lg_max] if opts[:lg_max]
metadata CHANGED
@@ -5,9 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 10
9
- - 1
10
- version: 0.0.10.1
8
+ - 11
9
+ version: 0.0.11
11
10
  platform: ruby
12
11
  authors:
13
12
  - Denis Knauf
@@ -31,6 +30,19 @@ dependencies:
31
30
  version: "0"
32
31
  type: :runtime
33
32
  version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: ref
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
34
46
  description: Simple Ruby Berkeley DB wrapper library for bdb.
35
47
  email: Denis.Knauf@gmail.com
36
48
  executables: []
@@ -49,7 +61,6 @@ files:
49
61
  - lib/sbdb/db.rb
50
62
  - lib/sbdb/environment.rb
51
63
  - lib/sbdb/transaction.rb
52
- - lib/sbdb/weakhash.rb
53
64
  - LICENSE
54
65
  has_rdoc: true
55
66
  homepage: http://github.com/ruby-bdb/sbdb
@@ -1,61 +0,0 @@
1
- module SBDB
2
-
3
- # See http://eigenclass.org/hiki/deferred-finalizers-in-Ruby
4
- # Not threadsafe.
5
-
6
- class WeakHash
7
- attr_reader :cache
8
- def initialize cache = ::Hash.new
9
- @cache = cache
10
- @key_map = {}
11
- @rev_cache = ::Hash.new{|h,k| h[k] = {}}
12
- @reclaim_value = lambda do |value_id|
13
- if @rev_cache.has_key? value_id
14
- @rev_cache[value_id].each_key{|key| @cache.delete key}
15
- @rev_cache.delete value_id
16
- end
17
- end
18
- @reclaim_key = lambda do |key_id|
19
- @cache.delete @key_map.delete(key_id) if @key_map.has_key? key_id
20
- end
21
- end
22
-
23
- def []= key, value
24
- case key
25
- when Fixnum, Symbol, true, false
26
- key2 = key
27
- else
28
- key2 = key.dup
29
- end
30
- @rev_cache[value.object_id][key2] = true
31
- @cache[key2] = value.object_id
32
- @key_map[key.object_id] = key2
33
-
34
- ObjectSpace.define_finalizer(value, @reclaim_value)
35
- ObjectSpace.define_finalizer(key, @reclaim_key)
36
- value
37
- end
38
-
39
- def [] key
40
- value_id = @cache[key]
41
- return ObjectSpace._id2ref( value_id) unless value_id.nil?
42
- nil
43
- rescue RangeError
44
- nil
45
- end
46
-
47
- def each &e
48
- @cache.each do |k, vid|
49
- unless vid.nil?
50
- obj = begin
51
- ObjectSpace._id2ref vid
52
- rescue RangeError
53
- next
54
- end
55
- yield k, obj
56
- end
57
- end
58
- end
59
- end
60
-
61
- end