Sha256: 5a63cfb3778dda5e20e6659c6d12e63554f8977ea5031cc639840873dc67a8a6

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

module Lux
  class Cache
    class SqliteServer
      def initialize path = nil
        file = Pathname.new path || './tmp/lux_cache.sqlite'
        # file.delete if file.exist?
        @db = Sequel.sqlite file.to_s

        unless @db.tables.include?(:cache)
          @db.create_table :cache do
            primary_key :id
            datetime :valid_to
            string   :key
            blob     :value
          end

          @db.add_index :cache, :key
        end

        @cache = @db[:cache]
      end

      def set key, data, ttl = nil
        self.delete key
        ttl ||= 60 * 60 * 24
        value = Base64.encode64 Marshal.dump(data)
        @cache.insert(key: key, value: value, valid_to: Time.now + ttl.seconds)
        data
      end

      def get key
        row = @cache.where(key: key).to_a.first

        if row
          if row[:valid_to] >= Time.now
            Marshal.load Base64.decode64 row[:value]
          else
            self.delete key
          end
        end
      end

      def fetch key, ttl = nil
        self.get(key) || self.set(key, yield, ttl)
      end

      def delete key
        @cache.where(key: key).delete
        nil
      end

      def get_multi *args
        data = @cache.where(key: args).all
        data.inject({}) {|t, el| t[el[:key]] = Marshal.load Base64.decode64(el[:value]); t}
      end

      def clear
        @cache.truncate
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lux-fw-0.6.2 ./lib/lux/cache/lib/sqlite_server.rb