pg 0.15.0.pre.432-x86-mingw32 → 0.15.0.pre.454-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/ChangeLog +191 -116
- data/History.rdoc +5 -2
- data/README.ja.rdoc +10 -3
- data/README.rdoc +13 -4
- data/Rakefile +15 -13
- data/Rakefile.cross +194 -169
- data/ext/extconf.rb +4 -1
- data/ext/pg_connection.c +102 -10
- data/lib/1.8/pg_ext.so +0 -0
- data/lib/1.9/pg_ext.so +0 -0
- data/lib/2.0/pg_ext.so +0 -0
- data/lib/pg.rb +1 -1
- data/lib/pg/connection.rb +0 -14
- data/spec/lib/helpers.rb +28 -4
- data/spec/pg/connection_spec.rb +27 -8
- metadata +45 -23
- metadata.gz.sig +0 -0
data/ext/extconf.rb
CHANGED
@@ -32,7 +32,9 @@ dir_config 'pg'
|
|
32
32
|
if pgconfig = ( with_config('pg-config') || with_config('pg_config') || find_executable('pg_config') )
|
33
33
|
$stderr.puts "Using config values from %s" % [ pgconfig ]
|
34
34
|
$CPPFLAGS << " -I%s" % [ `"#{pgconfig}" --includedir`.chomp ]
|
35
|
-
|
35
|
+
|
36
|
+
libdir = `"#{pgconfig}" --libdir`.chomp
|
37
|
+
$LDFLAGS << " -L%s -Wl,-rpath,%s" % [ libdir, libdir ]
|
36
38
|
else
|
37
39
|
$stderr.puts "No pg_config... trying anyway. If building fails, please try again with",
|
38
40
|
" --with-pg-config=/path/to/pg_config"
|
@@ -72,6 +74,7 @@ have_func 'rb_enc_alias'
|
|
72
74
|
have_func 'rb_thread_call_without_gvl'
|
73
75
|
have_func 'rb_thread_call_with_gvl'
|
74
76
|
have_func 'rb_thread_fd_select'
|
77
|
+
have_func 'rb_w32_wrap_io_handle'
|
75
78
|
|
76
79
|
have_const 'PGRES_COPY_BOTH', 'libpq-fe.h'
|
77
80
|
have_const 'PGRES_SINGLE_TUPLE', 'libpq-fe.h'
|
data/ext/pg_connection.c
CHANGED
@@ -63,6 +63,29 @@ pg_get_pgconn( VALUE self )
|
|
63
63
|
}
|
64
64
|
|
65
65
|
|
66
|
+
/*
|
67
|
+
* Close the associated socket IO object if there is one.
|
68
|
+
*/
|
69
|
+
void
|
70
|
+
pgconn_close_socket_io( VALUE self )
|
71
|
+
{
|
72
|
+
VALUE socket_io = rb_iv_get( self, "@socket_io" );
|
73
|
+
int ruby_sd;
|
74
|
+
|
75
|
+
if ( RTEST(socket_io) ) {
|
76
|
+
#if defined(_WIN32) && defined(HAVE_RB_W32_WRAP_IO_HANDLE)
|
77
|
+
ruby_sd = NUM2INT(rb_funcall( socket_io, rb_intern("fileno"), 0 ));
|
78
|
+
if( rb_w32_unwrap_io_handle(ruby_sd) ){
|
79
|
+
rb_raise(rb_ePGerror, "Could not unwrap win32 socket handle");
|
80
|
+
}
|
81
|
+
#endif
|
82
|
+
rb_funcall( socket_io, rb_intern("close"), 0 );
|
83
|
+
}
|
84
|
+
|
85
|
+
rb_iv_set( self, "@socket_io", Qnil );
|
86
|
+
}
|
87
|
+
|
88
|
+
|
66
89
|
/*
|
67
90
|
* Allocation/
|
68
91
|
*/
|
@@ -388,7 +411,7 @@ pgconn_s_encrypt_password(VALUE self, VALUE password, VALUE username)
|
|
388
411
|
*
|
389
412
|
* Example:
|
390
413
|
* conn = PG::Connection.connect_start("dbname=mydatabase")
|
391
|
-
* socket =
|
414
|
+
* socket = conn.socket_io
|
392
415
|
* status = conn.connect_poll
|
393
416
|
* while(status != PG::PGRES_POLLING_OK) do
|
394
417
|
* # do some work while waiting for the connection to complete
|
@@ -421,10 +444,11 @@ pgconn_connect_poll(VALUE self)
|
|
421
444
|
* Closes the backend connection.
|
422
445
|
*/
|
423
446
|
static VALUE
|
424
|
-
pgconn_finish(VALUE self)
|
447
|
+
pgconn_finish( VALUE self )
|
425
448
|
{
|
426
|
-
|
427
|
-
|
449
|
+
pgconn_close_socket_io( self );
|
450
|
+
PQfinish( pg_get_pgconn(self) );
|
451
|
+
DATA_PTR( self ) = NULL;
|
428
452
|
return Qnil;
|
429
453
|
}
|
430
454
|
|
@@ -451,9 +475,10 @@ pgconn_finished_p( VALUE self )
|
|
451
475
|
* backend connection and tries to re-connect.
|
452
476
|
*/
|
453
477
|
static VALUE
|
454
|
-
pgconn_reset(VALUE self)
|
478
|
+
pgconn_reset( VALUE self )
|
455
479
|
{
|
456
|
-
|
480
|
+
pgconn_close_socket_io( self );
|
481
|
+
PQreset( pg_get_pgconn(self) );
|
457
482
|
return self;
|
458
483
|
}
|
459
484
|
|
@@ -470,6 +495,7 @@ pgconn_reset(VALUE self)
|
|
470
495
|
static VALUE
|
471
496
|
pgconn_reset_start(VALUE self)
|
472
497
|
{
|
498
|
+
pgconn_close_socket_io( self );
|
473
499
|
if(PQresetStart(pg_get_pgconn(self)) == 0)
|
474
500
|
rb_raise(rb_ePGerror, "reset has failed");
|
475
501
|
return Qnil;
|
@@ -715,6 +741,55 @@ pgconn_socket(VALUE self)
|
|
715
741
|
}
|
716
742
|
|
717
743
|
|
744
|
+
#if !defined(_WIN32) || defined(HAVE_RB_W32_WRAP_IO_HANDLE)
|
745
|
+
|
746
|
+
/*
|
747
|
+
* call-seq:
|
748
|
+
* conn.socket_io() -> IO
|
749
|
+
*
|
750
|
+
* Fetch a memoized IO object created from the Connection's underlying socket.
|
751
|
+
* This object can be used for IO.select to wait for events while running
|
752
|
+
* asynchronous API calls.
|
753
|
+
*
|
754
|
+
* Using this instead of #socket avoids the problem of the underlying connection
|
755
|
+
* being closed by Ruby when an IO created using <tt>IO.for_fd(conn.socket)</tt>
|
756
|
+
* goes out of scope.
|
757
|
+
*
|
758
|
+
* This method can also be used on Windows but requires Ruby-2.0+.
|
759
|
+
*/
|
760
|
+
static VALUE
|
761
|
+
pgconn_socket_io(VALUE self)
|
762
|
+
{
|
763
|
+
int sd;
|
764
|
+
int ruby_sd;
|
765
|
+
int id_autoclose = rb_intern("autoclose=");
|
766
|
+
VALUE socket_io = rb_iv_get( self, "@socket_io" );
|
767
|
+
|
768
|
+
if ( !RTEST(socket_io) ) {
|
769
|
+
if( (sd = PQsocket(pg_get_pgconn(self))) < 0)
|
770
|
+
rb_raise(rb_ePGerror, "Can't get socket descriptor");
|
771
|
+
|
772
|
+
#ifdef _WIN32
|
773
|
+
ruby_sd = rb_w32_wrap_io_handle((HANDLE)(intptr_t)sd, O_RDWR|O_BINARY|O_NOINHERIT);
|
774
|
+
#else
|
775
|
+
ruby_sd = sd;
|
776
|
+
#endif
|
777
|
+
|
778
|
+
socket_io = rb_funcall( rb_cIO, rb_intern("for_fd"), 1, INT2NUM(ruby_sd) );
|
779
|
+
|
780
|
+
/* Disable autoclose feature, when supported */
|
781
|
+
if( rb_respond_to(socket_io, id_autoclose) ){
|
782
|
+
rb_funcall( socket_io, id_autoclose, 1, Qfalse );
|
783
|
+
}
|
784
|
+
|
785
|
+
rb_iv_set( self, "@socket_io", socket_io );
|
786
|
+
}
|
787
|
+
|
788
|
+
return socket_io;
|
789
|
+
}
|
790
|
+
|
791
|
+
#endif
|
792
|
+
|
718
793
|
/*
|
719
794
|
* call-seq:
|
720
795
|
* conn.backend_pid() -> Fixnum
|
@@ -2174,6 +2249,10 @@ wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readabl
|
|
2174
2249
|
return NULL;
|
2175
2250
|
} else if ( wait_ret == WAIT_OBJECT_0 ) {
|
2176
2251
|
/* The event we were waiting for. */
|
2252
|
+
} else if ( wait_ret == WAIT_OBJECT_0 + 1) {
|
2253
|
+
/* This indicates interruption from timer thread, GC, exception
|
2254
|
+
* from other threads etc... */
|
2255
|
+
rb_thread_check_ints();
|
2177
2256
|
} else if ( wait_ret == WAIT_FAILED ) {
|
2178
2257
|
WSACloseEvent( hEvent );
|
2179
2258
|
rb_raise( rb_ePGerror, "Wait on socket error (WaitForMultipleObjects): %lu", GetLastError() );
|
@@ -2884,6 +2963,7 @@ pgconn_get_last_result(VALUE self)
|
|
2884
2963
|
return rb_pgresult;
|
2885
2964
|
}
|
2886
2965
|
|
2966
|
+
#if !defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
|
2887
2967
|
|
2888
2968
|
/*
|
2889
2969
|
* call-seq:
|
@@ -2891,10 +2971,14 @@ pgconn_get_last_result(VALUE self)
|
|
2891
2971
|
* conn.async_exec(sql [, params, result_format ] ) {|pg_result| block }
|
2892
2972
|
*
|
2893
2973
|
* This function has the same behavior as #exec,
|
2894
|
-
*
|
2895
|
-
*
|
2896
|
-
*
|
2897
|
-
*
|
2974
|
+
* but ensures that other threads can process while
|
2975
|
+
* waiting for the server to complete the request.
|
2976
|
+
*
|
2977
|
+
* On Ruby platforms with native threads (MRI-1.9+ and all others)
|
2978
|
+
* this method is an alias to #exec.
|
2979
|
+
*
|
2980
|
+
* On MRI-1.8 it's implemented using asynchronous command
|
2981
|
+
* processing and ruby's +rb_thread_select+ .
|
2898
2982
|
*/
|
2899
2983
|
static VALUE
|
2900
2984
|
pgconn_async_exec(int argc, VALUE *argv, VALUE self)
|
@@ -2915,6 +2999,7 @@ pgconn_async_exec(int argc, VALUE *argv, VALUE self)
|
|
2915
2999
|
return rb_pgresult;
|
2916
3000
|
}
|
2917
3001
|
|
3002
|
+
#endif
|
2918
3003
|
|
2919
3004
|
/**************************************************************************
|
2920
3005
|
* LARGE OBJECT SUPPORT
|
@@ -3394,6 +3479,9 @@ init_pg_connection()
|
|
3394
3479
|
rb_define_method(rb_cPGconn, "server_version", pgconn_server_version, 0);
|
3395
3480
|
rb_define_method(rb_cPGconn, "error_message", pgconn_error_message, 0);
|
3396
3481
|
rb_define_method(rb_cPGconn, "socket", pgconn_socket, 0);
|
3482
|
+
#if !defined(_WIN32) || defined(HAVE_RB_W32_WRAP_IO_HANDLE)
|
3483
|
+
rb_define_method(rb_cPGconn, "socket_io", pgconn_socket_io, 0);
|
3484
|
+
#endif
|
3397
3485
|
rb_define_method(rb_cPGconn, "backend_pid", pgconn_backend_pid, 0);
|
3398
3486
|
rb_define_method(rb_cPGconn, "connection_needs_password", pgconn_connection_needs_password, 0);
|
3399
3487
|
rb_define_method(rb_cPGconn, "connection_used_password", pgconn_connection_used_password, 0);
|
@@ -3465,7 +3553,11 @@ init_pg_connection()
|
|
3465
3553
|
rb_define_method(rb_cPGconn, "wait_for_notify", pgconn_wait_for_notify, -1);
|
3466
3554
|
rb_define_alias(rb_cPGconn, "notifies_wait", "wait_for_notify");
|
3467
3555
|
rb_define_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
|
3556
|
+
#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
|
3557
|
+
rb_define_alias(rb_cPGconn, "async_exec", "exec");
|
3558
|
+
#else
|
3468
3559
|
rb_define_method(rb_cPGconn, "async_exec", pgconn_async_exec, -1);
|
3560
|
+
#endif
|
3469
3561
|
rb_define_alias(rb_cPGconn, "async_query", "async_exec");
|
3470
3562
|
rb_define_method(rb_cPGconn, "get_last_result", pgconn_get_last_result, 0);
|
3471
3563
|
|
data/lib/1.8/pg_ext.so
CHANGED
Binary file
|
data/lib/1.9/pg_ext.so
CHANGED
Binary file
|
data/lib/2.0/pg_ext.so
ADDED
Binary file
|
data/lib/pg.rb
CHANGED
data/lib/pg/connection.rb
CHANGED
@@ -64,20 +64,6 @@ class PG::Connection
|
|
64
64
|
class << self
|
65
65
|
define_method( :isthreadsafe, &PG.method(:isthreadsafe) )
|
66
66
|
end
|
67
|
-
|
68
|
-
|
69
|
-
### Fetch a memoized IO object created from the Connection's underlying socket.
|
70
|
-
### Using this avoids the problem of the underlying connection being closed by
|
71
|
-
### Ruby when an IO created using <tt>IO.for_fd(conn.socket)</tt> goes out of scope.
|
72
|
-
def socket_io
|
73
|
-
unless @socket_io
|
74
|
-
@socket_io = IO.for_fd( self.socket )
|
75
|
-
@socket_io.autoclose = false if @socket_io.respond_to?( :autoclose= )
|
76
|
-
end
|
77
|
-
|
78
|
-
return @socket_io
|
79
|
-
end
|
80
|
-
|
81
67
|
end # class PG::Connection
|
82
68
|
|
83
69
|
# Backward-compatible alias
|
data/spec/lib/helpers.rb
CHANGED
@@ -181,7 +181,7 @@ module PG::TestingHelpers
|
|
181
181
|
require 'pg'
|
182
182
|
stop_existing_postmasters()
|
183
183
|
|
184
|
-
puts "Setting up test database for #{description}
|
184
|
+
puts "Setting up test database for #{description}"
|
185
185
|
@test_pgdata = TEST_DIRECTORY + 'data'
|
186
186
|
@test_pgdata.mkpath
|
187
187
|
|
@@ -218,7 +218,7 @@ module PG::TestingHelpers
|
|
218
218
|
|
219
219
|
conn = PG.connect( @conninfo )
|
220
220
|
conn.set_notice_processor do |message|
|
221
|
-
$stderr.puts( message ) if $DEBUG
|
221
|
+
$stderr.puts( description + ':' + message ) if $DEBUG
|
222
222
|
end
|
223
223
|
|
224
224
|
return conn
|
@@ -227,9 +227,27 @@ module PG::TestingHelpers
|
|
227
227
|
|
228
228
|
def teardown_testing_db( conn )
|
229
229
|
puts "Tearing down test database"
|
230
|
-
|
230
|
+
|
231
|
+
if conn
|
232
|
+
check_for_lingering_connections( conn )
|
233
|
+
conn.finish
|
234
|
+
end
|
235
|
+
|
231
236
|
log_and_run @logfile, 'pg_ctl', '-D', @test_pgdata.to_s, 'stop'
|
232
237
|
end
|
238
|
+
|
239
|
+
|
240
|
+
def check_for_lingering_connections( conn )
|
241
|
+
conn.exec( "SELECT * FROM pg_stat_activity" ) do |res|
|
242
|
+
conns = res.find_all {|row| row['pid'].to_i != conn.backend_pid }
|
243
|
+
unless conns.empty?
|
244
|
+
puts "Lingering connections remain:"
|
245
|
+
conns.each do |row|
|
246
|
+
puts " [%d] {%s} %s -- %s" % row.values_at( 'pid', 'state', 'application_name', 'query' )
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
233
251
|
end
|
234
252
|
|
235
253
|
|
@@ -241,7 +259,13 @@ RSpec.configure do |config|
|
|
241
259
|
|
242
260
|
config.mock_with :rspec
|
243
261
|
config.filter_run_excluding :ruby_19 if ruby_version_vec <= [1,9,1].pack( "N*" )
|
244
|
-
|
262
|
+
if RUBY_PLATFORM =~ /mingw|mswin/
|
263
|
+
config.filter_run_excluding :unix
|
264
|
+
else
|
265
|
+
config.filter_run_excluding :windows
|
266
|
+
end
|
267
|
+
config.filter_run_excluding :socket_io unless
|
268
|
+
PG::Connection.instance_methods.map( &:to_sym ).include?( :socket_io )
|
245
269
|
|
246
270
|
config.filter_run_excluding :postgresql_90 unless
|
247
271
|
PG::Connection.instance_methods.map( &:to_sym ).include?( :escape_literal )
|
data/spec/pg/connection_spec.rb
CHANGED
@@ -20,11 +20,15 @@ require 'pg'
|
|
20
20
|
describe PG::Connection do
|
21
21
|
|
22
22
|
before( :all ) do
|
23
|
-
@conn = setup_testing_db(
|
23
|
+
@conn = setup_testing_db( described_class.name )
|
24
24
|
end
|
25
25
|
|
26
26
|
before( :each ) do
|
27
27
|
@conn.exec( 'BEGIN' ) unless example.metadata[:without_transaction]
|
28
|
+
if PG.respond_to?( :library_version )
|
29
|
+
@conn.exec_params %Q{SET application_name TO '%s'} %
|
30
|
+
[@conn.escape_string(example.description[0,60])]
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
after( :each ) do
|
@@ -123,7 +127,7 @@ describe PG::Connection do
|
|
123
127
|
}.to raise_error( ArgumentError, /extra positional parameter/i )
|
124
128
|
end
|
125
129
|
|
126
|
-
it "can connect asynchronously", :
|
130
|
+
it "can connect asynchronously", :socket_io do
|
127
131
|
tmpconn = described_class.connect_start( @conninfo )
|
128
132
|
tmpconn.should be_a( described_class )
|
129
133
|
socket = tmpconn.socket_io
|
@@ -145,7 +149,7 @@ describe PG::Connection do
|
|
145
149
|
tmpconn.finish
|
146
150
|
end
|
147
151
|
|
148
|
-
it "can connect asynchronously for the duration of a block", :
|
152
|
+
it "can connect asynchronously for the duration of a block", :socket_io do
|
149
153
|
conn = nil
|
150
154
|
|
151
155
|
described_class.connect_start(@conninfo) do |tmpconn|
|
@@ -212,8 +216,7 @@ describe PG::Connection do
|
|
212
216
|
From backend> T
|
213
217
|
}.gsub( /^\t{2}/, '' ).lstrip
|
214
218
|
|
215
|
-
|
216
|
-
it "trace and untrace client-server communication" do
|
219
|
+
it "trace and untrace client-server communication", :unix do
|
217
220
|
# be careful to explicitly close files so that the
|
218
221
|
# directory can be removed and we don't have to wait for
|
219
222
|
# the GC to run.
|
@@ -242,7 +245,6 @@ describe PG::Connection do
|
|
242
245
|
|
243
246
|
trace_data.should == expected_trace_output
|
244
247
|
end
|
245
|
-
end
|
246
248
|
|
247
249
|
it "allows a query to be cancelled" do
|
248
250
|
error = false
|
@@ -255,7 +257,7 @@ describe PG::Connection do
|
|
255
257
|
error.should == true
|
256
258
|
end
|
257
259
|
|
258
|
-
it "automatically rolls back a transaction started with
|
260
|
+
it "automatically rolls back a transaction started with Connection#transaction if an exception " +
|
259
261
|
"is raised" do
|
260
262
|
# abort the per-example transaction so we can test our own
|
261
263
|
@conn.exec( 'ROLLBACK' )
|
@@ -515,7 +517,7 @@ describe PG::Connection do
|
|
515
517
|
end
|
516
518
|
|
517
519
|
|
518
|
-
it "can connect asynchronously", :
|
520
|
+
it "can connect asynchronously", :socket_io do
|
519
521
|
serv = TCPServer.new( '127.0.0.1', 54320 )
|
520
522
|
conn = described_class.connect_start( '127.0.0.1', 54320, "", "", "me", "xxxx", "somedb" )
|
521
523
|
[PG::PGRES_POLLING_WRITING, PG::CONNECTION_OK].should include conn.connect_poll
|
@@ -544,6 +546,23 @@ describe PG::Connection do
|
|
544
546
|
expect { conn.finish }.to raise_error( PG::Error, /connection is closed/i )
|
545
547
|
end
|
546
548
|
|
549
|
+
it "closes the IO fetched from #socket_io when the connection is closed", :without_transaction, :socket_io do
|
550
|
+
conn = PG.connect( @conninfo )
|
551
|
+
io = conn.socket_io
|
552
|
+
conn.finish
|
553
|
+
io.should be_closed()
|
554
|
+
expect { conn.socket_io }.to raise_error( PG::Error, /connection is closed/i )
|
555
|
+
end
|
556
|
+
|
557
|
+
it "closes the IO fetched from #socket_io when the connection is reset", :without_transaction, :socket_io do
|
558
|
+
conn = PG.connect( @conninfo )
|
559
|
+
io = conn.socket_io
|
560
|
+
conn.reset
|
561
|
+
io.should be_closed()
|
562
|
+
conn.socket_io.should_not equal( io )
|
563
|
+
conn.finish
|
564
|
+
end
|
565
|
+
|
547
566
|
|
548
567
|
context "under PostgreSQL 9", :postgresql_90 do
|
549
568
|
|
metadata
CHANGED
@@ -1,25 +1,47 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: -223349668
|
5
5
|
prerelease: 7
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 15
|
9
9
|
- 0
|
10
10
|
- pre
|
11
|
-
-
|
12
|
-
version: 0.15.0.pre.
|
11
|
+
- 454
|
12
|
+
version: 0.15.0.pre.454
|
13
13
|
platform: x86-mingw32
|
14
14
|
authors:
|
15
15
|
- Michael Granger
|
16
16
|
autorequire:
|
17
17
|
bindir: bin
|
18
|
-
cert_chain:
|
18
|
+
cert_chain:
|
19
|
+
- |
|
20
|
+
-----BEGIN CERTIFICATE-----
|
21
|
+
MIIDPDCCAiSgAwIBAgIBADANBgkqhkiG9w0BAQUFADBEMQ0wCwYDVQQDDARsYXJz
|
22
|
+
MR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZImiZPyLGQB
|
23
|
+
GRYCZGUwHhcNMTMwMzExMjAyMjIyWhcNMTQwMzExMjAyMjIyWjBEMQ0wCwYDVQQD
|
24
|
+
DARsYXJzMR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZIm
|
25
|
+
iZPyLGQBGRYCZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZb4Uv
|
26
|
+
RFJfRu/VEWiy3psh2jinETjiuBrL0NeRFGf8H7iU9+gx/DI/FFhfHGLrDeIskrJx
|
27
|
+
YIWDMmEjVO10UUdj7wu4ZhmU++0Cd7Kq9/TyP/shIP3IjqHjVLCnJ3P6f1cl5rxZ
|
28
|
+
gqo+d3BAoDrmPk0rtaf6QopwUw9RBiF8V4HqvpiY+ruJotP5UQDP4/lVOKvA8PI9
|
29
|
+
P0GmVbFBrbc7Zt5h78N3UyOK0u+nvOC23BvyHXzCtcFsXCoEkt+Wwh0RFqVZdnjM
|
30
|
+
LMO2vULHKKHDdX54K/sbVCj9pN9h1aotNzrEyo55zxn0G9PHg/G3P8nMvAXPkUTe
|
31
|
+
brhXrfCwWRvOXA4TAgMBAAGjOTA3MAsGA1UdDwQEAwIEsDAJBgNVHRMEAjAAMB0G
|
32
|
+
A1UdDgQWBBRAHK81igrXodaDj8a8/BIKsaZrETANBgkqhkiG9w0BAQUFAAOCAQEA
|
33
|
+
Iswhcol3ytXthaUH3k5LopZ09viZrZHzAw0QleI3Opl/9QEGJ2BPV9+93iC0OrNL
|
34
|
+
hmnxig6vKK1EeJ5PHXJ8hOI3nTZBrOmQcEXNBqyToP1FHMWZqwZ8wiBPXtiCqDBR
|
35
|
+
ePQ25J9xFNzQ1ItgzNSpx5cs67QNKrx5woocoBHD6kStFbshZPJx4axl3GbUFQd5
|
36
|
+
H//3YdPQOH3jaVeUXhS+pz/gfbx8fhFAtsQ+855A3HO7g2ZRIg/atAp/0MFyn5s5
|
37
|
+
0rq+VHOIPyvxF5khT0mYAcNmZTC8z1yPsqdgwfYNDjsSWwiIRSPUSmJRvfjM8hsW
|
38
|
+
mMFp4kPUHbWOqCp2mz9gCA==
|
39
|
+
-----END CERTIFICATE-----
|
19
40
|
|
20
|
-
date: 2013-
|
41
|
+
date: 2013-03-15 00:00:00 Z
|
21
42
|
dependencies:
|
22
43
|
- !ruby/object:Gem::Dependency
|
44
|
+
name: hoe-mercurial
|
23
45
|
prerelease: false
|
24
46
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
47
|
none: false
|
@@ -33,9 +55,9 @@ dependencies:
|
|
33
55
|
- 0
|
34
56
|
version: 1.4.0
|
35
57
|
type: :development
|
36
|
-
name: hoe-mercurial
|
37
58
|
version_requirements: *id001
|
38
59
|
- !ruby/object:Gem::Dependency
|
60
|
+
name: hoe-highline
|
39
61
|
prerelease: false
|
40
62
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
63
|
none: false
|
@@ -49,9 +71,9 @@ dependencies:
|
|
49
71
|
- 0
|
50
72
|
version: 0.1.0
|
51
73
|
type: :development
|
52
|
-
name: hoe-highline
|
53
74
|
version_requirements: *id002
|
54
75
|
- !ruby/object:Gem::Dependency
|
76
|
+
name: rdoc
|
55
77
|
prerelease: false
|
56
78
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
79
|
none: false
|
@@ -64,52 +86,51 @@ dependencies:
|
|
64
86
|
- 10
|
65
87
|
version: "3.10"
|
66
88
|
type: :development
|
67
|
-
name: rdoc
|
68
89
|
version_requirements: *id003
|
69
90
|
- !ruby/object:Gem::Dependency
|
91
|
+
name: rake-compiler
|
70
92
|
prerelease: false
|
71
93
|
requirement: &id004 !ruby/object:Gem::Requirement
|
72
94
|
none: false
|
73
95
|
requirements:
|
74
96
|
- - ~>
|
75
97
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
98
|
+
hash: 27
|
77
99
|
segments:
|
78
100
|
- 0
|
79
|
-
-
|
80
|
-
version: "0.
|
101
|
+
- 8
|
102
|
+
version: "0.8"
|
81
103
|
type: :development
|
82
|
-
name: rake-compiler
|
83
104
|
version_requirements: *id004
|
84
105
|
- !ruby/object:Gem::Dependency
|
106
|
+
name: hoe-deveiate
|
85
107
|
prerelease: false
|
86
108
|
requirement: &id005 !ruby/object:Gem::Requirement
|
87
109
|
none: false
|
88
110
|
requirements:
|
89
111
|
- - ~>
|
90
112
|
- !ruby/object:Gem::Version
|
91
|
-
hash:
|
113
|
+
hash: 15
|
92
114
|
segments:
|
93
115
|
- 0
|
94
|
-
-
|
95
|
-
version: "0.
|
116
|
+
- 2
|
117
|
+
version: "0.2"
|
96
118
|
type: :development
|
97
|
-
name: hoe-deveiate
|
98
119
|
version_requirements: *id005
|
99
120
|
- !ruby/object:Gem::Dependency
|
121
|
+
name: hoe
|
100
122
|
prerelease: false
|
101
123
|
requirement: &id006 !ruby/object:Gem::Requirement
|
102
124
|
none: false
|
103
125
|
requirements:
|
104
126
|
- - ~>
|
105
127
|
- !ruby/object:Gem::Version
|
106
|
-
hash:
|
128
|
+
hash: 7
|
107
129
|
segments:
|
108
130
|
- 3
|
109
|
-
-
|
110
|
-
version: "3.
|
131
|
+
- 0
|
132
|
+
version: "3.0"
|
111
133
|
type: :development
|
112
|
-
name: hoe
|
113
134
|
version_requirements: *id006
|
114
135
|
description: |-
|
115
136
|
Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/].
|
@@ -147,9 +168,9 @@ extra_rdoc_files:
|
|
147
168
|
- README.rdoc
|
148
169
|
- POSTGRES
|
149
170
|
- LICENSE
|
150
|
-
- ext/gvl_wrappers.c
|
151
|
-
- ext/pg.c
|
152
171
|
- ext/pg_connection.c
|
172
|
+
- ext/pg.c
|
173
|
+
- ext/gvl_wrappers.c
|
153
174
|
- ext/pg_result.c
|
154
175
|
files:
|
155
176
|
- .gemtest
|
@@ -207,6 +228,7 @@ files:
|
|
207
228
|
- spec/pg_spec.rb
|
208
229
|
- lib/1.8/pg_ext.so
|
209
230
|
- lib/1.9/pg_ext.so
|
231
|
+
- lib/2.0/pg_ext.so
|
210
232
|
homepage: https://bitbucket.org/ged/ruby-pg
|
211
233
|
licenses:
|
212
234
|
- BSD
|
@@ -247,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
269
|
requirements: []
|
248
270
|
|
249
271
|
rubyforge_project: pg
|
250
|
-
rubygems_version: 1.8.
|
272
|
+
rubygems_version: 1.8.17
|
251
273
|
signing_key:
|
252
274
|
specification_version: 3
|
253
275
|
summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]
|