samnang
10/9/2013 - 5:29 PM

reports_controller.rb

class ReportsController < ApplicationController

  before_filter :authenticate_csm!

  def pending
    #send_csv_data(PendingCasesReport.new.csv, 'pending_cases.csv')

    setup_streaming_headers
    self.response_body = streamer
  end

  def index
  end

  private

    def setup_streaming_headers
      file_name = "report.csv"
      headers["Content-Type"] = "text/csv"
      headers["Content-disposition"] = "attachment; filename=\"#{file_name}\""
      headers["Cache-Control"] ||= "no-cache"
      headers["Transfer-Encoding"] = "chunked"
    end

    def streamer
      connection = CaseType.connection
      connection.execute "COPY (#{CaseType.scoped.to_sql}) TO STDOUT WITH CSV HEADER"
      stream_enum = Enumerator.new do |y|
        while line = connection.raw_connection.get_copy_data do
          y << line
          sleep(1)
        end
      end

      Rack::Chunked::Body.new(stream_enum)
    end

end