fic_tracker/lib/fic_tracker/util/cache/database.rb

60 lines
1.3 KiB
Ruby

# frozen_string_literal: true
module FicTracker::Util::CacheImpl
# A cache using live redis data
class Database < Base
attr_reader :dataset, :dataset_expired, :dataset_live
def initialize(table: 'cache', **redis)
@dataset = FicTracker.database[table.to_s.to_sym]
@dataset_live = @dataset.where{ Sequel.|({ expire_at: nil }, Sequel::CURRENT_DATE < expire_at) }
@dataset_expired = @dataset_live.invert
end
def expire
dataset_expired.delete
end
def has?(key)
!dataset_live.filter(key: key).empty?
end
def get(key)
blob = dataset_live.filter(key: key).first&.[](:value)
return unless blob
blob.to_s
end
def set(key, value, expire = nil)
expire = expire >= 0 ? Time.now + expire : nil if expire.is_a?(Numeric)
expire = nil if expire.is_a?(Numeric)
blob = Sequel.blob(value)
dataset
.insert_conflict(target: :key, update: { value: blob, expire_at: expire })
.insert(key: key, value: blob, expire_at: expire)
value
end
def delete(key)
dataset.where(key: key).delete
nil
end
def clear
dataset.delete
end
private
def namespace_key(key)
"#{namespace}-#{key}"
end
def unnamespace_key(key)
key.delete_prefix("#{@namespace}-")
end
end
end