Sha256: ac91ab18793df1cfcb207849cbbe94bb8e459ba819d912f59725078d2157e8d0

Contents?: true

Size: 1.44 KB

Versions: 3

Compression:

Stored size: 1.44 KB

Contents

require 'catche/tag/object'
require 'catche/tag/resource'

module Catche
  module Tag

    KEY     = 'catche'
    DIVIDER = '_'

    extend self

    def join(*tags)
      tags.flatten.compact.uniq.join(DIVIDER)
    end

    def tag!(key, *tags)
      tags.each do |tag|
        keys      = fetch_tag(tag)
        key_tags  = fetch_key(key)
        tag_key   = stored_key(:tags, tag)
        key_key   = stored_key(:keys, key)

        Catche.adapter.write(tag_key, keys << key)
        Catche.adapter.write(key_key, key_tags << tag_key)
      end
    end

    def expire!(*tags)
      expired_keys = []

      tags.each do |tag|
        keys = fetch_tag(tag)
        expired_keys += keys

        keys.each do |key|
          # Expires the cached value
          Catche.adapter.delete key

          # Removes the tag from the tag list in case it's never used again
          Catche.adapter.write(
              stored_key(:keys, key),
              fetch_key(key).delete(stored_key(:tags, tag))
            )
        end

        Catche.adapter.delete stored_key(:tags, tag)
      end

      expired_keys
    end

    protected

      def fetch_tag(tag)
        Catche.adapter.read stored_key(:tags, tag), []
      end

      def fetch_key(key)
        Catche.adapter.read stored_key(:keys, key), []
      end

      def stored_key(scope, value)
        join_keys KEY, scope.to_s, value.to_s
      end

      def join_keys(*keys)
        keys.join('.')
      end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
catche-0.1.2 lib/catche/tag.rb
catche-0.1.1 lib/catche/tag.rb
catche-0.1.0 lib/catche/tag.rb