pg 0.15.0.pre.432-x86-mingw32 → 0.15.0.pre.454-x86-mingw32
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.
- 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/]
|