60 lines
1.3 KiB
Ruby
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
|