class Shrine::Storage::Sql

Attributes

database[R]
table[R]

Public Class Methods

new(database:, table:) click to toggle source
# File lib/shrine/storage/sql.rb, line 12
def initialize(database:, table:)
  @database = database
  @table    = table
end

Public Instance Methods

clear!() { |dataset| ... } click to toggle source
# File lib/shrine/storage/sql.rb, line 39
def clear!
  dataset = self.dataset
  dataset = yield dataset if block_given?
  dataset.delete
end
dataset() click to toggle source
# File lib/shrine/storage/sql.rb, line 45
def dataset
  database[table]
end
delete(id) click to toggle source
# File lib/shrine/storage/sql.rb, line 32
def delete(id)
  find(id).delete
end
exists?(id) click to toggle source
# File lib/shrine/storage/sql.rb, line 28
def exists?(id)
  !find(id).empty?
end
open(id, **) click to toggle source
# File lib/shrine/storage/sql.rb, line 22
def open(id, **)
  StringIO.new(content(id))
rescue Sequel::NoMatchingRow
  fail Shrine::FileNotFound, "file #{id.inspect} not found on storage"
end
upload(io, id, **options) click to toggle source
# File lib/shrine/storage/sql.rb, line 17
def upload(io, id, **options)
  generated_id = store(io, id, **options)
  id.replace(generated_id.to_s + File.extname(id))
end
url(id, **options) click to toggle source
# File lib/shrine/storage/sql.rb, line 36
def url(id, **options)
end

Protected Instance Methods

find(id_or_ids) click to toggle source
# File lib/shrine/storage/sql.rb, line 51
def find(id_or_ids)
  ids = Array(id_or_ids).map { |s| File.basename(s, ".*") }
  dataset.where(id: ids)
end

Private Instance Methods

content(id) click to toggle source
# File lib/shrine/storage/sql.rb, line 86
def content(id)
  find(id).first![:content].to_s
end
copy(io, id, shrine_metadata: {}, **options) click to toggle source
# File lib/shrine/storage/sql.rb, line 75
def copy(io, id, shrine_metadata: {}, **options)
  record_dataset = io.storage.find(io.id).select(:content, :metadata)
  record_dataset = record_dataset.select_append(Sequel::CURRENT_TIMESTAMP.as(:created_at)) if database.schema(table).assoc(:created_at)

  dataset.insert(record_dataset.columns, record_dataset)
end
copyable?(io, id) click to toggle source
# File lib/shrine/storage/sql.rb, line 82
def copyable?(io, id)
  io.is_a?(UploadedFile) && io.storage.is_a?(Storage::Sql)
end
insert(io, id, shrine_metadata: {}, **options) click to toggle source
# File lib/shrine/storage/sql.rb, line 66
def insert(io, id, shrine_metadata: {}, **options)
  record = {}
  record[:content]    = Sequel::SQL::Blob.new(io.read)
  record[:metadata]   = shrine_metadata.to_json
  record[:created_at] = Sequel::CURRENT_TIMESTAMP if database.schema(table).assoc(:created_at)

  dataset.insert(record)
end
metadata(id) click to toggle source
# File lib/shrine/storage/sql.rb, line 90
def metadata(id)
  find(id).first![:metadata]
end
store(io, id, **options) click to toggle source
# File lib/shrine/storage/sql.rb, line 58
def store(io, id, **options)
  if copyable?(io, id)
    copy(io, id, **options)
  else
    insert(io, id, **options)
  end
end