diff --git a/lib/moneta/sdbm.rb b/lib/moneta/sdbm.rb new file mode 100644 index 0000000..9b104a9 --- /dev/null +++ b/lib/moneta/sdbm.rb @@ -0,0 +1,40 @@ +require "sdbm" + +module Moneta + class BasicSDBM < ::SDBM + + def [](key) + if val = super + Marshal.load(val) + end + end + + def []=(key, value) + super(key, Marshal.dump(value)) + end + + def fetch(key, default) + self[key] || default + end + + def store(key, value, options = {}) + self[key] = value + end + + def delete(key) + if val = super + Marshal.load(val) + end + end + end + + class SDBM < BasicSDBM + include Expires + + def initialize(options = {}) + raise "No :file option specified" unless file = options[:file] + @expiration = BasicSDBM.new("#{file}_expires") + super(file) + end + end +end \ No newline at end of file diff --git a/spec/moneta_sdbm_spec.rb b/spec/moneta_sdbm_spec.rb new file mode 100644 index 0000000..8fc16aa --- /dev/null +++ b/spec/moneta_sdbm_spec.rb @@ -0,0 +1,17 @@ +require File.dirname(__FILE__) + '/spec_helper' +require "moneta/sdbm" + +describe "Moneta::SDBM" do + before(:each) do + @cache = Moneta::SDBM.new(:file => File.join(File.dirname(__FILE__), "sdbm_cache")) + @cache.clear + end + + after(:all) do + FileUtils.rm_rf(Dir.glob(File.join(File.dirname(__FILE__), "sdbm_cache*"))) + end + + if ENV['MONETA_TEST'].nil? || ENV['MONETA_TEST'] == 'sdbm' + it_should_behave_like "a read/write Moneta cache" + end +end \ No newline at end of file