58 lines
1.1 KiB
Ruby
58 lines
1.1 KiB
Ruby
begin
|
|
require 'tokyocabinet'
|
|
rescue LoadError
|
|
puts "You need the tokyocabinet gem to use Anemone::Storage::TokyoCabinet"
|
|
exit
|
|
end
|
|
|
|
require 'forwardable'
|
|
|
|
module Anemone
|
|
module Storage
|
|
class TokyoCabinet
|
|
extend Forwardable
|
|
|
|
def_delegators :@db, :close, :size, :keys, :has_key?
|
|
|
|
def initialize(file)
|
|
raise "TokyoCabinet filename must have .tch extension" if File.extname(file) != '.tch'
|
|
@db = ::TokyoCabinet::HDB::new
|
|
@db.open(file, ::TokyoCabinet::HDB::OWRITER | ::TokyoCabinet::HDB::OCREAT)
|
|
@db.clear
|
|
end
|
|
|
|
def [](key)
|
|
if value = @db[key]
|
|
load_value(value)
|
|
end
|
|
end
|
|
|
|
def []=(key, value)
|
|
@db[key] = [Marshal.dump(value)].pack("m")
|
|
end
|
|
|
|
def delete(key)
|
|
value = self[key]
|
|
@db.delete(key)
|
|
value
|
|
end
|
|
|
|
def each
|
|
@db.each { |k, v| yield k, load_value(v) }
|
|
end
|
|
|
|
def merge!(hash)
|
|
hash.each { |key, value| self[key] = value }
|
|
self
|
|
end
|
|
|
|
private
|
|
|
|
def load_value(value)
|
|
Marshal.load(value.unpack("m")[0])
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|