module SmartS3Sync::DigestCache

Public Class Methods

digest(filename) click to toggle source
# File lib/smart_s3_sync/digest_cache.rb, line 7
def digest(filename)
  if (cr = cache_record(filename)) && File.mtime(filename).to_i <= cr[0]
    cr[1]
  else
    Digest::MD5.file(filename).hexdigest.tap do |digest|
      save_record(filename, File.mtime(filename).to_i, digest)
    end
  end
end
save_record(filename, mtime, digest) click to toggle source
# File lib/smart_s3_sync/digest_cache.rb, line 17
def save_record(filename, mtime, digest)
  database.execute("INSERT OR REPLACE INTO files (filename, mtime, digest) VALUES (?, ?, ?)", [filename, mtime, digest])
end

Private Class Methods

cache_record(filename) click to toggle source
# File lib/smart_s3_sync/digest_cache.rb, line 23
def cache_record(filename)
  crow = nil
  database.execute("SELECT mtime, digest FROM files WHERE filename = ? LIMIT 1", [filename]) do |row|
    crow = row
  end
  crow
end
database() click to toggle source
# File lib/smart_s3_sync/digest_cache.rb, line 31
def database
  @database ||= SQLite3::Database.new(database_filename).tap do |db|
    if db.execute("SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='files'")[0][0] < 1
      db.execute %{
        CREATE TABLE files (
          filename TEXT PRIMARY KEY,
          mtime DATETIME,
          digest VARCHAR(255)
        )
      }
    end
  end
end
database_filename() click to toggle source
# File lib/smart_s3_sync/digest_cache.rb, line 45
def database_filename
  File.expand_path('.filescache.db', '~')
end