pg 0.12.0pre258 → 0.12.0.pre263
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 +3 -0
- data/ChangeLog +1779 -0
- data/Manifest.txt +3 -0
- data/Rakefile +2 -2
- data/ext/extconf.rb +3 -0
- data/ext/pg.c +52 -10
- data/sample/async_copyto.rb +39 -0
- data/sample/copyto.rb +0 -4
- data/sample/cursor.rb +21 -0
- data/spec/lib/helpers.rb +6 -4
- data/spec/m17n_spec.rb +1 -1
- data/spec/pgconn_spec.rb +1 -1
- data/spec/pgresult_spec.rb +29 -3
- metadata +8 -5
- metadata.gz.sig +2 -0
data/Manifest.txt
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
.gemtest
|
2
2
|
BSD
|
3
|
+
ChangeLog
|
3
4
|
Contributors.rdoc
|
4
5
|
GPL
|
5
6
|
History.rdoc
|
@@ -21,8 +22,10 @@ ext/vc/pg_19/pg_19.vcproj
|
|
21
22
|
lib/pg.rb
|
22
23
|
misc/openssl-pg-segfault.rb
|
23
24
|
sample/async_api.rb
|
25
|
+
sample/async_copyto.rb
|
24
26
|
sample/copyfrom.rb
|
25
27
|
sample/copyto.rb
|
28
|
+
sample/cursor.rb
|
26
29
|
sample/losample.rb
|
27
30
|
sample/notify_wait.rb
|
28
31
|
sample/psql.rb
|
data/Rakefile
CHANGED
@@ -29,9 +29,9 @@ TMPDIR = BASEDIR + 'tmp'
|
|
29
29
|
DLEXT = Config::CONFIG['DLEXT']
|
30
30
|
EXT = LIBDIR + "pg_ext.#{DLEXT}"
|
31
31
|
|
32
|
-
|
32
|
+
TEST_DIRECTORY = BASEDIR + "tmp_test_specs"
|
33
33
|
|
34
|
-
CLOBBER.include(
|
34
|
+
CLOBBER.include( TEST_DIRECTORY )
|
35
35
|
CLEAN.include( PKGDIR.to_s, TMPDIR.to_s )
|
36
36
|
|
37
37
|
# Set up Hoe plugins
|
data/ext/extconf.rb
CHANGED
@@ -53,6 +53,9 @@ have_func 'lo_create'
|
|
53
53
|
have_func 'pg_encoding_to_char'
|
54
54
|
have_func 'PQsetClientEncoding'
|
55
55
|
|
56
|
+
have_func 'rb_encdb_alias'
|
57
|
+
have_func 'rb_enc_alias'
|
58
|
+
|
56
59
|
$defs.push( "-DHAVE_ST_NOTIFY_EXTRA" ) if
|
57
60
|
have_struct_member 'struct pgNotify', 'extra', 'libpq-fe.h'
|
58
61
|
|
data/ext/pg.c
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
modified at: Wed Jan 20 16:41:51 1999
|
10
10
|
|
11
11
|
$Author: ged $
|
12
|
-
$Date: 2011/
|
12
|
+
$Date: 2011/12/05 16:59:23 $
|
13
13
|
************************************************/
|
14
14
|
|
15
15
|
#include "pg.h"
|
@@ -3172,12 +3172,12 @@ pgresult_res_status(VALUE self, VALUE status)
|
|
3172
3172
|
|
3173
3173
|
/*
|
3174
3174
|
* call-seq:
|
3175
|
-
* res.
|
3175
|
+
* res.error_message() -> String
|
3176
3176
|
*
|
3177
3177
|
* Returns the error message of the command as a string.
|
3178
3178
|
*/
|
3179
3179
|
static VALUE
|
3180
|
-
|
3180
|
+
pgresult_error_message(VALUE self)
|
3181
3181
|
{
|
3182
3182
|
VALUE ret = rb_tainted_str_new2(PQresultErrorMessage(get_pgresult(self)));
|
3183
3183
|
ASSOCIATE_INDEX(ret, self);
|
@@ -3186,7 +3186,7 @@ pgresult_result_error_message(VALUE self)
|
|
3186
3186
|
|
3187
3187
|
/*
|
3188
3188
|
* call-seq:
|
3189
|
-
* res.
|
3189
|
+
* res.error_field(fieldcode) -> String
|
3190
3190
|
*
|
3191
3191
|
* Returns the individual field of an error.
|
3192
3192
|
*
|
@@ -3203,14 +3203,46 @@ pgresult_result_error_message(VALUE self)
|
|
3203
3203
|
* * +PG_DIAG_SOURCE_FILE+
|
3204
3204
|
* * +PG_DIAG_SOURCE_LINE+
|
3205
3205
|
* * +PG_DIAG_SOURCE_FUNCTION+
|
3206
|
+
*
|
3207
|
+
* An example:
|
3208
|
+
*
|
3209
|
+
* begin
|
3210
|
+
* conn.exec( "SELECT * FROM nonexistant_table" )
|
3211
|
+
* rescue PGError => err
|
3212
|
+
* p [
|
3213
|
+
* result.error_field( PGresult::PG_DIAG_SEVERITY ),
|
3214
|
+
* result.error_field( PGresult::PG_DIAG_SQLSTATE ),
|
3215
|
+
* result.error_field( PGresult::PG_DIAG_MESSAGE_PRIMARY ),
|
3216
|
+
* result.error_field( PGresult::PG_DIAG_MESSAGE_DETAIL ),
|
3217
|
+
* result.error_field( PGresult::PG_DIAG_MESSAGE_HINT ),
|
3218
|
+
* result.error_field( PGresult::PG_DIAG_STATEMENT_POSITION ),
|
3219
|
+
* result.error_field( PGresult::PG_DIAG_INTERNAL_POSITION ),
|
3220
|
+
* result.error_field( PGresult::PG_DIAG_INTERNAL_QUERY ),
|
3221
|
+
* result.error_field( PGresult::PG_DIAG_CONTEXT ),
|
3222
|
+
* result.error_field( PGresult::PG_DIAG_SOURCE_FILE ),
|
3223
|
+
* result.error_field( PGresult::PG_DIAG_SOURCE_LINE ),
|
3224
|
+
* result.error_field( PGresult::PG_DIAG_SOURCE_FUNCTION ),
|
3225
|
+
* ]
|
3226
|
+
* end
|
3227
|
+
*
|
3228
|
+
* Outputs:
|
3229
|
+
*
|
3230
|
+
* ["ERROR", "42P01", "relation \"nonexistant_table\" does not exist", nil, nil,
|
3231
|
+
* "15", nil, nil, nil, "path/to/parse_relation.c", "857", "parserOpenTable"]
|
3206
3232
|
*/
|
3207
3233
|
static VALUE
|
3208
|
-
|
3234
|
+
pgresult_error_field(VALUE self, VALUE field)
|
3209
3235
|
{
|
3210
3236
|
PGresult *result = get_pgresult( self );
|
3211
3237
|
int fieldcode = NUM2INT( field );
|
3212
|
-
|
3213
|
-
|
3238
|
+
char * fieldstr = PQresultErrorField( result, fieldcode );
|
3239
|
+
VALUE ret = Qnil;
|
3240
|
+
|
3241
|
+
if ( fieldstr ) {
|
3242
|
+
ret = rb_tainted_str_new2( fieldstr );
|
3243
|
+
ASSOCIATE_INDEX( ret, self );
|
3244
|
+
}
|
3245
|
+
|
3214
3246
|
return ret;
|
3215
3247
|
}
|
3216
3248
|
|
@@ -3883,7 +3915,15 @@ static int enc_get_index(VALUE val)
|
|
3883
3915
|
return i;
|
3884
3916
|
}
|
3885
3917
|
|
3918
|
+
#ifdef HAVE_RB_ENCDB_ALIAS
|
3919
|
+
# define ENC_ALIAS(name, orig) rb_encdb_alias((name), (orig))
|
3920
|
+
#elif HAVE_RB_ENC_ALIAS
|
3921
|
+
# define ENC_ALIAS(name, orig) rb_enc_alias((name), (orig))
|
3922
|
+
#else
|
3886
3923
|
extern int rb_enc_alias(const char *alias, const char *orig); /* declaration missing in Ruby 1.9.1 */
|
3924
|
+
# define ENC_ALIAS(name, orig) rb_enc_alias((name), (orig))
|
3925
|
+
#endif
|
3926
|
+
|
3887
3927
|
static rb_encoding *
|
3888
3928
|
find_or_create_johab(void)
|
3889
3929
|
{
|
@@ -3897,7 +3937,7 @@ find_or_create_johab(void)
|
|
3897
3937
|
|
3898
3938
|
enc_index = rb_define_dummy_encoding(aliases[0]);
|
3899
3939
|
for (i = 1; i < sizeof(aliases)/sizeof(aliases[0]); ++i) {
|
3900
|
-
|
3940
|
+
ENC_ALIAS(aliases[i], aliases[0]);
|
3901
3941
|
}
|
3902
3942
|
return rb_enc_from_index(enc_index);
|
3903
3943
|
}
|
@@ -4424,8 +4464,10 @@ Init_pg_ext()
|
|
4424
4464
|
/****** PGresult INSTANCE METHODS: libpq ******/
|
4425
4465
|
rb_define_method(rb_cPGresult, "result_status", pgresult_result_status, 0);
|
4426
4466
|
rb_define_method(rb_cPGresult, "res_status", pgresult_res_status, 1);
|
4427
|
-
rb_define_method(rb_cPGresult, "
|
4428
|
-
|
4467
|
+
rb_define_method(rb_cPGresult, "error_message", pgresult_error_message, 0);
|
4468
|
+
rb_define_alias( rb_cPGresult, "result_error_message", "error_message");
|
4469
|
+
rb_define_method(rb_cPGresult, "error_field", pgresult_error_field, 1);
|
4470
|
+
rb_define_alias( rb_cPGresult, "result_error_field", "error_field" );
|
4429
4471
|
rb_define_method(rb_cPGresult, "clear", pgresult_clear, 0);
|
4430
4472
|
rb_define_method(rb_cPGresult, "ntuples", pgresult_ntuples, 0);
|
4431
4473
|
rb_define_alias(rb_cPGresult, "num_tuples", "ntuples");
|
@@ -0,0 +1,39 @@
|
|
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 = PGconn.connect( :dbname => 'test' )
|
10
|
+
conn.setnonblocking( true )
|
11
|
+
|
12
|
+
socket = IO.for_fd( conn.socket )
|
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/copyto.rb
CHANGED
@@ -8,10 +8,6 @@ require 'stringio'
|
|
8
8
|
$stderr.puts "Opening database connection ..."
|
9
9
|
conn = PGconn.connect( :dbname => 'test' )
|
10
10
|
|
11
|
-
### You can test the error case from the database side easily by
|
12
|
-
### changing one of the numbers at the end of one of the above rows to
|
13
|
-
### something non-numeric like "-".
|
14
|
-
|
15
11
|
$stderr.puts "Running COPY command ..."
|
16
12
|
buf = ''
|
17
13
|
conn.transaction do
|
data/sample/cursor.rb
ADDED
@@ -0,0 +1,21 @@
|
|
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 = PGconn.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/spec/lib/helpers.rb
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'rspec'
|
5
|
+
require 'shellwords'
|
5
6
|
|
7
|
+
TEST_DIRECTORY = Pathname.getwd + "tmp_test_specs"
|
6
8
|
|
7
9
|
RSpec.configure do |config|
|
8
10
|
ruby_version_vec = RUBY_VERSION.split('.').map {|c| c.to_i }.pack( "N*" )
|
@@ -139,6 +141,7 @@ module PgTestingHelpers
|
|
139
141
|
else
|
140
142
|
$stdout.reopen( logfh )
|
141
143
|
$stderr.reopen( $stdout )
|
144
|
+
$stderr.puts( ">>> " + cmd.shelljoin )
|
142
145
|
exec( *cmd )
|
143
146
|
$stderr.puts "After the exec()?!??!"
|
144
147
|
exit!
|
@@ -184,8 +187,7 @@ module PgTestingHelpers
|
|
184
187
|
stop_existing_postmasters()
|
185
188
|
|
186
189
|
puts "Setting up test database for #{description} tests"
|
187
|
-
@
|
188
|
-
@test_pgdata = @test_directory + 'data'
|
190
|
+
@test_pgdata = TEST_DIRECTORY + 'data'
|
189
191
|
@test_pgdata.mkpath
|
190
192
|
|
191
193
|
@port = 54321
|
@@ -193,7 +195,7 @@ module PgTestingHelpers
|
|
193
195
|
ENV['PGHOST'] = 'localhost'
|
194
196
|
@conninfo = "host=localhost port=#{@port} dbname=test"
|
195
197
|
|
196
|
-
@logfile =
|
198
|
+
@logfile = TEST_DIRECTORY + 'setup.log'
|
197
199
|
trace "Command output logged to #{@logfile}"
|
198
200
|
|
199
201
|
begin
|
@@ -204,7 +206,7 @@ module PgTestingHelpers
|
|
204
206
|
end
|
205
207
|
|
206
208
|
trace "Starting postgres"
|
207
|
-
log_and_run @logfile, 'pg_ctl', '-w', '-o', "-k #{
|
209
|
+
log_and_run @logfile, 'pg_ctl', '-w', '-o', "-k #{TEST_DIRECTORY.to_s.dump}",
|
208
210
|
'-D', @test_pgdata.to_s, 'start'
|
209
211
|
sleep 2
|
210
212
|
|
data/spec/m17n_spec.rb
CHANGED
@@ -7,7 +7,7 @@ BEGIN {
|
|
7
7
|
|
8
8
|
basedir = Pathname( __FILE__ ).dirname.parent
|
9
9
|
libdir = basedir + 'lib'
|
10
|
-
archlib = libdir +
|
10
|
+
archlib = libdir + RbConfig::CONFIG['sitearch']
|
11
11
|
|
12
12
|
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
13
13
|
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
data/spec/pgconn_spec.rb
CHANGED
@@ -167,7 +167,7 @@ describe PGconn do
|
|
167
167
|
# be careful to explicitly close files so that the
|
168
168
|
# directory can be removed and we don't have to wait for
|
169
169
|
# the GC to run.
|
170
|
-
trace_file =
|
170
|
+
trace_file = TEST_DIRECTORY + "test_trace.out"
|
171
171
|
trace_io = trace_file.open( 'w', 0600 )
|
172
172
|
@conn.trace( trace_io )
|
173
173
|
trace_io.close
|
data/spec/pgresult_spec.rb
CHANGED
@@ -38,7 +38,34 @@ describe PGresult do
|
|
38
38
|
|
39
39
|
it "should insert nil AS NULL and return NULL as nil" do
|
40
40
|
res = @conn.exec("SELECT $1::int AS n", [nil])
|
41
|
-
res[0]['n'].should
|
41
|
+
res[0]['n'].should be_nil()
|
42
|
+
end
|
43
|
+
|
44
|
+
it "encapsulates errors in a PGError object" do
|
45
|
+
exception = nil
|
46
|
+
begin
|
47
|
+
@conn.exec( "SELECT * FROM nonexistant_table" )
|
48
|
+
rescue PGError => err
|
49
|
+
exception = err
|
50
|
+
end
|
51
|
+
|
52
|
+
result = exception.result
|
53
|
+
|
54
|
+
result.should be_a( PGresult )
|
55
|
+
result.error_field( PGresult::PG_DIAG_SEVERITY ).should == 'ERROR'
|
56
|
+
result.error_field( PGresult::PG_DIAG_SQLSTATE ).should == '42P01'
|
57
|
+
result.error_field( PGresult::PG_DIAG_MESSAGE_PRIMARY ).
|
58
|
+
should == 'relation "nonexistant_table" does not exist'
|
59
|
+
result.error_field( PGresult::PG_DIAG_MESSAGE_DETAIL ).should be_nil()
|
60
|
+
result.error_field( PGresult::PG_DIAG_MESSAGE_HINT ).should be_nil()
|
61
|
+
result.error_field( PGresult::PG_DIAG_STATEMENT_POSITION ).should == '15'
|
62
|
+
result.error_field( PGresult::PG_DIAG_INTERNAL_POSITION ).should be_nil()
|
63
|
+
result.error_field( PGresult::PG_DIAG_INTERNAL_QUERY ).should be_nil()
|
64
|
+
result.error_field( PGresult::PG_DIAG_CONTEXT ).should be_nil()
|
65
|
+
result.error_field( PGresult::PG_DIAG_SOURCE_FILE ).should =~ /parse_relation\.c$/
|
66
|
+
result.error_field( PGresult::PG_DIAG_SOURCE_LINE ).should == '857'
|
67
|
+
result.error_field( PGresult::PG_DIAG_SOURCE_FUNCTION ).should == 'parserOpenTable'
|
68
|
+
|
42
69
|
end
|
43
70
|
|
44
71
|
it "should detect division by zero as SQLSTATE 22012" do
|
@@ -46,8 +73,7 @@ describe PGresult do
|
|
46
73
|
begin
|
47
74
|
res = @conn.exec("SELECT 1/0")
|
48
75
|
rescue PGError => e
|
49
|
-
sqlstate = e.result.result_error_field(
|
50
|
-
PGresult::PG_DIAG_SQLSTATE).to_i
|
76
|
+
sqlstate = e.result.result_error_field( PGresult::PG_DIAG_SQLSTATE ).to_i
|
51
77
|
end
|
52
78
|
sqlstate.should == 22012
|
53
79
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1923832423
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 12
|
9
9
|
- 0
|
10
10
|
- pre
|
11
|
-
-
|
12
|
-
version: 0.12.
|
11
|
+
- 263
|
12
|
+
version: 0.12.0.pre263
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Jeff Davis
|
@@ -38,7 +38,7 @@ cert_chain:
|
|
38
38
|
cmlhXe46pZNJgWKbxZah85jIjx95hR8vOI+NAM5iH9kOqK13DrxacTKPhqj5PjwF
|
39
39
|
-----END CERTIFICATE-----
|
40
40
|
|
41
|
-
date: 2011-
|
41
|
+
date: 2011-12-05 00:00:00 Z
|
42
42
|
dependencies:
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: rake-compiler
|
@@ -144,6 +144,7 @@ extra_rdoc_files:
|
|
144
144
|
files:
|
145
145
|
- .gemtest
|
146
146
|
- BSD
|
147
|
+
- ChangeLog
|
147
148
|
- Contributors.rdoc
|
148
149
|
- GPL
|
149
150
|
- History.rdoc
|
@@ -165,8 +166,10 @@ files:
|
|
165
166
|
- lib/pg.rb
|
166
167
|
- misc/openssl-pg-segfault.rb
|
167
168
|
- sample/async_api.rb
|
169
|
+
- sample/async_copyto.rb
|
168
170
|
- sample/copyfrom.rb
|
169
171
|
- sample/copyto.rb
|
172
|
+
- sample/cursor.rb
|
170
173
|
- sample/losample.rb
|
171
174
|
- sample/notify_wait.rb
|
172
175
|
- sample/psql.rb
|
@@ -215,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
218
|
requirements: []
|
216
219
|
|
217
220
|
rubyforge_project: pg
|
218
|
-
rubygems_version: 1.8.
|
221
|
+
rubygems_version: 1.8.11
|
219
222
|
signing_key:
|
220
223
|
specification_version: 3
|
221
224
|
summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]
|
metadata.gz.sig
ADDED