@@ -27,9 +27,12 @@ def initialize(public: false, **)
2727
2828 def upload ( key , io , checksum : nil , **)
2929 instrument :upload , key : key , checksum : checksum do
30- file = ::ActiveStorageDB ::File . create! ( ref : key , data : io . read )
31- ensure_integrity_of ( key , checksum ) if checksum
32- file
30+ data = io . read
31+ if checksum
32+ digest = Digest ::MD5 . base64digest ( data )
33+ raise ActiveStorage ::IntegrityError unless digest == checksum
34+ end
35+ ::ActiveStorageDB ::File . create! ( ref : key , data : data )
3336 end
3437 end
3538
@@ -111,7 +114,7 @@ def headers_for_direct_upload(_key, content_type:, **)
111114 private
112115
113116 def service_name_for_token
114- respond_to? ( : name) ? name : "db"
117+ name . presence || "db"
115118 end
116119
117120 def adapter_sqlite?
@@ -159,16 +162,6 @@ def generate_url(key, expires_in:, filename:, content_type:, disposition:)
159162 )
160163 end
161164
162- def ensure_integrity_of ( key , checksum )
163- record = object_for ( key )
164- raise ActiveStorage ::FileNotFoundError unless record
165-
166- return if Digest ::MD5 . base64digest ( record . data ) == checksum
167-
168- delete ( key )
169- raise ActiveStorage ::IntegrityError
170- end
171-
172165 def retrieve_file ( key )
173166 file = object_for ( key )
174167 raise ActiveStorage ::FileNotFoundError unless file
@@ -184,14 +177,23 @@ def object_for(key, fields: nil)
184177 end
185178
186179 def stream ( key )
187- data_size = adapter_sqlserver? ? "DATALENGTH(data)" : "OCTET_LENGTH(data)"
188- size = object_for ( key , fields : "#{ data_size } AS size" ) &.size || raise ( ActiveStorage ::FileNotFoundError )
180+ size = object_for ( key , fields : data_size ) &.size || raise ( ActiveStorage ::FileNotFoundError )
189181 ( size / @chunk_size . to_f ) . ceil . times . each do |i |
190182 range = ( i * @chunk_size ) ..( ( ( i + 1 ) * @chunk_size ) - 1 )
191183 yield download_chunk ( key , range )
192184 end
193185 end
194186
187+ def data_size
188+ if adapter_sqlserver?
189+ "DATALENGTH(data) AS size"
190+ elsif adapter_sqlite?
191+ "LENGTH(data) AS size"
192+ else
193+ "OCTET_LENGTH(data) AS size"
194+ end
195+ end
196+
195197 def url_helpers
196198 @url_helpers ||= ::ActiveStorageDB ::Engine . routes . url_helpers
197199 end
0 commit comments