Path: blob/master/lib/anemone/storage/tokyo_cabinet.rb
19567 views
begin1require 'tokyocabinet'2rescue LoadError3puts "You need the tokyocabinet gem to use Anemone::Storage::TokyoCabinet"4exit5end67require 'forwardable'89module Anemone10module Storage11class TokyoCabinet12extend Forwardable1314def_delegators :@db, :close, :size, :keys, :has_key?1516def initialize(file)17raise "TokyoCabinet filename must have .tch extension" if File.extname(file) != '.tch'18@db = ::TokyoCabinet::HDB::new19@db.open(file, ::TokyoCabinet::HDB::OWRITER | ::TokyoCabinet::HDB::OCREAT)20@db.clear21end2223def [](key)24if value = @db[key]25load_value(value)26end27end2829def []=(key, value)30@db[key] = [Marshal.dump(value)].pack("m")31end3233def delete(key)34value = self[key]35@db.delete(key)36value37end3839def each40@db.each { |k, v| yield k, load_value(v) }41end4243def merge!(hash)44hash.each { |key, value| self[key] = value }45self46end4748private4950def load_value(value)51Marshal.load(value.unpack("m")[0])52end5354end55end56end575859