Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt to suppress fork warnings form SQlite3 #46

Merged
merged 1 commit into from
Oct 10, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 26 additions & 20 deletions lib/bob_ross/cache.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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!('%')
Expand All @@ -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,
Expand All @@ -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';
Expand All @@ -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
Expand All @@ -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 = ?;
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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
Expand Down
Loading