Skip to content

Commit cfb5b68

Browse files
author
Mattia Roccoberton
committed
feat: replace failing functions for MSSQL
1 parent 2c46dd8 commit cfb5b68

2 files changed

Lines changed: 10 additions & 5 deletions

File tree

lib/active_storage/service/db_service.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

spec/dummy70/db/schema.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111
# It's strongly recommended that you check this file into your version control system.
1212

1313
ActiveRecord::Schema[7.0].define(version: 2022_02_02_010101) do
14-
# These are extensions that must be enabled in order to support this database
15-
enable_extension "plpgsql"
16-
1714
create_table "active_storage_attachments", force: :cascade do |t|
1815
t.string "name", null: false
1916
t.string "record_type", null: false

0 commit comments

Comments
 (0)