@@ -45,7 +45,10 @@ def download(key, &block)
4545
4646 def download_chunk ( key , range )
4747 instrument :download_chunk , key : key , range : range do
48- record = object_for ( key , fields : "SUBSTRING(data FROM #{ range . begin + 1 } FOR #{ range . size } ) AS chunk" )
48+ from = range . begin + 1
49+ size = range . size
50+ args = adapter_sqlserver? ? "data, #{ from } , #{ size } " : "data FROM #{ from } FOR #{ size } "
51+ record = object_for ( key , fields : "SUBSTRING(#{ args } ) AS chunk" )
4952 raise ( ActiveStorage ::FileNotFoundError ) unless record
5053
5154 record . chunk
@@ -99,6 +102,10 @@ def headers_for_direct_upload(_key, content_type:, **)
99102
100103 private
101104
105+ def adapter_sqlserver?
106+ @adapter_sqlserver ||= ActiveStorageDB ::File . connection . adapter_name == 'SQLServer'
107+ end
108+
102109 def generate_url ( key , expires_in :, filename :, content_type :, disposition :)
103110 content_disposition = content_disposition_with ( type : disposition , filename : filename )
104111 verified_key_with_expiration = ActiveStorage . verifier . generate (
@@ -144,7 +151,8 @@ def object_for(key, fields: nil)
144151 end
145152
146153 def stream ( key )
147- size = object_for ( key , fields : 'OCTET_LENGTH(data) AS size' ) &.size || raise ( ActiveStorage ::FileNotFoundError )
154+ data_size = adapter_sqlserver? ? 'DATALENGTH(data)' : 'OCTET_LENGTH(data)'
155+ size = object_for ( key , fields : "#{ data_size } AS size" ) &.size || raise ( ActiveStorage ::FileNotFoundError )
148156 ( size / @chunk_size . to_f ) . ceil . times . each do |i |
149157 range = ( i * @chunk_size ..( ( i + 1 ) * @chunk_size ) - 1 )
150158 yield download_chunk ( key , range )
0 commit comments