Module: SqlToCsvStream::RailsSupport
- Defined in:
- lib/sql_to_csv_stream/rails_support.rb
Class Method Summary collapse
-
.register_csv_renderer ⇒ Object
‘stream` can be anything that responds to `.each`.
- .register_json_renderer ⇒ Object
- .register_renderer ⇒ Object
- .set_streaming_headers(headers, request, response, filename) ⇒ Object
- .use_gzip?(request) ⇒ Boolean
Class Method Details
.register_csv_renderer ⇒ Object
‘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: {}, **| sanitize = .delete(:sanitize) || true force_quotes = .delete(:force_quotes) || false filename = .delete(:filename) || 'data.csv' stream = CsvEnumerator.new(sql, 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 ⇒ Object
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_renderer ⇒ Object
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
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 |