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
|