Skip to content

Commit eb972e5

Browse files
committed
Minor improvements to the DB service component
1 parent 0b5bb41 commit eb972e5

1 file changed

Lines changed: 16 additions & 11 deletions

File tree

lib/active_storage/service/db_service.rb

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,14 @@ def download(key, &block)
3636
end
3737
else
3838
instrument :download, key: key do
39-
record = ::ActiveStorageDB::File.find_by(ref: key)
40-
raise(ActiveStorage::FileNotFoundError) unless record
41-
42-
record.data
39+
retrieve_file(key)
4340
end
4441
end
4542
end
4643

4744
def download_chunk(key, range)
4845
instrument :download_chunk, key: key, range: range do
49-
chunk_select = "SUBSTRING(data FROM #{range.begin + 1} FOR #{range.size}) AS chunk"
50-
record = ::ActiveStorageDB::File.select(chunk_select).find_by(ref: key)
46+
record = object_for(key, fields: "SUBSTRING(data FROM #{range.begin + 1} FOR #{range.size}) AS chunk")
5147
raise(ActiveStorage::FileNotFoundError) unless record
5248

5349
record.chunk
@@ -127,17 +123,26 @@ def generate_url(key, expires_in:, filename:, content_type:, disposition:)
127123
end
128124

129125
def ensure_integrity_of(key, checksum)
130-
file = ::ActiveStorageDB::File.find_by(ref: key)
131-
return if Digest::MD5.base64digest(file.data) == checksum
126+
return if Digest::MD5.base64digest(object_for(key).data) == checksum
132127

133128
delete(key)
134129
raise ActiveStorage::IntegrityError
135130
end
136131

132+
def retrieve_file(key)
133+
file = object_for(key)
134+
raise(ActiveStorage::FileNotFoundError) unless file
135+
136+
file.data
137+
end
138+
139+
def object_for(key, fields: nil)
140+
as_file = fields ? ::ActiveStorageDB::File.select(*fields) : ::ActiveStorageDB::File
141+
as_file.find_by(ref: key)
142+
end
143+
137144
def stream(key)
138-
size =
139-
::ActiveStorageDB::File.select('OCTET_LENGTH(data) AS size').find_by(ref: key)&.size ||
140-
raise(ActiveStorage::FileNotFoundError)
145+
size = object_for(key, fields: 'OCTET_LENGTH(data) AS size')&.size || raise(ActiveStorage::FileNotFoundError)
141146
(size / @chunk_size.to_f).ceil.times.each do |i|
142147
range = (i * @chunk_size..((i + 1) * @chunk_size) - 1)
143148
yield download_chunk(key, range)

0 commit comments

Comments
 (0)