pg 0.17.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
 - checksums.yaml.gz.sig +0 -0
 - data/BSDL +2 -2
 - data/ChangeLog +0 -3506
 - data/History.rdoc +308 -0
 - data/Manifest.txt +35 -19
 - data/README-Windows.rdoc +17 -28
 - data/README.ja.rdoc +1 -2
 - data/README.rdoc +113 -14
 - data/Rakefile +67 -30
 - data/Rakefile.cross +109 -83
 - data/ext/errorcodes.def +101 -0
 - data/ext/errorcodes.rb +1 -1
 - data/ext/errorcodes.txt +33 -2
 - data/ext/extconf.rb +55 -58
 - data/ext/gvl_wrappers.c +4 -0
 - data/ext/gvl_wrappers.h +27 -39
 - data/ext/pg.c +262 -130
 - data/ext/pg.h +266 -54
 - data/ext/pg_binary_decoder.c +229 -0
 - data/ext/pg_binary_encoder.c +163 -0
 - data/ext/pg_coder.c +561 -0
 - data/ext/pg_connection.c +1689 -990
 - data/ext/pg_copy_coder.c +599 -0
 - data/ext/pg_errors.c +6 -0
 - data/ext/pg_record_coder.c +491 -0
 - data/ext/pg_result.c +897 -164
 - data/ext/pg_text_decoder.c +987 -0
 - data/ext/pg_text_encoder.c +814 -0
 - data/ext/pg_tuple.c +549 -0
 - data/ext/pg_type_map.c +166 -0
 - data/ext/pg_type_map_all_strings.c +116 -0
 - data/ext/pg_type_map_by_class.c +244 -0
 - data/ext/pg_type_map_by_column.c +313 -0
 - data/ext/pg_type_map_by_mri_type.c +284 -0
 - data/ext/pg_type_map_by_oid.c +356 -0
 - data/ext/pg_type_map_in_ruby.c +299 -0
 - data/ext/pg_util.c +149 -0
 - data/ext/pg_util.h +65 -0
 - data/lib/pg/basic_type_mapping.rb +522 -0
 - data/lib/pg/binary_decoder.rb +23 -0
 - data/lib/pg/coder.rb +104 -0
 - data/lib/pg/connection.rb +153 -41
 - data/lib/pg/constants.rb +2 -1
 - data/lib/pg/exceptions.rb +2 -1
 - data/lib/pg/result.rb +33 -6
 - data/lib/pg/text_decoder.rb +46 -0
 - data/lib/pg/text_encoder.rb +59 -0
 - data/lib/pg/tuple.rb +30 -0
 - data/lib/pg/type_map_by_column.rb +16 -0
 - data/lib/pg.rb +29 -9
 - data/spec/{lib/helpers.rb → helpers.rb} +151 -64
 - data/spec/pg/basic_type_mapping_spec.rb +630 -0
 - data/spec/pg/connection_spec.rb +1180 -477
 - data/spec/pg/connection_sync_spec.rb +41 -0
 - data/spec/pg/result_spec.rb +456 -120
 - data/spec/pg/tuple_spec.rb +333 -0
 - data/spec/pg/type_map_by_class_spec.rb +138 -0
 - data/spec/pg/type_map_by_column_spec.rb +226 -0
 - data/spec/pg/type_map_by_mri_type_spec.rb +136 -0
 - data/spec/pg/type_map_by_oid_spec.rb +149 -0
 - data/spec/pg/type_map_in_ruby_spec.rb +164 -0
 - data/spec/pg/type_map_spec.rb +22 -0
 - data/spec/pg/type_spec.rb +1123 -0
 - data/spec/pg_spec.rb +26 -20
 - data.tar.gz.sig +0 -0
 - metadata +148 -91
 - metadata.gz.sig +0 -0
 - data/sample/array_insert.rb +0 -20
 - data/sample/async_api.rb +0 -106
 - data/sample/async_copyto.rb +0 -39
 - data/sample/async_mixed.rb +0 -56
 - data/sample/check_conn.rb +0 -21
 - data/sample/copyfrom.rb +0 -81
 - data/sample/copyto.rb +0 -19
 - data/sample/cursor.rb +0 -21
 - data/sample/disk_usage_report.rb +0 -186
 - data/sample/issue-119.rb +0 -94
 - data/sample/losample.rb +0 -69
 - data/sample/minimal-testcase.rb +0 -17
 - data/sample/notify_wait.rb +0 -72
 - data/sample/pg_statistics.rb +0 -294
 - data/sample/replication_monitor.rb +0 -231
 - data/sample/test_binary_values.rb +0 -33
 - data/sample/wal_shipper.rb +0 -434
 - data/sample/warehouse_partitions.rb +0 -320
 
    
        data/sample/async_api.rb
    DELETED
    
    | 
         @@ -1,106 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            # This is a example of how to use the asynchronous API to query the
         
     | 
| 
       6 
     | 
    
         
            -
            # server without blocking other threads. It's intentionally low-level;
         
     | 
| 
       7 
     | 
    
         
            -
            # if you hooked up the PG::Connection#socket to some kind of reactor, you
         
     | 
| 
       8 
     | 
    
         
            -
            # could make this much nicer.
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            TIMEOUT = 5.0 # seconds to wait for an async operation to complete
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            # Print 'x' continuously to demonstrate that other threads aren't
         
     | 
| 
       13 
     | 
    
         
            -
            # blocked while waiting for the connection, for the query to be sent,
         
     | 
| 
       14 
     | 
    
         
            -
            # for results, etc. You might want to sleep inside the loop or
         
     | 
| 
       15 
     | 
    
         
            -
            # comment this out entirely for cleaner output.
         
     | 
| 
       16 
     | 
    
         
            -
            progress_thread = Thread.new { loop { print 'x' } }
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
            # Output progress messages
         
     | 
| 
       19 
     | 
    
         
            -
            def output_progress( msg )
         
     | 
| 
       20 
     | 
    
         
            -
            	puts "\n>>> #{msg}\n"
         
     | 
| 
       21 
     | 
    
         
            -
            end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
            # Start the connection
         
     | 
| 
       24 
     | 
    
         
            -
            output_progress "Starting connection..."
         
     | 
| 
       25 
     | 
    
         
            -
            conn = PG::Connection.connect_start( :dbname => 'test' ) or
         
     | 
| 
       26 
     | 
    
         
            -
            	abort "Unable to create a new connection!"
         
     | 
| 
       27 
     | 
    
         
            -
            abort "Connection failed: %s" % [ conn.error_message ] if
         
     | 
| 
       28 
     | 
    
         
            -
            	conn.status == PG::CONNECTION_BAD
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            # Now grab a reference to the underlying socket so we know when the
         
     | 
| 
       31 
     | 
    
         
            -
            # connection is established
         
     | 
| 
       32 
     | 
    
         
            -
            socket = conn.socket_io
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
            # Track the progress of the connection, waiting for the socket to become readable/writable
         
     | 
| 
       35 
     | 
    
         
            -
            # before polling it
         
     | 
| 
       36 
     | 
    
         
            -
            poll_status = PG::PGRES_POLLING_WRITING
         
     | 
| 
       37 
     | 
    
         
            -
            until poll_status == PG::PGRES_POLLING_OK ||
         
     | 
| 
       38 
     | 
    
         
            -
            	  poll_status == PG::PGRES_POLLING_FAILED
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
            	# If the socket needs to read, wait 'til it becomes readable to poll again
         
     | 
| 
       41 
     | 
    
         
            -
            	case poll_status
         
     | 
| 
       42 
     | 
    
         
            -
            	when PG::PGRES_POLLING_READING
         
     | 
| 
       43 
     | 
    
         
            -
            		output_progress "  waiting for socket to become readable"
         
     | 
| 
       44 
     | 
    
         
            -
            		select( [socket], nil, nil, TIMEOUT ) or
         
     | 
| 
       45 
     | 
    
         
            -
            			raise "Asynchronous connection timed out!"
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
            	# ...and the same for when the socket needs to write
         
     | 
| 
       48 
     | 
    
         
            -
            	when PG::PGRES_POLLING_WRITING
         
     | 
| 
       49 
     | 
    
         
            -
            		output_progress "  waiting for socket to become writable"
         
     | 
| 
       50 
     | 
    
         
            -
            		select( nil, [socket], nil, TIMEOUT ) or
         
     | 
| 
       51 
     | 
    
         
            -
            			raise "Asynchronous connection timed out!"
         
     | 
| 
       52 
     | 
    
         
            -
            	end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
            	# Output a status message about the progress
         
     | 
| 
       55 
     | 
    
         
            -
            	case conn.status
         
     | 
| 
       56 
     | 
    
         
            -
            	when PG::CONNECTION_STARTED
         
     | 
| 
       57 
     | 
    
         
            -
            		output_progress "  waiting for connection to be made."
         
     | 
| 
       58 
     | 
    
         
            -
            	when PG::CONNECTION_MADE
         
     | 
| 
       59 
     | 
    
         
            -
            		output_progress "  connection OK; waiting to send."
         
     | 
| 
       60 
     | 
    
         
            -
            	when PG::CONNECTION_AWAITING_RESPONSE
         
     | 
| 
       61 
     | 
    
         
            -
            		output_progress "  waiting for a response from the server."
         
     | 
| 
       62 
     | 
    
         
            -
            	when PG::CONNECTION_AUTH_OK
         
     | 
| 
       63 
     | 
    
         
            -
            		output_progress "  received authentication; waiting for backend start-up to finish."
         
     | 
| 
       64 
     | 
    
         
            -
            	when PG::CONNECTION_SSL_STARTUP
         
     | 
| 
       65 
     | 
    
         
            -
            		output_progress "  negotiating SSL encryption."
         
     | 
| 
       66 
     | 
    
         
            -
            	when PG::CONNECTION_SETENV
         
     | 
| 
       67 
     | 
    
         
            -
            		output_progress "  negotiating environment-driven parameter settings."
         
     | 
| 
       68 
     | 
    
         
            -
            	when PG::CONNECTION_NEEDED
         
     | 
| 
       69 
     | 
    
         
            -
            		output_progress "  internal state: connect() needed."
         
     | 
| 
       70 
     | 
    
         
            -
            	end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
            	# Check to see if it's finished or failed yet
         
     | 
| 
       73 
     | 
    
         
            -
            	poll_status = conn.connect_poll
         
     | 
| 
       74 
     | 
    
         
            -
            end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
            abort "Connect failed: %s" % [ conn.error_message ] unless conn.status == PG::CONNECTION_OK
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
            output_progress "Sending query"
         
     | 
| 
       79 
     | 
    
         
            -
            conn.send_query( "SELECT * FROM pg_stat_activity" )
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
            # Fetch results until there aren't any more
         
     | 
| 
       82 
     | 
    
         
            -
            loop do
         
     | 
| 
       83 
     | 
    
         
            -
            	output_progress "  waiting for a response"
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
            	# Buffer any incoming data on the socket until a full result is ready.
         
     | 
| 
       86 
     | 
    
         
            -
            	conn.consume_input
         
     | 
| 
       87 
     | 
    
         
            -
            	while conn.is_busy
         
     | 
| 
       88 
     | 
    
         
            -
            		select( [socket], nil, nil, TIMEOUT ) or
         
     | 
| 
       89 
     | 
    
         
            -
            			raise "Timeout waiting for query response."
         
     | 
| 
       90 
     | 
    
         
            -
            		conn.consume_input
         
     | 
| 
       91 
     | 
    
         
            -
            	end
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
            	# Fetch the next result. If there isn't one, the query is finished
         
     | 
| 
       94 
     | 
    
         
            -
            	result = conn.get_result or break
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
            	puts "\n\nQuery result:\n%p\n" % [ result.values ]
         
     | 
| 
       97 
     | 
    
         
            -
            end
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
            output_progress "Done."
         
     | 
| 
       100 
     | 
    
         
            -
            conn.finish
         
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
            if defined?( progress_thread )
         
     | 
| 
       103 
     | 
    
         
            -
            	progress_thread.kill
         
     | 
| 
       104 
     | 
    
         
            -
            	progress_thread.join
         
     | 
| 
       105 
     | 
    
         
            -
            end
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
    
        data/sample/async_copyto.rb
    DELETED
    
    | 
         @@ -1,39 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'stringio'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            # Using COPY asynchronously
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            $stderr.puts "Opening database connection ..."
         
     | 
| 
       9 
     | 
    
         
            -
            conn = PG.connect( :dbname => 'test' )
         
     | 
| 
       10 
     | 
    
         
            -
            conn.setnonblocking( true )
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            socket = conn.socket_io
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            $stderr.puts "Running COPY command ..."
         
     | 
| 
       15 
     | 
    
         
            -
            buf = ''
         
     | 
| 
       16 
     | 
    
         
            -
            conn.transaction do
         
     | 
| 
       17 
     | 
    
         
            -
            	conn.send_query( "COPY logs TO STDOUT WITH csv" )
         
     | 
| 
       18 
     | 
    
         
            -
            	buf = nil
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
            	# #get_copy_data returns a row if there's a whole one to return, false
         
     | 
| 
       21 
     | 
    
         
            -
            	# if there isn't one but the COPY is still running, or nil when it's
         
     | 
| 
       22 
     | 
    
         
            -
            	# finished.
         
     | 
| 
       23 
     | 
    
         
            -
            	begin
         
     | 
| 
       24 
     | 
    
         
            -
            		$stderr.puts "COPY loop"
         
     | 
| 
       25 
     | 
    
         
            -
            		conn.consume_input
         
     | 
| 
       26 
     | 
    
         
            -
            		while conn.is_busy
         
     | 
| 
       27 
     | 
    
         
            -
            			$stderr.puts "  ready loop"
         
     | 
| 
       28 
     | 
    
         
            -
            			select( [socket], nil, nil, 5.0 ) or
         
     | 
| 
       29 
     | 
    
         
            -
            				raise "Timeout (5s) waiting for query response."
         
     | 
| 
       30 
     | 
    
         
            -
            			conn.consume_input
         
     | 
| 
       31 
     | 
    
         
            -
            		end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
            		buf = conn.get_copy_data
         
     | 
| 
       34 
     | 
    
         
            -
            		$stdout.puts( buf ) if buf
         
     | 
| 
       35 
     | 
    
         
            -
            	end until buf.nil?
         
     | 
| 
       36 
     | 
    
         
            -
            end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
            conn.finish
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
    
        data/sample/async_mixed.rb
    DELETED
    
    | 
         @@ -1,56 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            $stdout.sync = true
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            # This is a example of how to mix and match synchronous and async APIs. In this case,
         
     | 
| 
       8 
     | 
    
         
            -
            # the connection to the server is made syncrhonously, and then queries are
         
     | 
| 
       9 
     | 
    
         
            -
            # asynchronous.
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            TIMEOUT = 5.0 # seconds to wait for an async operation to complete
         
     | 
| 
       12 
     | 
    
         
            -
            CONN_OPTS = {
         
     | 
| 
       13 
     | 
    
         
            -
            	:host     => 'localhost',
         
     | 
| 
       14 
     | 
    
         
            -
            	:dbname   => 'test',
         
     | 
| 
       15 
     | 
    
         
            -
            }
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            # Output progress messages
         
     | 
| 
       18 
     | 
    
         
            -
            def output_progress( msg )
         
     | 
| 
       19 
     | 
    
         
            -
            	puts ">>> #{msg}\n"
         
     | 
| 
       20 
     | 
    
         
            -
            end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            # Start the (synchronous) connection
         
     | 
| 
       23 
     | 
    
         
            -
            output_progress "Starting connection..."
         
     | 
| 
       24 
     | 
    
         
            -
            conn = PG.connect( CONN_OPTS ) or abort "Unable to create a new connection!"
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            abort "Connect failed: %s" % [ conn.error_message ] unless conn.status == PG::CONNECTION_OK
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
            # Now grab a reference to the underlying socket to select() on while the query is running
         
     | 
| 
       29 
     | 
    
         
            -
            socket = conn.socket_io
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
            # Send the (asynchronous) query
         
     | 
| 
       32 
     | 
    
         
            -
            output_progress "Sending query"
         
     | 
| 
       33 
     | 
    
         
            -
            conn.send_query( "SELECT * FROM pg_stat_activity" )
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
            # Fetch results until there aren't any more
         
     | 
| 
       36 
     | 
    
         
            -
            loop do
         
     | 
| 
       37 
     | 
    
         
            -
            	output_progress "  waiting for a response"
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
            	# Buffer any incoming data on the socket until a full result is ready.
         
     | 
| 
       40 
     | 
    
         
            -
            	conn.consume_input
         
     | 
| 
       41 
     | 
    
         
            -
            	while conn.is_busy
         
     | 
| 
       42 
     | 
    
         
            -
            		output_progress "  waiting for data to be available on %p..." % [ socket ]
         
     | 
| 
       43 
     | 
    
         
            -
            		select( [socket], nil, nil, TIMEOUT ) or
         
     | 
| 
       44 
     | 
    
         
            -
            			raise "Timeout waiting for query response."
         
     | 
| 
       45 
     | 
    
         
            -
            		conn.consume_input
         
     | 
| 
       46 
     | 
    
         
            -
            	end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
            	# Fetch the next result. If there isn't one, the query is finished
         
     | 
| 
       49 
     | 
    
         
            -
            	result = conn.get_result or break
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
            	output_progress "Query result:\n%p\n" % [ result.values ]
         
     | 
| 
       52 
     | 
    
         
            -
            end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
            output_progress "Done."
         
     | 
| 
       55 
     | 
    
         
            -
            conn.finish
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
    
        data/sample/check_conn.rb
    DELETED
    
    | 
         @@ -1,21 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
            # vim: set nosta noet ts=4 sw=4:
         
     | 
| 
       3 
     | 
    
         
            -
            # encoding: utf-8
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            # This is a minimal example of a function that can test an existing PG::Connection and
         
     | 
| 
       8 
     | 
    
         
            -
            # reset it if necessary.
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            def check_connection( conn )
         
     | 
| 
       11 
     | 
    
         
            -
            	begin
         
     | 
| 
       12 
     | 
    
         
            -
            		conn.exec( "SELECT 1" )
         
     | 
| 
       13 
     | 
    
         
            -
            	rescue PG::Error => err
         
     | 
| 
       14 
     | 
    
         
            -
            		$stderr.puts "%p while testing connection: %s" % [ err.class, err.message ]
         
     | 
| 
       15 
     | 
    
         
            -
            		conn.reset
         
     | 
| 
       16 
     | 
    
         
            -
            	end
         
     | 
| 
       17 
     | 
    
         
            -
            end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
            conn = PG.connect( dbname: 'test' )
         
     | 
| 
       20 
     | 
    
         
            -
            check_connection( conn )
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
    
        data/sample/copyfrom.rb
    DELETED
    
    | 
         @@ -1,81 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'stringio'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            $stderr.puts "Opening database connection ..."
         
     | 
| 
       7 
     | 
    
         
            -
            conn = PG.connect( :dbname => 'test' )
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            conn.exec( <<END_SQL )
         
     | 
| 
       10 
     | 
    
         
            -
            DROP TABLE IF EXISTS logs;
         
     | 
| 
       11 
     | 
    
         
            -
            CREATE TABLE logs (
         
     | 
| 
       12 
     | 
    
         
            -
            	client_ip inet,
         
     | 
| 
       13 
     | 
    
         
            -
            	username text,
         
     | 
| 
       14 
     | 
    
         
            -
            	ts timestamp,
         
     | 
| 
       15 
     | 
    
         
            -
            	request text,
         
     | 
| 
       16 
     | 
    
         
            -
            	status smallint,
         
     | 
| 
       17 
     | 
    
         
            -
            	bytes int
         
     | 
| 
       18 
     | 
    
         
            -
            );
         
     | 
| 
       19 
     | 
    
         
            -
            END_SQL
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
            copy_data = StringIO.new( <<"END_DATA" )
         
     | 
| 
       22 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /manual/ HTTP/1.1",404,205
         
     | 
| 
       23 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /favicon.ico HTTP/1.1",404,209
         
     | 
| 
       24 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /favicon.ico HTTP/1.1",404,209
         
     | 
| 
       25 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:22:29 -0700","GET /manual/ HTTP/1.1",200,11094
         
     | 
| 
       26 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:22:38 -0700","GET /manual/index.html HTTP/1.1",200,725
         
     | 
| 
       27 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:27:56 -0700","GET /manual/ HTTP/1.1",200,11094
         
     | 
| 
       28 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:27:57 -0700","GET /manual/ HTTP/1.1",200,11094
         
     | 
| 
       29 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/index.html HTTP/1.1",200,7709
         
     | 
| 
       30 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/feather.gif HTTP/1.1",200,6471
         
     | 
| 
       31 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/left.gif HTTP/1.1",200,60
         
     | 
| 
       32 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual.css HTTP/1.1",200,18674
         
     | 
| 
       33 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual-print.css HTTP/1.1",200,13200
         
     | 
| 
       34 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/favicon.ico HTTP/1.1",200,1078
         
     | 
| 
       35 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual-loose-100pc.css HTTP/1.1",200,3065
         
     | 
| 
       36 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:14 -0700","OPTIONS * HTTP/1.0",200,0
         
     | 
| 
       37 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:15 -0700","OPTIONS * HTTP/1.0",200,0
         
     | 
| 
       38 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:47 -0700","GET /manual/mod/directives.html HTTP/1.1",200,33561
         
     | 
| 
       39 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/mod/mpm_common.html HTTP/1.1",200,67683
         
     | 
| 
       40 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/images/down.gif HTTP/1.1",200,56
         
     | 
| 
       41 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/images/up.gif HTTP/1.1",200,57
         
     | 
| 
       42 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:09:19:58 -0700","GET /manual/mod/mod_log_config.html HTTP/1.1",200,28307
         
     | 
| 
       43 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:09:20:19 -0700","GET /manual/mod/core.html HTTP/1.1",200,194144
         
     | 
| 
       44 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:16:02:56 -0700","GET /manual/ HTTP/1.1",200,11094
         
     | 
| 
       45 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:16:03:00 -0700","GET /manual/ HTTP/1.1",200,11094
         
     | 
| 
       46 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:16:06:16 -0700","GET /manual/mod/mod_dir.html HTTP/1.1",200,10583
         
     | 
| 
       47 
     | 
    
         
            -
            "127.0.0.1","","30/Aug/2010:16:06:44 -0700","GET /manual/ HTTP/1.1",200,7709
         
     | 
| 
       48 
     | 
    
         
            -
            END_DATA
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
            ### You can test the error case from the database side easily by
         
     | 
| 
       51 
     | 
    
         
            -
            ### changing one of the numbers at the end of one of the above rows to
         
     | 
| 
       52 
     | 
    
         
            -
            ### something non-numeric like "-".
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
            $stderr.puts "Running COPY command with data ..."
         
     | 
| 
       55 
     | 
    
         
            -
            buf = ''
         
     | 
| 
       56 
     | 
    
         
            -
            conn.transaction do
         
     | 
| 
       57 
     | 
    
         
            -
            	conn.exec( "COPY logs FROM STDIN WITH csv" )
         
     | 
| 
       58 
     | 
    
         
            -
            	begin
         
     | 
| 
       59 
     | 
    
         
            -
            		while copy_data.read( 256, buf )
         
     | 
| 
       60 
     | 
    
         
            -
            			### Uncomment this to test error-handling for exceptions from the reader side:
         
     | 
| 
       61 
     | 
    
         
            -
            			# raise Errno::ECONNRESET, "socket closed while reading"
         
     | 
| 
       62 
     | 
    
         
            -
            			$stderr.puts "	sending %d bytes of data..." % [ buf.length ]
         
     | 
| 
       63 
     | 
    
         
            -
            			until conn.put_copy_data( buf )
         
     | 
| 
       64 
     | 
    
         
            -
            				$stderr.puts "	waiting for connection to be writable..."
         
     | 
| 
       65 
     | 
    
         
            -
            				sleep 0.1
         
     | 
| 
       66 
     | 
    
         
            -
            			end
         
     | 
| 
       67 
     | 
    
         
            -
            		end
         
     | 
| 
       68 
     | 
    
         
            -
            	rescue Errno => err
         
     | 
| 
       69 
     | 
    
         
            -
            		errmsg = "%s while reading copy data: %s" % [ err.class.name, err.message ]
         
     | 
| 
       70 
     | 
    
         
            -
            		conn.put_copy_end( errmsg )
         
     | 
| 
       71 
     | 
    
         
            -
            	else
         
     | 
| 
       72 
     | 
    
         
            -
            		conn.put_copy_end
         
     | 
| 
       73 
     | 
    
         
            -
            		while res = conn.get_result
         
     | 
| 
       74 
     | 
    
         
            -
            			$stderr.puts "Result of COPY is: %s" % [ res.res_status(res.result_status) ]
         
     | 
| 
       75 
     | 
    
         
            -
            		end
         
     | 
| 
       76 
     | 
    
         
            -
            	end
         
     | 
| 
       77 
     | 
    
         
            -
            end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
            conn.finish
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
    
        data/sample/copyto.rb
    DELETED
    
    | 
         @@ -1,19 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'stringio'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            # An example of how to stream data to your local host from the database as CSV.
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            $stderr.puts "Opening database connection ..."
         
     | 
| 
       9 
     | 
    
         
            -
            conn = PG.connect( :dbname => 'test' )
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            $stderr.puts "Running COPY command ..."
         
     | 
| 
       12 
     | 
    
         
            -
            buf = ''
         
     | 
| 
       13 
     | 
    
         
            -
            conn.transaction do
         
     | 
| 
       14 
     | 
    
         
            -
            	conn.exec( "COPY logs TO STDOUT WITH csv" )
         
     | 
| 
       15 
     | 
    
         
            -
            	$stdout.puts( buf ) while buf = conn.get_copy_data
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
            conn.finish
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
    
        data/sample/cursor.rb
    DELETED
    
    | 
         @@ -1,21 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'pg'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            # An example of how to use SQL cursors. This is mostly a straight port of
         
     | 
| 
       6 
     | 
    
         
            -
            # the cursor portion of testlibpq.c from src/test/examples.
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            $stderr.puts "Opening database connection ..."
         
     | 
| 
       9 
     | 
    
         
            -
            conn = PG.connect( :dbname => 'test' )
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            #
         
     | 
| 
       12 
     | 
    
         
            -
            conn.transaction do
         
     | 
| 
       13 
     | 
    
         
            -
                conn.exec( "DECLARE myportal CURSOR FOR select * from pg_database" )
         
     | 
| 
       14 
     | 
    
         
            -
                res = conn.exec( "FETCH ALL IN myportal" )
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                puts res.fields.collect {|fname| "%-15s" % [fname] }.join( '' )
         
     | 
| 
       17 
     | 
    
         
            -
                res.values.collect do |row|
         
     | 
| 
       18 
     | 
    
         
            -
                    puts row.collect {|col| "%-15s" % [col] }.join( '' )
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
            end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
    
        data/sample/disk_usage_report.rb
    DELETED
    
    | 
         @@ -1,186 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
            # vim: set noet nosta sw=4 ts=4 :
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # Quickly dump size information for a given database.
         
     | 
| 
       5 
     | 
    
         
            -
            # Top twenty objects, and size per schema.
         
     | 
| 
       6 
     | 
    
         
            -
            #
         
     | 
| 
       7 
     | 
    
         
            -
            # Mahlon E. Smith <mahlon@martini.nu>
         
     | 
| 
       8 
     | 
    
         
            -
            #
         
     | 
| 
       9 
     | 
    
         
            -
            # Based on work by Jeff Davis <ruby@j-davis.com>.
         
     | 
| 
       10 
     | 
    
         
            -
            #
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
            begin
         
     | 
| 
       14 
     | 
    
         
            -
            	require 'ostruct'
         
     | 
| 
       15 
     | 
    
         
            -
            	require 'optparse'
         
     | 
| 
       16 
     | 
    
         
            -
            	require 'etc'
         
     | 
| 
       17 
     | 
    
         
            -
            	require 'pg'
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
            rescue LoadError # 1.8 support
         
     | 
| 
       20 
     | 
    
         
            -
            	unless Object.const_defined?( :Gem )
         
     | 
| 
       21 
     | 
    
         
            -
            		require 'rubygems'
         
     | 
| 
       22 
     | 
    
         
            -
            		retry
         
     | 
| 
       23 
     | 
    
         
            -
            	end
         
     | 
| 
       24 
     | 
    
         
            -
            	raise
         
     | 
| 
       25 
     | 
    
         
            -
            end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            SCRIPT_VERSION = %q$Id: disk_usage_report.rb,v 76ebae01c937 2013/03/26 17:50:02 ged $
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            ### Gather data and output it to $stdout.
         
     | 
| 
       31 
     | 
    
         
            -
            ###
         
     | 
| 
       32 
     | 
    
         
            -
            def report( opts )
         
     | 
| 
       33 
     | 
    
         
            -
            	db = PG.connect(
         
     | 
| 
       34 
     | 
    
         
            -
            		:dbname   => opts.database,
         
     | 
| 
       35 
     | 
    
         
            -
            		:host     => opts.host,
         
     | 
| 
       36 
     | 
    
         
            -
            		:port     => opts.port,
         
     | 
| 
       37 
     | 
    
         
            -
            		:user     => opts.user,
         
     | 
| 
       38 
     | 
    
         
            -
            		:password => opts.pass,
         
     | 
| 
       39 
     | 
    
         
            -
            		:sslmode  => 'prefer'
         
     | 
| 
       40 
     | 
    
         
            -
            	)
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
            	# -----------------------------------------
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
            	db_info = db.exec %Q{
         
     | 
| 
       45 
     | 
    
         
            -
            		SELECT
         
     | 
| 
       46 
     | 
    
         
            -
            			count(oid) AS num_relations,
         
     | 
| 
       47 
     | 
    
         
            -
            			pg_size_pretty(pg_database_size('#{opts.database}')) AS dbsize
         
     | 
| 
       48 
     | 
    
         
            -
            		FROM
         
     | 
| 
       49 
     | 
    
         
            -
            			pg_class
         
     | 
| 
       50 
     | 
    
         
            -
            	}
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
            	puts '=' * 70
         
     | 
| 
       53 
     | 
    
         
            -
            	puts "Disk usage information for %s: (%d relations, %s total)" % [
         
     | 
| 
       54 
     | 
    
         
            -
            		opts.database,
         
     | 
| 
       55 
     | 
    
         
            -
            		db_info[0]['num_relations'],
         
     | 
| 
       56 
     | 
    
         
            -
            		db_info[0]['dbsize']
         
     | 
| 
       57 
     | 
    
         
            -
            	]
         
     | 
| 
       58 
     | 
    
         
            -
            	puts '=' * 70
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
            	# -----------------------------------------
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
            	top_twenty = db.exec %q{
         
     | 
| 
       63 
     | 
    
         
            -
            		SELECT
         
     | 
| 
       64 
     | 
    
         
            -
            			relname AS name,
         
     | 
| 
       65 
     | 
    
         
            -
            			relkind AS kind,
         
     | 
| 
       66 
     | 
    
         
            -
            			pg_size_pretty(pg_relation_size(pg_class.oid)) AS size
         
     | 
| 
       67 
     | 
    
         
            -
            		FROM
         
     | 
| 
       68 
     | 
    
         
            -
            			pg_class
         
     | 
| 
       69 
     | 
    
         
            -
            		ORDER BY
         
     | 
| 
       70 
     | 
    
         
            -
            			pg_relation_size(pg_class.oid) DESC
         
     | 
| 
       71 
     | 
    
         
            -
            		LIMIT 20
         
     | 
| 
       72 
     | 
    
         
            -
            	}
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
            	puts 'Top twenty objects by size:'
         
     | 
| 
       75 
     | 
    
         
            -
            	puts '-' * 70
         
     | 
| 
       76 
     | 
    
         
            -
            	top_twenty.each do |row|
         
     | 
| 
       77 
     | 
    
         
            -
            		type = case row['kind']
         
     | 
| 
       78 
     | 
    
         
            -
            			   when 'i'; 'index'
         
     | 
| 
       79 
     | 
    
         
            -
            			   when 't'; 'toast'
         
     | 
| 
       80 
     | 
    
         
            -
            			   when 'r'; 'table'
         
     | 
| 
       81 
     | 
    
         
            -
            			   when 'S'; 'sequence'
         
     | 
| 
       82 
     | 
    
         
            -
            			   else;     '???'
         
     | 
| 
       83 
     | 
    
         
            -
            			   end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
            		puts "%40s %10s (%s)" % [ row['name'], row['size'], type ]
         
     | 
| 
       86 
     | 
    
         
            -
            	end
         
     | 
| 
       87 
     | 
    
         
            -
            	puts '-' * 70
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
            	# -----------------------------------------
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
            	schema_sizes = db.exec %q{
         
     | 
| 
       92 
     | 
    
         
            -
            		SELECT
         
     | 
| 
       93 
     | 
    
         
            -
            			table_schema,
         
     | 
| 
       94 
     | 
    
         
            -
            			pg_size_pretty( CAST( SUM(pg_total_relation_size(table_schema || '.' || table_name)) AS bigint)) AS size
         
     | 
| 
       95 
     | 
    
         
            -
            		FROM
         
     | 
| 
       96 
     | 
    
         
            -
            			information_schema.tables
         
     | 
| 
       97 
     | 
    
         
            -
            		GROUP BY
         
     | 
| 
       98 
     | 
    
         
            -
            			table_schema
         
     | 
| 
       99 
     | 
    
         
            -
            		ORDER BY
         
     | 
| 
       100 
     | 
    
         
            -
            			CAST( SUM(pg_total_relation_size(table_schema || '.' || table_name)) AS bigint ) DESC
         
     | 
| 
       101 
     | 
    
         
            -
            	}
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
            	puts 'Size per schema:'
         
     | 
| 
       105 
     | 
    
         
            -
            	puts '-' * 70
         
     | 
| 
       106 
     | 
    
         
            -
            	schema_sizes.each do |row|
         
     | 
| 
       107 
     | 
    
         
            -
            		puts "%20s %10s" % [ row['table_schema'], row['size'] ]
         
     | 
| 
       108 
     | 
    
         
            -
            	end
         
     | 
| 
       109 
     | 
    
         
            -
            	puts '-' * 70
         
     | 
| 
       110 
     | 
    
         
            -
            	puts
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
            	db.finish
         
     | 
| 
       113 
     | 
    
         
            -
            end
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
            ### Parse command line arguments.  Return a struct of global options.
         
     | 
| 
       117 
     | 
    
         
            -
            ###
         
     | 
| 
       118 
     | 
    
         
            -
            def parse_args( args )
         
     | 
| 
       119 
     | 
    
         
            -
            	options          = OpenStruct.new
         
     | 
| 
       120 
     | 
    
         
            -
            	options.database = Etc.getpwuid( Process.uid ).name
         
     | 
| 
       121 
     | 
    
         
            -
            	options.host     = '127.0.0.1'
         
     | 
| 
       122 
     | 
    
         
            -
            	options.port     = 5432
         
     | 
| 
       123 
     | 
    
         
            -
            	options.user     = Etc.getpwuid( Process.uid ).name
         
     | 
| 
       124 
     | 
    
         
            -
            	options.sslmode  = 'prefer'
         
     | 
| 
       125 
     | 
    
         
            -
            	options.interval = 5
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
            	opts = OptionParser.new do |opts|
         
     | 
| 
       128 
     | 
    
         
            -
            		opts.banner = "Usage: #{$0} [options]"
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
            		opts.separator ''
         
     | 
| 
       131 
     | 
    
         
            -
            		opts.separator 'Connection options:'
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
            		opts.on( '-d', '--database DBNAME',
         
     | 
| 
       134 
     | 
    
         
            -
            				"specify the database to connect to (default: \"#{options.database}\")" ) do |db|
         
     | 
| 
       135 
     | 
    
         
            -
            			options.database = db
         
     | 
| 
       136 
     | 
    
         
            -
            		end
         
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
            		opts.on( '-h', '--host HOSTNAME', 'database server host' ) do |host|
         
     | 
| 
       139 
     | 
    
         
            -
            			options.host = host
         
     | 
| 
       140 
     | 
    
         
            -
            		end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
            		opts.on( '-p', '--port PORT', Integer,
         
     | 
| 
       143 
     | 
    
         
            -
            				"database server port (default: \"#{options.port}\")" ) do |port|
         
     | 
| 
       144 
     | 
    
         
            -
            			options.port = port
         
     | 
| 
       145 
     | 
    
         
            -
            		end
         
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
            		opts.on( '-U', '--user NAME',
         
     | 
| 
       148 
     | 
    
         
            -
            				"database user name (default: \"#{options.user}\")" ) do |user|
         
     | 
| 
       149 
     | 
    
         
            -
            			options.user = user
         
     | 
| 
       150 
     | 
    
         
            -
            		end
         
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
            		opts.on( '-W', 'force password prompt' ) do |pw|
         
     | 
| 
       153 
     | 
    
         
            -
            			print 'Password: '
         
     | 
| 
       154 
     | 
    
         
            -
            			begin
         
     | 
| 
       155 
     | 
    
         
            -
            				system 'stty -echo'
         
     | 
| 
       156 
     | 
    
         
            -
            				options.pass = gets.chomp
         
     | 
| 
       157 
     | 
    
         
            -
            			ensure
         
     | 
| 
       158 
     | 
    
         
            -
            				system 'stty echo'
         
     | 
| 
       159 
     | 
    
         
            -
            				puts
         
     | 
| 
       160 
     | 
    
         
            -
            			end
         
     | 
| 
       161 
     | 
    
         
            -
            		end
         
     | 
| 
       162 
     | 
    
         
            -
             
     | 
| 
       163 
     | 
    
         
            -
            		opts.separator ''
         
     | 
| 
       164 
     | 
    
         
            -
            		opts.separator 'Other options:'
         
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
            		opts.on_tail( '--help', 'show this help, then exit' ) do
         
     | 
| 
       167 
     | 
    
         
            -
            			$stderr.puts opts
         
     | 
| 
       168 
     | 
    
         
            -
            			exit
         
     | 
| 
       169 
     | 
    
         
            -
            		end
         
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
            		opts.on_tail( '--version', 'output version information, then exit' ) do
         
     | 
| 
       172 
     | 
    
         
            -
            			puts SCRIPT_VERSION
         
     | 
| 
       173 
     | 
    
         
            -
            			exit
         
     | 
| 
       174 
     | 
    
         
            -
            		end
         
     | 
| 
       175 
     | 
    
         
            -
            	end
         
     | 
| 
       176 
     | 
    
         
            -
             
     | 
| 
       177 
     | 
    
         
            -
            	opts.parse!( args )
         
     | 
| 
       178 
     | 
    
         
            -
            	return options
         
     | 
| 
       179 
     | 
    
         
            -
            end
         
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
             
     | 
| 
       182 
     | 
    
         
            -
            if __FILE__ == $0
         
     | 
| 
       183 
     | 
    
         
            -
            	opts = parse_args( ARGV )
         
     | 
| 
       184 
     | 
    
         
            -
            	report( opts )
         
     | 
| 
       185 
     | 
    
         
            -
            end
         
     | 
| 
       186 
     | 
    
         
            -
             
     |