ninjudd-bdb 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/bdb.gemspec +1 -1
- data/lib/bdb/simple.rb +67 -38
- metadata +1 -1
data/bdb.gemspec
CHANGED
@@ -2,7 +2,7 @@ BDB_SPEC = Gem::Specification.new do |s|
|
|
2
2
|
s.platform = Gem::Platform::RUBY
|
3
3
|
s.required_ruby_version = '>=1.8.4'
|
4
4
|
s.name = "bdb"
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.7"
|
6
6
|
s.authors = ["Matt Bauer", "Dan Janowski"]
|
7
7
|
s.email = "bauer@pedalbrain.com"
|
8
8
|
s.summary = "A Ruby interface to BerkeleyDB"
|
data/lib/bdb/simple.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'bdb'
|
1
|
+
require 'bdb' if not defined?(Bdb)
|
2
2
|
|
3
3
|
class Bdb::Simple
|
4
4
|
include Enumerable
|
@@ -19,7 +19,7 @@ class Bdb::Simple
|
|
19
19
|
@db = Bdb::Db.new
|
20
20
|
@db.flags = Bdb::DB_DUPSORT if dup?
|
21
21
|
@db.btree_compare = lambda do |db, key1, key2|
|
22
|
-
compare_absolute(Marshal.load(key1), Marshal.load(key2))
|
22
|
+
self.class.compare_absolute(Marshal.load(key1), Marshal.load(key2))
|
23
23
|
end
|
24
24
|
@db.open(nil, file, nil, Bdb::Db::BTREE, Bdb::DB_CREATE, 0)
|
25
25
|
end
|
@@ -30,33 +30,16 @@ class Bdb::Simple
|
|
30
30
|
db[Marshal.dump(key)] = Marshal.dump(value)
|
31
31
|
end
|
32
32
|
|
33
|
+
def delete(key)
|
34
|
+
db.del(nil, Marshal.dump(key), 0)
|
35
|
+
end
|
36
|
+
|
33
37
|
def [](key)
|
34
|
-
if key.kind_of?(Range)
|
35
|
-
|
36
|
-
cursor = db.cursor(nil, 0)
|
37
|
-
k,v = cursor.get(Marshal.dump(key.first), nil, Bdb::DB_SET_RANGE)
|
38
|
-
while k and key.include?(Marshal.load(k))
|
39
|
-
values << Marshal.load(v)
|
40
|
-
k, v = cursor.get(nil, nil, Bdb::DB_NEXT)
|
41
|
-
end
|
42
|
-
cursor.close
|
43
|
-
values
|
38
|
+
if key.kind_of?(Range) or dup?
|
39
|
+
Bdb::SimpleSet.new(db, key)
|
44
40
|
else
|
45
|
-
|
46
|
-
if
|
47
|
-
values = []
|
48
|
-
cursor = db.cursor(nil, 0)
|
49
|
-
k,v = cursor.get(key, nil, Bdb::DB_SET)
|
50
|
-
while data
|
51
|
-
values << Marshal.load(v)
|
52
|
-
k,v = cursor.get(nil, nil, Bdb::DB_NEXT_DUP)
|
53
|
-
end
|
54
|
-
cursor.close
|
55
|
-
values
|
56
|
-
else
|
57
|
-
v = db.get(nil, key, nil, 0)
|
58
|
-
Marshal.load(v) if v
|
59
|
-
end
|
41
|
+
v = db.get(nil, Marshal.dump(key), nil, 0)
|
42
|
+
Marshal.load(v) if v
|
60
43
|
end
|
61
44
|
end
|
62
45
|
|
@@ -86,20 +69,66 @@ class Bdb::Simple
|
|
86
69
|
end
|
87
70
|
|
88
71
|
def self.compare_absolute(left, right)
|
89
|
-
if left.
|
90
|
-
left.
|
91
|
-
|
92
|
-
|
72
|
+
if left.class == right.class
|
73
|
+
if left.is_a?(Array) and right.is_a?(Array)
|
74
|
+
# Arrays: compare one element at a time.
|
75
|
+
left.zip(right) do |l,r|
|
76
|
+
comp = compare_absolute(l, r)
|
77
|
+
return comp unless comp == 0
|
78
|
+
end
|
79
|
+
left.size == right.size ? 0 : -1
|
80
|
+
elsif left.is_a?(Hash) and right.is_a?(Hash)
|
81
|
+
# Hashes: sort the keys and compare as an array of arrays.
|
82
|
+
left = left.to_a.sort {|a,b| compare_absolute(a[0],b[0])}
|
83
|
+
right = right.to_a.sort {|a,b| compare_absolute(a[0],b[0])}
|
84
|
+
compare_absolute(left, right)
|
85
|
+
else
|
86
|
+
begin
|
87
|
+
# Try to use the spaceship operator.
|
88
|
+
left <=> right
|
89
|
+
rescue NoMethodError => e
|
90
|
+
left.hash <=> right.hash
|
91
|
+
end
|
93
92
|
end
|
94
|
-
left.size == right.size ? 0 : -1
|
95
|
-
elsif left.kind_of?(right.class) or right.kind_of?(left.class)
|
96
|
-
left <=> right rescue 0
|
97
|
-
elsif left.is_a?(NilClass)
|
98
|
-
-1
|
99
|
-
elsif right.is_a?(NilClass)
|
100
|
-
1
|
101
93
|
else
|
94
|
+
# Nil is the smallest. Hash is the largest. All other objects are sorted by class name.
|
95
|
+
return -1 if left.is_a?(NilClass)
|
96
|
+
return 1 if right.is_a?(NilClass)
|
97
|
+
return 1 if left.is_a?(Hash)
|
98
|
+
return -1 if right.is_a?(Hash)
|
99
|
+
|
100
|
+
# Compare class names and hashes as a last resort if that fails.
|
102
101
|
right.class.name <=> left.class.name
|
103
102
|
end
|
104
103
|
end
|
105
104
|
end
|
105
|
+
|
106
|
+
class Bdb::SimpleSet
|
107
|
+
include Enumerable
|
108
|
+
|
109
|
+
def initialize(db, key)
|
110
|
+
@db = db
|
111
|
+
@key = key
|
112
|
+
end
|
113
|
+
attr_reader :db, :key
|
114
|
+
|
115
|
+
def each
|
116
|
+
if key.kind_of?(Range)
|
117
|
+
cursor = db.cursor(nil, 0)
|
118
|
+
k,v = cursor.get(Marshal.dump(key.first), nil, Bdb::DB_SET_RANGE)
|
119
|
+
while k and key.include?(Marshal.load(k))
|
120
|
+
yield Marshal.load(v)
|
121
|
+
k, v = cursor.get(nil, nil, Bdb::DB_NEXT)
|
122
|
+
end
|
123
|
+
cursor.close
|
124
|
+
else
|
125
|
+
cursor = db.cursor(nil, 0)
|
126
|
+
k,v = cursor.get(Marshal.dump(key), nil, Bdb::DB_SET)
|
127
|
+
while k
|
128
|
+
yield Marshal.load(v)
|
129
|
+
k,v = cursor.get(nil, nil, Bdb::DB_NEXT_DUP)
|
130
|
+
end
|
131
|
+
cursor.close
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|