Module: SqlToCsvStream::RailsSupport

Defined in:
lib/sql_to_csv_stream/rails_support.rb

Class Method Summary collapse

Class Method Details

.register_csv_rendererObject

‘stream` can be anything that responds to `.each`. We make use of this by providing our own stream that fetches data from Postgresql stream = (1..10).lazy.map do |i|

sleep(1);
"#{i}\n";

end stream = Enumerator.new do |strean|

csv_service.call do |csv_line|
  strean << csv_line
end

end



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/sql_to_csv_stream/rails_support.rb', line 21

def self.register_csv_renderer
  ActionController::Renderers.add :csv_stream do |sql, copy_options: {}, **options|
    sanitize = options.delete(:sanitize) || true
    force_quotes = options.delete(:force_quotes) || false
    filename = options.delete(:filename) || 'data.csv'
    stream = CsvEnumerator.new(sql, copy_options: copy_options, sanitize: sanitize, force_quotes: force_quotes)
    stream = GzipWrapper.new(stream) if RailsSupport.use_gzip?(request)
    RailsSupport.set_streaming_headers(headers, request, response, filename)
    stream
  end
end

.register_json_rendererObject



33
34
35
36
37
38
39
40
# File 'lib/sql_to_csv_stream/rails_support.rb', line 33

def self.register_json_renderer
  ActionController::Renderers.add :json_stream do |sql, filename: 'data.csv'|
    stream = JsonEnumerator.new(sql)
    stream = GzipWrapper.new(stream) if RailsSupport.use_gzip?(request)
    RailsSupport.set_streaming_headers(headers, request, response, filename)
    stream
  end
end

.register_rendererObject



5
6
7
8
# File 'lib/sql_to_csv_stream/rails_support.rb', line 5

def self.register_renderer
  register_csv_renderer
  register_json_renderer
end

.set_streaming_headers(headers, request, response, filename) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/sql_to_csv_stream/rails_support.rb', line 42

def self.set_streaming_headers(headers, request, response, filename)
  headers['X-Accel-Buffering'] = 'no'
  headers['Cache-Control'] = 'no-cache'
  headers['Content-Encoding'] = 'gzip' if use_gzip?(request)
  headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
  headers.delete('Content-Length')
  response.status = 200
end

.use_gzip?(request) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
54
55
# File 'lib/sql_to_csv_stream/rails_support.rb', line 51

def self.use_gzip?(request)
  request.headers['HTTP_ACCEPT_ENCODING']
         .to_s
         .include?('gzip')
end