diff --git a/lib/bob_ross/cache.rb b/lib/bob_ross/cache.rb index ea10d8c..996aedf 100644 --- a/lib/bob_ross/cache.rb +++ b/lib/bob_ross/cache.rb @@ -8,6 +8,7 @@ class Cache def initialize(path, cachefile, size: nil) @path = path + @cachefile = cachefile if size.is_a?(String) && size.end_with?('%') size.delete_suffix!('%') @@ -23,21 +24,26 @@ def initialize(path, cachefile, size: nil) size = (dev_size * (size.to_i / 100.0)).round end @max_size = size || 1_073_741_824 + end + + def db + return @db if instance_variable_defined?(:@db) - @db = SQLite3::Database.new(cachefile) - @db.busy_timeout = 300 - migrate + sqlite_db = SQLite3::Database.new(@cachefile) + sqlite_db.busy_timeout = 300 + migrate(sqlite_db) + @db = sqlite_db end - def migrate - tables = @db.execute(<<-SQL).flatten + def migrate(sqlite) + tables = sqlite.execute(<<-SQL).flatten SELECT name FROM sqlite_master WHERE type='table' ORDER BY name; SQL if !tables.include?('transformations') - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE TABLE transformations ( hash VARCHAR, transparent BOOLEAN, @@ -50,33 +56,33 @@ def migrate ); SQL - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE UNIQUE INDEX thttm ON transformations (hash, transform, transformed_mime); SQL - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE INDEX tta ON transformations (transformed_at); SQL - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE TABLE stats ( key VARCHAR, value INTEGER ); SQL - @db.execute <<-SQL + sqlite.execute <<-SQL INSERT INTO stats (key, value) VALUES ('size', 0); SQL - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE TRIGGER stats_trigger_a AFTER INSERT ON transformations FOR EACH ROW BEGIN UPDATE stats SET value = (value + new.size) WHERE stats.key = 'size'; END SQL - @db.execute <<-SQL + sqlite.execute <<-SQL CREATE TRIGGER stats_trigger_b AFTER DELETE ON transformations FOR EACH ROW BEGIN UPDATE stats SET value = (value - old.size) WHERE stats.key = 'size'; @@ -86,7 +92,7 @@ def migrate end def get(hash, transform) - @db.execute(<<-SQL, [hash, transform]).to_a + db.execute(<<-SQL, [hash, transform]).to_a SELECT hash, transparent, transform, size, transformed_mime, transformed_at FROM transformations WHERE hash = ? AND transform = ? SQL @@ -95,7 +101,7 @@ def get(hash, transform) def use(hash, transform, mime) file = File.open(destination(hash, transform, mime)) - @db.execute(<<-SQL, [Time.now.to_i, hash, transform, mime]) + db.execute(<<-SQL, [Time.now.to_i, hash, transform, mime]) UPDATE transformations SET last_used_at = ? WHERE hash = ? AND transform = ? AND transformed_mime = ?; @@ -117,7 +123,7 @@ def set(hash, transparent, transform, mime, path) FileUtils.mkdir_p(File.dirname(dest)) FileUtils.cp(path, dest) - @db.execute(<<-SQL, [hash, transparent ? 1 : 0, transform, stat.size, mime, Time.now.to_i, Time.now.to_i]) + db.execute(<<-SQL, [hash, transparent ? 1 : 0, transform, stat.size, mime, Time.now.to_i, Time.now.to_i]) INSERT INTO transformations (hash, transparent, transform, size, transformed_mime, transformed_at, last_used_at) VALUES (?, ?, ?, ?, ?, ?, ?) SQL @@ -134,13 +140,13 @@ def set(hash, transparent, transform, mime, path) end def del(hash) - entries = @db.execute(<<-SQL, [hash]).to_a + entries = db.execute(<<-SQL, [hash]).to_a SELECT hash, transform, transformed_mime FROM transformations WHERE hash = ? SQL entries.each do |entry| - @db.execute(<<-SQL, [entry[0], entry[1], entry[2]]) + db.execute(<<-SQL, [entry[0], entry[1], entry[2]]) DELETE FROM transformations WHERE hash = ? AND transform = ? AND transformed_mime = ? SQL @@ -149,7 +155,7 @@ def del(hash) end def size - @db.execute("SELECT value FROM stats WHERE stats.key = 'size'").first&.first || 0 + db.execute("SELECT value FROM stats WHERE stats.key = 'size'").first&.first || 0 end def purge!(buffer = 0) @@ -161,11 +167,11 @@ def purge!(buffer = 0) purged = 0 need_to_purge = new_size - @max_size while purged < need_to_purge - r = @db.execute("SELECT hash, transform, transformed_mime, size FROM transformations ORDER BY last_used_at ASC LIMIT 1").first + r = db.execute("SELECT hash, transform, transformed_mime, size FROM transformations ORDER BY last_used_at ASC LIMIT 1").first if r.nil? return else - @db.execute(<<-SQL, [r[0], r[1], r[2]]) + db.execute(<<-SQL, [r[0], r[1], r[2]]) DELETE FROM transformations WHERE hash = ? AND transform = ? AND transformed_mime = ? SQL