Sha256: 9e58a0cae0f4c9f7c302c262cba1b0e5446645bbc62d85c3302627df62fe4cca

Contents?: true

Size: 1.87 KB

Versions: 3

Compression:

Stored size: 1.87 KB

Contents

# encoding: UTF-8
module Bin
  class Store < Compatibility
    attr_reader :collection, :options

    def initialize(collection, options={})
      @collection, @options = collection, options
    end

    def expires_in
      @expires_in ||= options[:expires_in] || 1.year
    end

    def write(key, value, options={})
      key = key.to_s
      super do
        expires = Time.now.utc + ((options && options[:expires_in]) || expires_in)
        raw     = !!options[:raw]
        value   = raw ? value : BSON::Binary.new(Marshal.dump(value))
        doc     = {:_id => key, :value => value, :expires_at => expires, :raw => raw}
        collection.save(doc)
      end
    end

    def read(key, options=nil)
      super do
        if doc = collection.find_one(:_id => key.to_s, :expires_at => {'$gt' => Time.now.utc})
          doc['raw'] ? doc['value'] : Marshal.load(doc['value'].to_s)
        end
      end
    end

    def delete(key, options=nil)
      super do
        collection.remove(:_id => key.to_s)
      end
    end

    def delete_matched(matcher, options=nil)
      super do
        collection.remove(:_id => matcher)
      end
    end

    def exist?(key, options=nil)
      super do
        !read(key, options).nil?
      end
    end

    def increment(key, amount=1)
      super do
        counter_key_upsert(key, amount)
      end
    end

    def decrement(key, amount=1)
      super do
        counter_key_upsert(key, -amount.abs)
      end
    end

    def clear
      collection.remove
    end

    def stats
      collection.stats
    end

    private
      def counter_key_upsert(key, amount)
        key = key.to_s
        collection.update(
          {:_id => key}, {
            '$inc' => {:value => amount},
            '$set' => {
              :expires_at => Time.now.utc + 1.year,
              :raw        => true
            },
          }, :upsert => true)
      end
  end
end

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
honkster-bin-0.6.3.1 lib/bin/store.rb
honkster-bin-0.6.3 lib/bin/store.rb
bin-0.6.3 lib/bin/store.rb