add absolute comparison function
This commit is contained in:
parent
fb94827e79
commit
401b8e8085
|
@ -19,7 +19,7 @@ class Bdb::Simple
|
||||||
@db = Bdb::Db.new
|
@db = Bdb::Db.new
|
||||||
@db.flags = Bdb::DB_DUPSORT if dup?
|
@db.flags = Bdb::DB_DUPSORT if dup?
|
||||||
@db.btree_compare = lambda do |db, key1, key2|
|
@db.btree_compare = lambda do |db, key1, key2|
|
||||||
Marshal.load(key1) <=> Marshal.load(key2)
|
compare_absolute(Marshal.load(key1), Marshal.load(key2))
|
||||||
end
|
end
|
||||||
@db.open(nil, file, nil, Bdb::Db::BTREE, Bdb::DB_CREATE, 0)
|
@db.open(nil, file, nil, Bdb::Db::BTREE, Bdb::DB_CREATE, 0)
|
||||||
end
|
end
|
||||||
|
@ -84,4 +84,22 @@ class Bdb::Simple
|
||||||
db.close(0)
|
db.close(0)
|
||||||
@db = nil
|
@db = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.compare_absolute(left, right)
|
||||||
|
if left.is_a?(Array) and right.is_a?(Array)
|
||||||
|
left.zip(right) do |l,r|
|
||||||
|
comp = compare_absolute(l, r)
|
||||||
|
return comp unless comp == 0
|
||||||
|
end
|
||||||
|
left.size == right.size ? 0 : -1
|
||||||
|
elsif left.kind_of?(right.class) or right.kind_of?(left.class)
|
||||||
|
left <=> right rescue 0
|
||||||
|
elsif left.is_a?(NilClass)
|
||||||
|
-1
|
||||||
|
elsif right.is_a?(NilClass)
|
||||||
|
1
|
||||||
|
else
|
||||||
|
right.class.name <=> left.class.name
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue