Source

ruby-pg / sample / issue-119.rb

Full commit
#!/usr/bin/env ruby

require 'pg'

# This is another example of how to use COPY FROM, this time as a
# minimal test case used to try to figure out what was going on in
# an issue submitted from a user:
#
#  https://bitbucket.org/ged/ruby-pg/issue/119
#

conn		   = PG.connect( dbname: 'test' )
table_name	   = 'issue_119'
field_list	   = %w[name body_weight brain_weight]
method		   = 0
options		   = { truncate: true }
sql_parameters = ''

conn.set_error_verbosity( PG::PQERRORS_VERBOSE )
conn.exec( "DROP TABLE IF EXISTS #{table_name}" )
conn.exec( "CREATE TABLE #{table_name} ( id SERIAL, name TEXT, body_weight REAL, brain_weight REAL )" )

text = <<-END_DATA
Mountain beaver	1.35	465
Cow	465	423
Grey wolf	36.33	119.5
Goat	27.66	115
Guinea pig	1.04	5.5
Dipliodocus	11700	50
Asian elephant	2547	4603
Donkey	187.1	419
Horse	521	655
Potar monkey	10	115
Cat	3.3	25.6
Giraffe	529	680
Gorilla	207	406
Human	62	1320
African elephant	6654	5712
Triceratops	9400	70
Rhesus monkey	6.8	179
Kangaroo	35	56
Golden hamster	0.12	1
Mouse	0.023	0.4
Rabbit	2.5	12.1
Sheep	55.5	175
Jaguar	100	157
Chimpanzee	52.16	440
Brachiosaurus	87000	154.5
Mole	0.122	3
Pig	192	18
END_DATA

#ActiveRecord::Base.connection_pool.with_connection do |conn|
	conn.transaction do
		rc = conn #.raw_connection
		rc.exec "TRUNCATE TABLE #{table_name};" if options[:truncate]
		sql = "COPY #{table_name} (#{field_list.join(',')}) FROM STDIN #{sql_parameters} "
		p sql
		rc.exec(sql)
		errmsg = nil # scope this outside of the rescue below so it's visible later
		begin
			if method == 1
				rc.put_copy_data text + "\\.\n"
			else
				text.each_line { |line| rc.put_copy_data(line) }
			end
		rescue Errno => err
			errmsg = "%s while reading copy data: %s" % [err.class.name, err.message]
			puts "an error occured"
		end

		if errmsg
			rc.put_copy_end(errmsg)
			puts "ERROR #{errmsg}"
		else
			rc.put_copy_end
		end

		while res = rc.get_result
			st = res.res_status( res.result_status )
			puts "Result of COPY is: %s" % [ st ]
			if res.result_status != PG::PGRES_COPY_IN
				puts res.error_message
			end
		end
		puts "end"
	end #transaction
#end #connection

conn.exec( "SELECT name, brain_weight FROM #{table_name}" ) do |res|
	p res.values
end