sbdb/lib/sbdb/db.rb

142 lines
2.6 KiB
Ruby
Raw Normal View History

2010-02-02 00:52:25 +01:00
require 'bdb'
require 'sbdb/cursor'
module SBDB
2010-02-06 11:50:52 +01:00
TYPES = []
2010-02-02 00:52:25 +01:00
class DB
UNKNOWN = Bdb::Db::UNKNOWN
BTREE = Bdb::Db::BTREE
HASH = Bdb::Db::HASH
QUEUE = Bdb::Db::QUEUE
ARRAY = RECNO = Bdb::Db::RECNO
2010-02-02 18:12:11 +01:00
RDONLY = READLONY = Bdb::DB_RDONLY
CONSUME = Bdb::DB_CONSUME
CONSUME_WAIT = Bdb::DB_CONSUME_WAIT
2010-02-02 00:52:25 +01:00
attr_reader :home
include Enumerable
def bdb_object() @db end
def sync() @db.sync end
def close( f = nil) @db.close f || 0 end
def cursor( &e) Cursor.new self, &e end
def [] k
@db.get nil, k.nil? ? nil : k.to_s, nil, 0
rescue Bdb::DbError
return if $!.code == Bdb::DB_KEYEMPTY
raise $!
end
def []= k, v
if v.nil?
@db.del nil, k.to_s, 0
else
@db.put nil, k.nil? ? nil : k.to_s, v.to_s, 0
end
end
2010-02-02 00:52:25 +01:00
class << self
def new *p, &e
x = super *p
return x unless e
begin e.call x
ensure
x.sync
x.close
end
end
alias open new
end
def initialize file, name = nil, type = nil, flags = nil, mode = nil, txn = nil, env = nil
flags ||= 0
type ||= UNKNOWN
#type = BTREE if type == UNKNOWN and (flags & CREATE) == CREATE
2010-02-02 00:52:25 +01:00
@home, @db = env, env ? env.bdb_object.db : Bdb::Db.new
begin @db.open txn, file, name, type, flags, mode || 0
rescue Object
close
raise $!
end
end
def each k = nil, v = nil, &e
cursor{|c|c.each k, v, &e}
end
def reverse k = nil, v = nil, &e
cursor{|c|c.reverse k, v, &e}
end
def to_hash k = nil, v = nil
h = {}
each( k, v) {|k, v| h[ k] = v }
h
end
end
class Unknown < DB
def self.new file, name, *p, &e
2010-02-06 11:57:14 +01:00
dbt = super( file, name, UNKNOWN, *p) {|db| db.bdb_object.get_type }
TYPES[dbt] ? TYPES[dbt].new( file, name, *p, &e) : super( file, name, UNKNOWN, *p, &e)
2010-02-02 00:52:25 +01:00
end
end
class Btree < DB
def self.new file, name = nil, *p, &e
super file, name, BTREE, *p, &e
2010-02-02 00:52:25 +01:00
end
end
2010-02-06 11:50:52 +01:00
TYPES[DB::BTREE] = Btree
2010-02-02 00:52:25 +01:00
class Hash < DB
def self.new file, name = nil, *p, &e
super file, name, HASH, *p, &e
2010-02-02 00:52:25 +01:00
end
end
2010-02-06 11:50:52 +01:00
TYPES[DB::HASH] = Hash
2010-02-02 00:52:25 +01:00
class Recno < DB
def self.new file, name = nil, *p, &e
super file, name, RECNO, *p, &e
2010-02-02 00:52:25 +01:00
end
2010-02-02 15:15:10 +01:00
def [] k
super [k].pack('I')
end
def []= k, v
super [k].pack('I'), v
end
2010-02-22 16:17:25 +01:00
def push v
2010-02-22 16:36:36 +01:00
@db.put nil, nil, v, Bdb::DB_APPEND
2010-02-22 16:17:25 +01:00
end
2010-02-02 00:52:25 +01:00
end
Array = Recno
2010-02-06 11:50:52 +01:00
TYPES[DB::RECNO] = Recno
2010-02-02 00:52:25 +01:00
class Queue < DB
def self.new file, name = nil, *p, &e
super file, name, QUEUE, *p, &e
2010-02-02 00:52:25 +01:00
end
2010-02-02 15:15:10 +01:00
def [] k
super [k].pack('I')
end
def []= k, v
super [k].pack('I'), v
end
def unshift
2010-02-22 16:36:36 +01:00
@db.get nil, nil, nil, Bdb::DB_CONSUME
end
2010-02-22 16:17:25 +01:00
def push v
2010-02-22 16:36:36 +01:00
@db.put nil, nil, v, Bdb::DB_APPEND
2010-02-22 16:17:25 +01:00
end
2010-02-02 00:52:25 +01:00
end
2010-02-06 11:50:52 +01:00
TYPES[DB::QUEUE] = Queue
2010-02-02 00:52:25 +01:00
end