lib/pg_csv.rb in pg_csv-0.1.2 vs lib/pg_csv.rb in pg_csv-0.1.3
- old
+ new
@@ -1,31 +1,16 @@
require 'active_record'
class PgCsv
- # opts:
- # :sql => "select u.*, p.* from users u, projects p where p.user_id = u.id order by email limit 100"
- # :connection => AR.connection
- # :delimiter => ["\t", ",", ]
- # :header => boolean, use pg header for fields?
- # :logger => logger
- # :columns => manual array of column names, ignore :header option
-
- # :temp_file => boolean, generating throught temp file, final file appears by mv
- # :temp_dir => path, ex: /tmp
-
- # :type => :plain - return full string
- # => :gzip - save file to gzip
- # => :stream - save to stream
- # => :file - just save to file * default
-
def initialize(opts = {})
@options = opts.symbolize_keys
end
# do export :to - filename or stream
- def export(to, opts = {})
+ def export(to = nil, opts = {}, &block)
+ @block = block || Proc.new{|x|x}
@local_options = opts.symbolize_keys
raise ":connection should be" unless connection
raise ":sql should be" unless sql
@@ -35,11 +20,11 @@
end
protected
def with_temp_file(to, use_temp_file, tmp_dir)
- if use_temp_file
+ if use_temp_file && [:file, :gzip].include?(type)
check_str(to)
require 'fileutils'
require 'tempfile'
@@ -68,18 +53,23 @@
when :gzip
check_str(to)
Zlib::GzipWriter.open(to, &exporter)
when :stream
+ raise "'to' should be" unless to
exporter[to]
when :plain
require 'stringio'
sio = StringIO.new
exporter[sio]
result = sio.string
+ when :yield
+ # not real saving anywhere, just yield each record
+ raise "block should be" unless @block
+ result = load_data{|_|}
end
info "<=== finished write #{to} in #{Time.now - start}"
result
@@ -92,43 +82,42 @@
def exporter
method(:export_to_stream).to_proc
end
def export_to_stream(stream)
- write_csv(stream)
+ count = write_csv(stream)
stream.flush if stream.respond_to?(:flush)
+
+ info "<= done exporting (#{count}) records."
end
def write_csv(stream)
- count = 0
-
load_data do |row|
- count += 1
- stream.write prepare_row(row)
+ stream.write(row)
end
-
- info "<= done exporting (#{count}) records."
- count
end
-
+
def load_data
info "#{query}"
raw = connection.raw_connection
info "=> query"
q = raw.exec(query)
info "<= query"
info "=> write data"
- yield(columns_str) if columns_str
-
+ yield(@block[columns_str]) if columns_str
+
+ count = 0
while row = raw.get_copy_data()
- yield row
+ yield(@block[row])
+ count += 1
end
info "<= write data"
q.clear
+ count
end
def query
<<-SQL
COPY (
@@ -138,13 +127,9 @@
DELIMITER '#{delimiter}'
#{use_pg_header? ? 'HEADER' : ''}
SQL
end
- def prepare_row(row)
- row
- end
-
def info(message)
logger.info(message) if logger
end
# ==== options/defaults =============
\ No newline at end of file