module SqlToCsvStream::RailsSupport
Public Class Methods
register_csv_renderer()
click to toggle source
`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
# 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_renderer()
click to toggle source
# 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_renderer()
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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