pgsql 1.5.1 → 1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5224c8b4aff8e7d39e4ea3b4bf14ab733d88653caab96507376db480777aaa86
4
- data.tar.gz: 717901a45ef2f837911f1aba2cd4ba716354b5a299be9f10bc0684ffd8cda75e
3
+ metadata.gz: 2519cf85dd607a31191b7992cc99a93c31fb0b1103a38462f28cd77081599f0c
4
+ data.tar.gz: 026e108f08ffa63454f29504120c04f8fe8b3b1ffb664bd4626e7ca9f98f078a
5
5
  SHA512:
6
- metadata.gz: aedc9283cc1bf0179cfedc2f145403aff24fe4267286b4c31566df795d359109799df65010f978271546fa657508d8f3821133a295cf9f8345ce6e23414bbce7
7
- data.tar.gz: 2aaf604cdaf9c72ada34eb0cb790235000b4b798d993536980855ffbfb62683aa499cfbaf7701bad8a5626ebd2749de05aa14159ead7ded3d2bb26eb54bfaa7f
6
+ metadata.gz: 608f44789a6b5c009558c75b1d37f71fd2b86d283c2b78bf361d76bf3d7bb37065b6426a26f7ecb7d97829b3b31e4e7cf4a0f53453e11fc7327a914d2d65ca8c
7
+ data.tar.gz: 5e4e1fe2084fb5ba67646128d145de12840ad66c3fd54e0b22e65ea150c0d16444fc157ff19f61864fe048dd1eca4b3d7731ca8411376708ac81a2c7114b9774
data/lib/Rakefile CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  require "autorake"
6
6
 
7
- c = compiler "-O2", "-fPIC"
7
+ c = compiler "-O2", "-fPIC", "-Wall"
8
8
  l = linker "-shared"
9
9
 
10
10
  rule ".o" => ".c" do |t|
@@ -17,7 +17,7 @@ DLs = {
17
17
  }
18
18
 
19
19
  DLs.each { |k,v|
20
- task k => v do |t|
20
+ file k => v do |t|
21
21
  l.cc t.name, t.prerequisites
22
22
  end
23
23
  }
data/lib/conn.c CHANGED
@@ -26,12 +26,12 @@ extern VALUE pgconn_mkstring( struct pgconn_data *ptr, const char *str);
26
26
  extern VALUE pgconn_mkstringn( struct pgconn_data *ptr, const char *str, int len);
27
27
  static VALUE pgconn_alloc( VALUE cls);
28
28
  static VALUE pgconn_s_connect( int argc, VALUE *argv, VALUE cls);
29
- static VALUE pgconn_s_parse( VALUE cls, VALUE str);
30
29
  static VALUE pgconn_init( int argc, VALUE *argv, VALUE self);
31
30
  static int set_connect_params( st_data_t key, st_data_t val, st_data_t args);
32
- static void connstr_to_hash( VALUE params, VALUE str);
33
- static void connstr_passwd( VALUE self, VALUE params);
34
- static VALUE connstr_getparam( VALUE yielded, VALUE params);
31
+ static VALUE connstr_sym_dbname( void);
32
+ static VALUE connstr_sym_password( void);
33
+ static void connstr_passwd( VALUE self, VALUE orig_params, VALUE *params);
34
+ static VALUE connstr_getparam( RB_BLOCK_CALL_FUNC_ARGLIST( yielded, params));
35
35
 
36
36
  static VALUE pgconn_close( VALUE self);
37
37
  static VALUE pgconn_reset( VALUE self);
@@ -71,6 +71,10 @@ VALUE rb_cPgConn;
71
71
  static VALUE rb_ePgConnFailed;
72
72
  static VALUE rb_ePgConnInvalid;
73
73
 
74
+ static VALUE sym_dbname = Qundef;
75
+ static VALUE sym_password = Qundef;
76
+
77
+ static ID id_to_s;
74
78
 
75
79
 
76
80
  void
@@ -221,24 +225,6 @@ pgconn_s_connect( int argc, VALUE *argv, VALUE cls)
221
225
  rb_ensure( rb_yield, pgconn, pgconn_close, pgconn) : pgconn;
222
226
  }
223
227
 
224
- /*
225
- * call-seq:
226
- * Pg::Conn.parse( str) -> hash
227
- *
228
- * Parse a connection string and return a hash with keys <code>:dbname</code>,
229
- * <code>:user</code>, <code>:host</code>, etc.
230
- *
231
- */
232
- VALUE
233
- pgconn_s_parse( VALUE cls, VALUE str)
234
- {
235
- VALUE params;
236
-
237
- params = rb_hash_new();
238
- connstr_to_hash( params, str);
239
- return params;
240
- }
241
-
242
228
 
243
229
  /*
244
230
  * Document-method: Pg::Conn.new
@@ -252,23 +238,39 @@ pgconn_s_parse( VALUE cls, VALUE str)
252
238
  *
253
239
  * c = Pg::Conn.new :dbname => "movies", :host => "jupiter", ...
254
240
  *
255
- * The most common parameters may be given in a URL-like
256
- * connection string:
241
+ * If the +str+ argument is given but no further parameters,
242
+ * the PQconnectdb() (not PQconnectdbParams()) function will be called.
243
+ * If further arguments are present, the +str+ argument will be made into
244
+ * the "dbname" parameter, but without overwriting an existing one.
245
+ *
246
+ * The "dbname" parameter may be a +conninfo+ string as described in the
247
+ * PostgreSQL documentation:
257
248
  *
258
- * "user:password@host:port/dbname"
249
+ * c = Pg::Conn.new "postgresql://user:password@host:port/dbname"
250
+ * c = Pg::Conn.new "postgres://user:password@host:port/dbname"
251
+ * c = Pg::Conn.new "dbname=... host=... user=..."
259
252
  *
260
- * Any of these parts may be omitted. If there is no slash, the part after the
261
- * @ sign will be read as database name.
253
+ * The password may be specified as an extra parameter:
254
+ *
255
+ * c = Pg::Conn.new "postgresql://user@host/dbname", password: "verysecret"
262
256
  *
263
257
  * If the password is the empty string, and there is either an instance method
264
258
  * or a class method <code>password?</code>, that method will be asked. This
265
259
  * method may ask <code>yield :user</code> or <code>yield :dbname</code> and so
266
260
  * on to get the connection parameters.
267
261
  *
262
+ * class Pg::Conn
263
+ * def password?
264
+ * "tercesyrev".reverse
265
+ * end
266
+ * end
267
+ * c = Pg::Conn.new "postgresql://user@host/dbname", password: ""
268
+ *
268
269
  * See the PostgreSQL documentation for a full list:
269
270
  * [http://www.postgresql.org/docs/current/interactive/libpq-connect.html#LIBPQ-PQCONNECTDBPARAMS]
270
271
  *
271
272
  * On failure, a +Pg::Error+ exception will be raised.
273
+ *
272
274
  */
273
275
  VALUE
274
276
  pgconn_init( int argc, VALUE *argv, VALUE self)
@@ -280,32 +282,43 @@ pgconn_init( int argc, VALUE *argv, VALUE self)
280
282
  struct pgconn_data *c;
281
283
 
282
284
  if (rb_scan_args( argc, argv, "02", &str, &params) < 2)
283
- if (TYPE( str) != T_STRING) {
285
+ if (TYPE( str) == T_HASH) {
284
286
  params = str;
285
287
  str = Qnil;
286
288
  }
287
- if (NIL_P( params))
288
- params = rb_hash_new();
289
- else if (TYPE( params) != T_HASH)
290
- params = rb_convert_type( params, T_HASH, "Hash", "to_hash");
291
- else
292
- params = rb_obj_dup( params);
293
- if (!NIL_P( str))
294
- connstr_to_hash( params, str);
295
- connstr_passwd( self, params);
296
289
 
297
290
  Data_Get_Struct( self, struct pgconn_data, c);
298
291
 
299
- l = RHASH_SIZE( params) + 1;
300
- keywords = (const char **) ALLOCA_N( char *, l);
301
- values = (const char **) ALLOCA_N( char *, l);
302
- ptrs[ 0] = keywords;
303
- ptrs[ 1] = values;
304
- ptrs[ 2] = (const char **) c;
305
- st_foreach( RHASH_TBL( params), &set_connect_params, (st_data_t) ptrs);
306
- *(ptrs[ 0]) = *(ptrs[ 1]) = NULL;
307
-
308
- c->conn = PQconnectdbParams( keywords, values, 1);
292
+ if (NIL_P( params)) {
293
+ c->conn = PQconnectdb( RSTRING_PTR( rb_funcall( str, id_to_s, 0)));
294
+ } else {
295
+ int expand_dbname;
296
+ VALUE orig_params = params;
297
+
298
+ if (TYPE( params) != T_HASH)
299
+ params = rb_convert_type( params, T_HASH, "Hash", "to_hash");
300
+
301
+ if (!NIL_P( str) && NIL_P( rb_hash_aref( params, connstr_sym_dbname()))) {
302
+ if (params == orig_params)
303
+ params = rb_obj_dup( params);
304
+ rb_hash_aset( params, sym_dbname, str);
305
+ expand_dbname = 1;
306
+ } else
307
+ expand_dbname = 0;
308
+
309
+ connstr_passwd( self, orig_params, &params);
310
+
311
+ l = RHASH_SIZE( params) + 1;
312
+ keywords = (const char **) ALLOCA_N( char *, l);
313
+ values = (const char **) ALLOCA_N( char *, l);
314
+ ptrs[ 0] = keywords;
315
+ ptrs[ 1] = values;
316
+ ptrs[ 2] = (const char **) c;
317
+ st_foreach( RHASH_TBL( params), &set_connect_params, (st_data_t) ptrs);
318
+ *(ptrs[ 0]) = *(ptrs[ 1]) = NULL;
319
+
320
+ c->conn = PQconnectdbParams( keywords, values, expand_dbname);
321
+ }
309
322
  if (PQstatus( c->conn) == CONNECTION_BAD)
310
323
  rb_exc_raise( pgconnfailederror_new( c, params));
311
324
 
@@ -331,50 +344,29 @@ set_connect_params( st_data_t key, st_data_t val, st_data_t args)
331
344
  return ST_CONTINUE;
332
345
  }
333
346
 
334
- static const char re_connstr[] =
335
- "\\A"
336
- "(?:(.*?)(?::(.*))?@)?" /* user:passwd@ */
337
- "(?:(.*?)(?::(\\d+))?/)?(?:(.+))?" /* host:port/dbname */
338
- "\\z"
339
- ;
340
-
341
- #define KEY_USER "user"
342
- #define KEY_PASSWORD "password"
343
- #define KEY_HOST "host"
344
- #define KEY_PORT "port"
345
- #define KEY_DBNAME "dbname"
347
+ VALUE
348
+ connstr_sym_dbname( void)
349
+ {
350
+ if (sym_dbname == Qundef)
351
+ sym_dbname = ID2SYM( rb_intern( "dbname"));
352
+ return sym_dbname;
353
+ }
346
354
 
347
- void
348
- connstr_to_hash( VALUE params, VALUE str)
349
- {
350
- VALUE re, match, k, m;
351
-
352
- re = rb_reg_new( re_connstr, sizeof re_connstr - 1, 0);
353
- if (RTEST( rb_reg_match( re, str))) {
354
- match = rb_backref_get();
355
- #define ADD_TO_RES( key, n) \
356
- k = ID2SYM( rb_intern( key)); m = rb_reg_nth_match( n, match); \
357
- if (NIL_P( rb_hash_aref( params, k)) && !NIL_P(m)) \
358
- rb_hash_aset( params, k, m)
359
- ADD_TO_RES( KEY_USER, 1);
360
- ADD_TO_RES( KEY_PASSWORD, 2);
361
- ADD_TO_RES( KEY_HOST, 3);
362
- ADD_TO_RES( KEY_PORT, 4);
363
- ADD_TO_RES( KEY_DBNAME, 5);
364
- #undef ADD_TO_RES
365
- } else
366
- rb_raise( rb_eArgError, "Invalid connection: %s", RSTRING_PTR( str));
355
+ VALUE
356
+ connstr_sym_password( void)
357
+ {
358
+ if (sym_password == Qundef)
359
+ sym_password = ID2SYM( rb_intern( "password"));
360
+ return sym_password;
367
361
  }
368
362
 
363
+
369
364
  void
370
- connstr_passwd( VALUE self, VALUE params)
365
+ connstr_passwd( VALUE self, VALUE orig_params, VALUE *params)
371
366
  {
372
- static VALUE sym_password = Qundef;
373
367
  VALUE pw;
374
368
 
375
- if (sym_password == Qundef)
376
- sym_password = ID2SYM( rb_intern( KEY_PASSWORD));
377
- pw = rb_hash_aref( params, sym_password);
369
+ pw = rb_hash_aref( *params, connstr_sym_password());
378
370
  if (TYPE( pw) == T_STRING && RSTRING_LEN( pw) == 0) {
379
371
  static ID id_password_q = 0;
380
372
  VALUE pwobj;
@@ -386,14 +378,18 @@ connstr_passwd( VALUE self, VALUE params)
386
378
  pwobj = self;
387
379
  if (rb_respond_to( CLASS_OF( self), id_password_q))
388
380
  pwobj = CLASS_OF( self);
389
- if (pwobj != Qundef)
390
- rb_hash_aset( params, sym_password,
381
+ if (pwobj != Qundef) {
382
+ if (*params == orig_params)
383
+ *params = rb_obj_dup( *params);
384
+ rb_hash_aset( *params, sym_password,
391
385
  rb_block_call( pwobj, id_password_q, 0, NULL,
392
- &connstr_getparam, params));
386
+ &connstr_getparam, *params));
387
+ }
393
388
  }
394
389
  }
395
390
 
396
- VALUE connstr_getparam( VALUE yielded, VALUE params)
391
+ VALUE
392
+ connstr_getparam( RB_BLOCK_CALL_FUNC_ARGLIST( yielded, params))
397
393
  {
398
394
  return rb_hash_aref( params, yielded);
399
395
  }
@@ -865,7 +861,6 @@ Init_pgsql_conn( void)
865
861
  rb_define_alloc_func( rb_cPgConn, pgconn_alloc);
866
862
  rb_define_singleton_method( rb_cPgConn, "connect", pgconn_s_connect, -1);
867
863
  rb_define_alias( rb_singleton_class( rb_cPgConn), "open", "connect");
868
- rb_define_singleton_method( rb_cPgConn, "parse", pgconn_s_parse, 1);
869
864
  rb_define_method( rb_cPgConn, "initialize", &pgconn_init, -1);
870
865
  rb_define_method( rb_cPgConn, "close", &pgconn_close, 0);
871
866
  rb_define_alias( rb_cPgConn, "finish", "close");
@@ -905,6 +900,8 @@ Init_pgsql_conn( void)
905
900
 
906
901
  rb_define_method( rb_cPgConn, "on_notice", &pgconn_on_notice, 0);
907
902
 
903
+ id_to_s = rb_intern( "to_s");
904
+
908
905
  Init_pgsql_conn_quote();
909
906
  Init_pgsql_conn_exec();
910
907
  }
data/lib/conn_exec.c CHANGED
@@ -8,12 +8,7 @@
8
8
  #include "conn_quote.h"
9
9
  #include "result.h"
10
10
 
11
-
12
- #ifdef HAVE_FUNC_RB_ERRINFO
13
- #define RB_ERRINFO (rb_errinfo())
14
- #else
15
- #define RB_ERRINFO ruby_errinfo
16
- #endif
11
+ #include <math.h>
17
12
 
18
13
 
19
14
  static void pg_raise_connexec( struct pgconn_data *c);
@@ -26,22 +21,23 @@ static void pg_parse_parameters( int argc, VALUE *argv, VALUE *cmd, VALUE *par);
26
21
 
27
22
  static VALUE pgconn_exec( int argc, VALUE *argv, VALUE obj);
28
23
  static VALUE pgconn_send( int argc, VALUE *argv, VALUE obj);
29
- static VALUE pgconn_fetch( VALUE obj);
24
+ static VALUE pgconn_fetch( int argc, VALUE *argv, VALUE conn);
25
+ static void wait_for_pgsocket( PGconn *c, VALUE to);
30
26
  static VALUE yield_or_return_result( VALUE res);
31
27
  static VALUE clear_resultqueue( VALUE self);
32
28
 
33
29
  static VALUE pgconn_query( int argc, VALUE *argv, VALUE self);
34
- static VALUE pgconn_select_one( int argc, VALUE *argv, VALUE self);
30
+ static VALUE pgconn_select_row( int argc, VALUE *argv, VALUE self);
35
31
  static VALUE pgconn_select_value( int argc, VALUE *argv, VALUE self);
36
32
  static VALUE pgconn_select_values( int argc, VALUE *argv, VALUE self);
37
33
  static VALUE pgconn_get_notify( VALUE self);
38
34
 
39
35
  static VALUE pgconn_transaction( int argc, VALUE *argv, VALUE self);
40
- static VALUE rollback_transaction( VALUE self);
36
+ static VALUE rollback_transaction( VALUE conn, VALUE err);
41
37
  static VALUE commit_transaction( VALUE self);
42
- static VALUE yield_transaction( VALUE self);
38
+ static VALUE yield_transaction( VALUE conn);
43
39
  static VALUE pgconn_subtransaction( int argc, VALUE *argv, VALUE self);
44
- static VALUE rollback_subtransaction( VALUE ary);
40
+ static VALUE rollback_subtransaction( VALUE ary, VALUE err);
45
41
  static VALUE release_subtransaction( VALUE ary);
46
42
  static VALUE yield_subtransaction( VALUE ary);
47
43
  static VALUE pgconn_transaction_status( VALUE self);
@@ -60,6 +56,7 @@ static VALUE backup_end( VALUE conn);
60
56
 
61
57
 
62
58
  static VALUE rb_ePgConnExec;
59
+ static VALUE rb_ePgConnTimeout;
63
60
  static VALUE rb_ePgConnTrans;
64
61
  static VALUE rb_ePgConnCopy;
65
62
 
@@ -79,8 +76,7 @@ pg_statement_exec( VALUE conn, VALUE cmd, VALUE par)
79
76
  struct pgconn_data *c;
80
77
  PGresult *result;
81
78
 
82
- Data_Get_Struct( conn, struct pgconn_data, c);
83
- pg_check_conninvalid( c);
79
+ c = get_pgconn( conn);
84
80
  if (NIL_P( par))
85
81
  result = PQexec( c->conn, pgconn_destring( c, cmd, NULL));
86
82
  else {
@@ -104,8 +100,7 @@ pg_statement_send( VALUE conn, VALUE cmd, VALUE par)
104
100
  struct pgconn_data *c;
105
101
  int res;
106
102
 
107
- Data_Get_Struct( conn, struct pgconn_data, c);
108
- pg_check_conninvalid( c);
103
+ c = get_pgconn( conn);
109
104
  if (NIL_P( par))
110
105
  res = PQsendQuery( c->conn, pgconn_destring( c, cmd, NULL));
111
106
  else {
@@ -119,6 +114,7 @@ pg_statement_send( VALUE conn, VALUE cmd, VALUE par)
119
114
  }
120
115
  if (res <= 0)
121
116
  pg_raise_connexec( c);
117
+ PQsetSingleRowMode( c->conn);
122
118
  }
123
119
 
124
120
  char **
@@ -130,7 +126,7 @@ params_to_strings( VALUE conn, VALUE params, int *len)
130
126
  char **values, **v;
131
127
  char *a;
132
128
 
133
- Data_Get_Struct( conn, struct pgconn_data, c);
129
+ c = get_pgconn( conn);
134
130
  ptr = RARRAY_PTR( params);
135
131
  *len = l = RARRAY_LEN( params);
136
132
  values = ALLOC_N( char *, l);
@@ -166,8 +162,6 @@ free_strings( char **strs, int len)
166
162
  void
167
163
  pg_parse_parameters( int argc, VALUE *argv, VALUE *cmd, VALUE *par)
168
164
  {
169
- int len;
170
-
171
165
  rb_scan_args( argc, argv, "1*", cmd, par);
172
166
  StringValue( *cmd);
173
167
  if (RARRAY_LEN( *par) <= 0)
@@ -204,18 +198,29 @@ pgconn_exec( int argc, VALUE *argv, VALUE self)
204
198
  * Sends an asynchronous SQL query request specified by +sql+ to the
205
199
  * PostgreSQL server.
206
200
  *
201
+ * This sets the query into single row mode. You have to call +Pg::Conn#fetch+
202
+ * what will yield one-row results. You may cancel the delivery by breaking
203
+ * the loop.
204
+ *
207
205
  * Use Pg::Conn#fetch to fetch the results after you waited for data.
208
206
  *
209
207
  * Pg::Conn.connect do |conn|
210
208
  * conn.send "SELECT pg_sleep(3), * FROM t;" do
211
- * ins = [ conn.socket]
212
- * loop do
213
- * r = IO.select ins, nil, nil, 0.5
214
- * break if r
215
- * puts Time.now
216
- * end
217
- * res = conn.fetch
218
- * res.each { |w| puts w.inspect }
209
+ * conn.fetch { |res|
210
+ * puts res.first.inspect
211
+ * break if (rand 3) < 1
212
+ * }
213
+ * end
214
+ * end
215
+ *
216
+ * Multiple select statements will not be separated by an empty result
217
+ * or something similar. Query twice if you want to separate them.
218
+ *
219
+ * Pg::Conn.connect do |conn|
220
+ * conn.send "SELECT 33; SELECT 'foo';" do
221
+ * conn.fetch { |res|
222
+ * puts res.first.inspect
223
+ * }
219
224
  * end
220
225
  * end
221
226
  */
@@ -231,8 +236,7 @@ pgconn_send( int argc, VALUE *argv, VALUE self)
231
236
 
232
237
  /*
233
238
  * call-seq:
234
- * conn.fetch() -> result or nil
235
- * conn.fetch() { |result| ... } -> obj
239
+ * conn.fetch( timeout = nil) { |result| ... } -> obj
236
240
  *
237
241
  * Fetches the results of the previous Pg::Conn#send call.
238
242
  * See there for an example.
@@ -240,42 +244,105 @@ pgconn_send( int argc, VALUE *argv, VALUE self)
240
244
  * The result will be +nil+ if there are no more results.
241
245
  */
242
246
  VALUE
243
- pgconn_fetch( VALUE self)
247
+ pgconn_fetch( int argc, VALUE *argv, VALUE conn)
244
248
  {
245
249
  struct pgconn_data *c;
246
250
  PGresult *result;
247
- VALUE res;
251
+ VALUE to;
252
+
253
+ rb_scan_args( argc, argv, "01", &to);
248
254
 
249
- Data_Get_Struct( self, struct pgconn_data, c);
250
- pg_check_conninvalid( c);
255
+ c = get_pgconn( conn);
256
+ wait_for_pgsocket( c->conn, to);
251
257
  if (PQconsumeInput( c->conn) == 0)
252
258
  pg_raise_connexec( c);
253
- if (PQisBusy( c->conn) > 0)
254
- return Qnil;
255
- result = PQgetResult( c->conn);
256
- return result == NULL ? Qnil :
257
- yield_or_return_result( pgresult_new( result, c, Qnil, Qnil));
259
+ if (PQisBusy( c->conn) == 0)
260
+ while ((result = PQgetResult( c->conn)) != NULL) {
261
+ if (PQntuples( result) == 0)
262
+ PQclear( result);
263
+ else
264
+ rb_yield( pgresult_new( result, c, Qnil, Qnil));
265
+ }
266
+ return Qnil;
267
+ }
268
+
269
+ void
270
+ wait_for_pgsocket( PGconn *c, VALUE to)
271
+ {
272
+ int fd;
273
+ fd_set readset;
274
+ struct timeval tv, *ptv;
275
+
276
+ fd = PQsocket( c);
277
+
278
+ FD_ZERO(&readset);
279
+ FD_SET(fd, &readset);
280
+
281
+ ptv = NULL;
282
+ if (!NIL_P( to)) {
283
+ int type = TYPE( to);
284
+ if (type == T_FIXNUM) {
285
+ tv.tv_sec = FIX2LONG( to);
286
+ tv.tv_usec = 0;
287
+ } else {
288
+ double x;
289
+ switch (type) {
290
+ case T_FLOAT:
291
+ x = RFLOAT_VALUE( to);
292
+ break;
293
+ case T_BIGNUM:
294
+ x = rb_big2dbl( to);
295
+ break;
296
+ case T_RATIONAL:
297
+ x = rb_num2dbl( to);
298
+ break;
299
+ default:
300
+ x = RFLOAT_VALUE( rb_funcall( to, rb_intern( "to_f"), 0));
301
+ break;
302
+ }
303
+ tv.tv_sec = floor( x);
304
+ tv.tv_usec = round( (x-tv.tv_sec)*1000000);
305
+ }
306
+ ptv = &tv;
307
+ }
308
+
309
+ if (select( fd+1, &readset, NULL, NULL, ptv) < 0 || !FD_ISSET( fd, &readset))
310
+ rb_raise( rb_ePgConnTimeout, "Wait for data timed out.");
258
311
  }
259
312
 
260
313
  VALUE
261
314
  yield_or_return_result( VALUE result)
262
315
  {
263
- struct pgresult_data *r;
264
-
265
- Data_Get_Struct( result, struct pgresult_data, r);
266
316
  return rb_block_given_p() ?
267
317
  rb_ensure( rb_yield, result, pgresult_clear, result) : result;
268
318
  }
269
319
 
270
320
  VALUE
271
- clear_resultqueue( VALUE self)
321
+ clear_resultqueue( VALUE conn)
272
322
  {
273
323
  struct pgconn_data *c;
274
324
  PGresult *result;
325
+ int cancelled;
275
326
 
276
- Data_Get_Struct( self, struct pgconn_data, c);
277
- while ((result = PQgetResult( c->conn)) != NULL)
327
+ c = get_pgconn( conn);
328
+ cancelled = 0;
329
+ while ((result = PQgetResult( c->conn)) != NULL) {
278
330
  PQclear( result);
331
+ if (!cancelled) {
332
+ char errbuf[ 256];
333
+ PGcancel *cancel;
334
+ int ret;
335
+
336
+ cancel = PQgetCancel( c->conn);
337
+ if (cancel == NULL)
338
+ rb_raise( rb_ePgConnTrans, "Could not get cancel object.");
339
+ ret = PQcancel( cancel, errbuf, sizeof errbuf);
340
+ PQfreeCancel( cancel);
341
+ if (ret == 0)
342
+ rb_raise( rb_ePgConnTrans, "Cancel of sent query failed: %s", errbuf);
343
+ cancelled = 1;
344
+ }
345
+ }
279
346
  return Qnil;
280
347
  }
281
348
 
@@ -316,13 +383,13 @@ pgconn_query( int argc, VALUE *argv, VALUE self)
316
383
 
317
384
  /*
318
385
  * call-seq:
319
- * conn.select_one( query, *bind_values)
386
+ * conn.select_row( query, *bind_values)
320
387
  *
321
388
  * Return the first row of the query results.
322
389
  * Equivalent to <code>conn.query( query, *bind_values).first</code>.
323
390
  */
324
391
  VALUE
325
- pgconn_select_one( int argc, VALUE *argv, VALUE self)
392
+ pgconn_select_row( int argc, VALUE *argv, VALUE self)
326
393
  {
327
394
  VALUE cmd, par;
328
395
  VALUE res;
@@ -340,7 +407,7 @@ pgconn_select_one( int argc, VALUE *argv, VALUE self)
340
407
  * conn.select_value( query, *bind_values)
341
408
  *
342
409
  * Return the first value of the first row of the query results.
343
- * Equivalent to conn.query( query, *bind_values).first.first
410
+ * Equivalent to conn.query( query, *bind_values).first&.first
344
411
  */
345
412
  VALUE
346
413
  pgconn_select_value( int argc, VALUE *argv, VALUE self)
@@ -361,6 +428,7 @@ pgconn_select_value( int argc, VALUE *argv, VALUE self)
361
428
  * call-seq:
362
429
  * conn.select_values( query, *bind_values)
363
430
  *
431
+ * Return the all values over all rows as one array.
364
432
  * Equivalent to conn.query( query, *bind_values).flatten
365
433
  */
366
434
  VALUE
@@ -399,14 +467,14 @@ pgconn_select_values( int argc, VALUE *argv, VALUE self)
399
467
  * Returns a notifier. If there is no unprocessed notifier, it returns +nil+.
400
468
  */
401
469
  VALUE
402
- pgconn_get_notify( VALUE self)
470
+ pgconn_get_notify( VALUE conn)
403
471
  {
404
472
  struct pgconn_data *c;
405
473
  PGnotify *notify;
406
474
  VALUE rel, pid, ext;
407
475
  VALUE ret;
408
476
 
409
- Data_Get_Struct( self, struct pgconn_data, c);
477
+ c = get_pgconn( conn);
410
478
  if (PQconsumeInput( c->conn) == 0)
411
479
  pg_raise_connexec( c);
412
480
  notify = PQnotifies( c->conn);
@@ -435,7 +503,7 @@ pgconn_get_notify( VALUE self)
435
503
  *
436
504
  */
437
505
  VALUE
438
- pgconn_transaction( int argc, VALUE *argv, VALUE self)
506
+ pgconn_transaction( int argc, VALUE *argv, VALUE conn)
439
507
  {
440
508
  struct pgconn_data *c;
441
509
  VALUE ser, ro;
@@ -443,50 +511,50 @@ pgconn_transaction( int argc, VALUE *argv, VALUE self)
443
511
  int p;
444
512
 
445
513
  rb_scan_args( argc, argv, "02", &ser, &ro);
446
- cmd = rb_str_buf_new2( "begin");
514
+ cmd = rb_str_buf_new2( "BEGIN");
447
515
  p = 0;
448
516
  if (!NIL_P( ser)) {
449
- rb_str_buf_cat2( cmd, " isolation level ");
450
- rb_str_buf_cat2( cmd, RTEST(ser) ? "serializable" : "read committed");
517
+ rb_str_buf_cat2( cmd, " ISOLATION LEVEL ");
518
+ rb_str_buf_cat2( cmd, RTEST(ser) ? "SERIALIZABLE" : "READ COMMITTED");
451
519
  p++;
452
520
  }
453
521
  if (!NIL_P( ro)) {
454
522
  if (p) rb_str_buf_cat2( cmd, ",");
455
- rb_str_buf_cat2( cmd, " read ");
456
- rb_str_buf_cat2( cmd, (RTEST(ro) ? "only" : "write"));
523
+ rb_str_buf_cat2( cmd, " READ ");
524
+ rb_str_buf_cat2( cmd, (RTEST(ro) ? "ONLY" : "WRITE"));
457
525
  }
458
526
  rb_str_buf_cat2( cmd, ";");
459
527
 
460
- Data_Get_Struct( self, struct pgconn_data, c);
528
+ c = get_pgconn( conn);
461
529
  if (PQtransactionStatus( c->conn) > PQTRANS_IDLE)
462
530
  rb_raise( rb_ePgConnTrans,
463
531
  "Nested transaction block. Use Conn#subtransaction.");
464
- pgresult_clear( pg_statement_exec( self, cmd, Qnil));
465
- return rb_ensure( yield_transaction, self, commit_transaction, self);
532
+ pgresult_clear( pg_statement_exec( conn, cmd, Qnil));
533
+ return rb_ensure( yield_transaction, conn, commit_transaction, conn);
466
534
  }
467
535
 
468
536
  VALUE
469
- yield_transaction( VALUE self)
537
+ yield_transaction( VALUE conn)
470
538
  {
471
- return rb_rescue( rb_yield, self, rollback_transaction, self);
539
+ return rb_rescue( rb_yield, conn, rollback_transaction, conn);
472
540
  }
473
541
 
474
542
  VALUE
475
- rollback_transaction( VALUE self)
543
+ rollback_transaction( VALUE conn, VALUE err)
476
544
  {
477
- pgresult_clear( pg_statement_exec( self, rb_str_new2( "ROLLBACK;"), Qnil));
478
- rb_exc_raise( RB_ERRINFO);
545
+ pgresult_clear( pg_statement_exec( conn, rb_str_new2( "ROLLBACK;"), Qnil));
546
+ rb_exc_raise( err);
479
547
  return Qnil;
480
548
  }
481
549
 
482
550
  VALUE
483
- commit_transaction( VALUE self)
551
+ commit_transaction( VALUE conn)
484
552
  {
485
553
  struct pgconn_data *c;
486
554
 
487
- Data_Get_Struct( self, struct pgconn_data, c);
555
+ c = get_pgconn( conn);
488
556
  if (PQtransactionStatus( c->conn) > PQTRANS_IDLE)
489
- pgresult_clear( pg_statement_exec( self, rb_str_new2( "COMMIT;"), Qnil));
557
+ pgresult_clear( pg_statement_exec( conn, rb_str_new2( "COMMIT;"), Qnil));
490
558
  return Qnil;
491
559
  }
492
560
 
@@ -508,13 +576,13 @@ pgconn_subtransaction( int argc, VALUE *argv, VALUE self)
508
576
  char *p;
509
577
  int n;
510
578
 
511
- Data_Get_Struct( self, struct pgconn_data, c);
579
+ c = get_pgconn( self);
512
580
  a = rb_scan_args( argc, argv, "1*", &sp, &par);
513
581
  StringValue( sp);
514
582
  if (a > 1)
515
583
  sp = rb_str_format(RARRAY_LEN(par), RARRAY_PTR(par), sp);
516
584
 
517
- cmd = rb_str_buf_new2( "savepoint ");
585
+ cmd = rb_str_buf_new2( "SAVEPOINT ");
518
586
  q = pgconn_destring( c, sp, &n);
519
587
  p = PQescapeIdentifier( c->conn, q, n);
520
588
  rb_str_buf_cat2( cmd, p);
@@ -533,16 +601,16 @@ yield_subtransaction( VALUE ary)
533
601
  }
534
602
 
535
603
  VALUE
536
- rollback_subtransaction( VALUE ary)
604
+ rollback_subtransaction( VALUE ary, VALUE err)
537
605
  {
538
606
  VALUE cmd;
539
607
 
540
- cmd = rb_str_buf_new2( "rollback to savepoint ");
608
+ cmd = rb_str_buf_new2( "ROLLBACK TO SAVEPOINT ");
541
609
  rb_str_buf_append( cmd, rb_ary_entry( ary, 1));
542
610
  rb_str_buf_cat2( cmd, ";");
543
611
  pgresult_clear( pg_statement_exec( rb_ary_entry( ary, 0), cmd, Qnil));
544
612
  rb_ary_store( ary, 1, Qnil);
545
- rb_exc_raise( RB_ERRINFO);
613
+ rb_exc_raise( err);
546
614
  return Qnil;
547
615
  }
548
616
 
@@ -554,7 +622,7 @@ release_subtransaction( VALUE ary)
554
622
 
555
623
  n = rb_ary_entry( ary, 1);
556
624
  if (!NIL_P( n)) {
557
- cmd = rb_str_buf_new2( "release savepoint ");
625
+ cmd = rb_str_buf_new2( "RELEASE SAVEPOINT ");
558
626
  rb_str_buf_append( cmd, n);
559
627
  rb_str_buf_cat2( cmd, ";");
560
628
  pgresult_clear( pg_statement_exec( rb_ary_entry( ary, 0), cmd, Qnil));
@@ -582,7 +650,7 @@ pgconn_transaction_status( VALUE self)
582
650
  {
583
651
  struct pgconn_data *c;
584
652
 
585
- Data_Get_Struct( self, struct pgconn_data, c);
653
+ c = get_pgconn( self);
586
654
  return INT2FIX( PQtransactionStatus( c->conn));
587
655
  }
588
656
 
@@ -597,7 +665,7 @@ pgconn_transaction_status( VALUE self)
597
665
  *
598
666
  * conn.copy_stdin "COPY t FROM STDIN;" do
599
667
  * ary = ...
600
- * l = stringize_line ary
668
+ * l = conn.stringize_line ary
601
669
  * conn.put l
602
670
  * end
603
671
  *
@@ -622,10 +690,10 @@ put_end( VALUE self)
622
690
  int r;
623
691
  PGresult *res;
624
692
 
625
- Data_Get_Struct( self, struct pgconn_data, c);
693
+ c = get_pgconn( self);
626
694
  /*
627
695
  * I would like to hand over something like
628
- * RSTRING_PTR( rb_obj_as_string( RB_ERRINFO))
696
+ * RSTRING_PTR( rb_obj_as_string( rb_errinfo()))
629
697
  * here but when execution is inside a rescue block
630
698
  * the error info will be non-null even though the
631
699
  * exception just has been caught.
@@ -682,7 +750,7 @@ pgconn_putline( VALUE self, VALUE arg)
682
750
  str = t;
683
751
  }
684
752
 
685
- Data_Get_Struct( self, struct pgconn_data, c);
753
+ c = get_pgconn( self);
686
754
  p = pgconn_destring( c, str, &l);
687
755
  r = PQputCopyData( c->conn, p, l);
688
756
  if (r < 0)
@@ -734,7 +802,7 @@ get_end( VALUE self)
734
802
  struct pgconn_data *c;
735
803
  PGresult *res;
736
804
 
737
- Data_Get_Struct( self, struct pgconn_data, c);
805
+ c = get_pgconn( self);
738
806
  if ((res = PQgetResult( c->conn)) != NULL)
739
807
  pgresult_new( res, c, Qnil, Qnil);
740
808
  return Qnil;
@@ -765,7 +833,7 @@ pgconn_getline( int argc, VALUE *argv, VALUE self)
765
833
 
766
834
  async = rb_scan_args( argc, argv, "01", &as) > 0 && !NIL_P( as) ? 1 : 0;
767
835
 
768
- Data_Get_Struct( self, struct pgconn_data, c);
836
+ c = get_pgconn( self);
769
837
  r = PQgetCopyData( c->conn, &b, async);
770
838
  if (r > 0) {
771
839
  VALUE ret;
@@ -799,7 +867,7 @@ pgconn_each_line( VALUE self)
799
867
  int r;
800
868
  VALUE s;
801
869
 
802
- Data_Get_Struct( self, struct pgconn_data, c);
870
+ c = get_pgconn( self);
803
871
  for (; (r = PQgetCopyData( c->conn, &b, 0)) > 0;) {
804
872
  s = pgconn_mkstringn( c, b, r);
805
873
  PQfreemem( b);
@@ -869,16 +937,17 @@ Init_pgsql_conn_exec( void)
869
937
  rb_cPgConn = rb_define_class_under( rb_mPg, "Conn", rb_cObject);
870
938
  #endif
871
939
 
872
- rb_ePgConnExec = rb_define_class_under( rb_cPgConn, "ExecError", rb_ePgError);
873
- rb_ePgConnTrans = rb_define_class_under( rb_cPgConn, "TransactionError", rb_ePgError);
874
- rb_ePgConnCopy = rb_define_class_under( rb_cPgConn, "CopyError", rb_ePgError);
940
+ rb_ePgConnExec = rb_define_class_under( rb_cPgConn, "ExecError", rb_ePgError);
941
+ rb_ePgConnTimeout = rb_define_class_under( rb_cPgConn, "Timeout", rb_ePgError);
942
+ rb_ePgConnTrans = rb_define_class_under( rb_cPgConn, "TransactionError", rb_ePgError);
943
+ rb_ePgConnCopy = rb_define_class_under( rb_cPgConn, "CopyError", rb_ePgError);
875
944
 
876
945
  rb_define_method( rb_cPgConn, "exec", &pgconn_exec, -1);
877
946
  rb_define_method( rb_cPgConn, "send", &pgconn_send, -1);
878
- rb_define_method( rb_cPgConn, "fetch", &pgconn_fetch, 0);
947
+ rb_define_method( rb_cPgConn, "fetch", &pgconn_fetch, -1);
879
948
 
880
949
  rb_define_method( rb_cPgConn, "query", &pgconn_query, -1);
881
- rb_define_method( rb_cPgConn, "select_one", &pgconn_select_one, -1);
950
+ rb_define_method( rb_cPgConn, "select_row", &pgconn_select_row, -1);
882
951
  rb_define_method( rb_cPgConn, "select_value", &pgconn_select_value, -1);
883
952
  rb_define_method( rb_cPgConn, "select_values", &pgconn_select_values, -1);
884
953
  rb_define_method( rb_cPgConn, "get_notify", &pgconn_get_notify, 0);
@@ -908,6 +977,6 @@ Init_pgsql_conn_exec( void)
908
977
 
909
978
  rb_define_method( rb_cPgConn, "backup", &pgconn_backup, 1);
910
979
 
911
- ID id_to_a = 0;
980
+ id_to_a = 0;
912
981
  }
913
982
 
data/lib/conn_quote.c CHANGED
@@ -23,7 +23,8 @@ extern VALUE pgconn_for_copy( VALUE self, VALUE str);
23
23
  static int needs_dquote_string( VALUE str);
24
24
  static VALUE dquote_string( VALUE str);
25
25
  static VALUE stringize_array( VALUE self, VALUE result, VALUE ary);
26
- static VALUE gsub_escape_i( VALUE c, VALUE arg);
26
+ static VALUE gsub_escape_i( RB_BLOCK_CALL_FUNC_ARGLIST( c, arg));
27
+
27
28
 
28
29
  static VALUE pgconn_quote( VALUE self, VALUE obj);
29
30
  static VALUE pgconn_quote_all( int argc, VALUE *argv, VALUE self);
@@ -199,11 +200,11 @@ pgconn_unescape_bytea( VALUE self, VALUE obj)
199
200
  size_t l;
200
201
  VALUE ret;
201
202
 
202
- if (NIL_P( obj))
203
- return Qnil;
204
203
  #ifdef RUBY_ENCODING
205
204
  rb_scan_args( argc, argv, "11", &obj, &enc);
206
205
  #endif
206
+ if (NIL_P( obj))
207
+ return Qnil;
207
208
  StringValue( obj);
208
209
 
209
210
  s = PQunescapeBytea( (unsigned char *) RSTRING_PTR( obj), &l);
@@ -319,7 +320,7 @@ pgconn_stringize_line( VALUE self, VALUE ary)
319
320
  VALUE a;
320
321
  VALUE *p;
321
322
  int l;
322
- VALUE ret, s;
323
+ VALUE ret;
323
324
 
324
325
  a = rb_check_convert_type( ary, T_ARRAY, "Array", "to_ary");
325
326
  if (NIL_P(a))
@@ -411,13 +412,13 @@ dquote_string( VALUE str)
411
412
  VALUE
412
413
  stringize_array( VALUE self, VALUE result, VALUE ary)
413
414
  {
414
- long i, j;
415
+ long i;
415
416
  VALUE *o;
416
417
  VALUE cf, co;
417
418
  VALUE r;
418
419
 
419
420
  cf = Qundef;
420
- for (o = RARRAY_PTR( ary), j = RARRAY_LEN( ary); j; ++o, --j) {
421
+ for (o = RARRAY_PTR( ary), i = RARRAY_LEN( ary); i; ++o, --i) {
421
422
  co = CLASS_OF( *o);
422
423
  if (cf == Qundef)
423
424
  cf = co;
@@ -438,7 +439,7 @@ stringize_array( VALUE self, VALUE result, VALUE ary)
438
439
 
439
440
 
440
441
  VALUE
441
- gsub_escape_i( VALUE c, VALUE arg)
442
+ gsub_escape_i( RB_BLOCK_CALL_FUNC_ARGLIST( c, arg))
442
443
  {
443
444
  const char *r;
444
445
 
@@ -471,7 +472,7 @@ gsub_escape_i( VALUE c, VALUE arg)
471
472
  * This method is to prevent you from saying something like <code>"insert into
472
473
  * ... (E'#{conn.stringize obj}', ...);"</code>. It is more efficient to say
473
474
  *
474
- * conn.exec "insert into ... (#{conn.quote obj}, ...);"
475
+ * conn.exec "INSERT INTO ... (#{conn.quote obj}, ...);"
475
476
  *
476
477
  * Your self-defined classes will be checked whether they have a method named
477
478
  * +to_postgres+. If that doesn't exist the object will be converted by
@@ -516,25 +517,25 @@ VALUE pgconn_quote( VALUE self, VALUE obj)
516
517
  co = CLASS_OF( obj);
517
518
  if (co == rb_cTime) {
518
519
  res = rb_funcall( obj, id_iso8601, 0);
519
- type = "timestamptz";
520
+ type = "TIMESTAMPTZ";
520
521
  } else if (co == rb_cDate) {
521
522
  res = rb_obj_as_string( obj);
522
- type = "date";
523
+ type = "DATE";
523
524
  } else if (co == rb_cDateTime) {
524
525
  res = rb_obj_as_string( obj);
525
- type = "timestamptz";
526
+ type = "TIMESTAMPTZ";
526
527
  } else if (co == pg_monetary_class() &&
527
528
  rb_respond_to( obj, id_raw)) {
528
529
  res = rb_funcall( obj, id_raw, 0);
529
530
  StringValue( res);
530
- type = "money";
531
+ type = "MONEY";
531
532
  } else if (rb_respond_to( obj, id_to_postgres)) {
532
533
  res = rb_funcall( obj, id_to_postgres, 0);
533
534
  StringValue( res);
534
535
  type = NULL;
535
536
  } else {
536
537
  res = rb_obj_as_string( obj);
537
- type = "unknown";
538
+ type = "UNKNOWN";
538
539
  }
539
540
  res = quote_string( self, res);
540
541
  if (type != NULL) {
@@ -584,12 +585,12 @@ quote_string( VALUE conn, VALUE str)
584
585
  VALUE
585
586
  quote_array( VALUE self, VALUE result, VALUE ary)
586
587
  {
587
- long i, j;
588
+ long i;
588
589
  VALUE *o;
589
590
  VALUE cf, co;
590
591
 
591
592
  cf = Qundef;
592
- for (o = RARRAY_PTR( ary), j = RARRAY_LEN( ary); j; ++o, --j) {
593
+ for (o = RARRAY_PTR( ary), i = RARRAY_LEN( ary); i; ++o, --i) {
593
594
  co = CLASS_OF( *o);
594
595
  if (cf == Qundef)
595
596
  cf = co;
data/lib/mkrf_conf CHANGED
@@ -10,27 +10,19 @@ Autorake.configure {
10
10
 
11
11
  extending_ruby
12
12
 
13
- if RUBY_VERSION < "1.9" then
14
- have_header "ruby.h"
15
- have_header "rubyio.h"
16
- have_header "st.h"
17
- else
18
- have_header "ruby/ruby.h"
19
- have_header "ruby/io.h"
20
- end
13
+ need_header "ruby/ruby.h"
14
+ need_header "ruby/io.h"
15
+
21
16
 
22
17
  incdir :postgres, `pg_config --pkgincludedir`
23
18
  incdir :postgres_server, `pg_config --includedir-server`
24
19
 
25
- have_library "crypto"
26
- have_library "ssl"
27
- have_library "pq"
20
+ need_library "pq"
28
21
 
29
- have_header "postgres.h"
30
- have_header "libpq-fe.h"
31
- have_header "catalog/pg_type.h"
22
+ need_header "postgres.h"
23
+ need_header "libpq-fe.h"
24
+ need_header "catalog/pg_type.h"
32
25
 
33
- have_func "rb_errinfo"
34
26
  have_func "rb_io_stdio_file"
35
27
  have_func "rb_locale_encoding"
36
28
 
data/lib/module.c CHANGED
@@ -8,7 +8,7 @@
8
8
  #include "result.h"
9
9
 
10
10
 
11
- #define PGSQL_VERSION "1.5.1"
11
+ #define PGSQL_VERSION "1.9"
12
12
 
13
13
 
14
14
  VALUE rb_mPg;
data/lib/module.h CHANGED
@@ -18,15 +18,9 @@
18
18
  #endif
19
19
  #include "undef.h"
20
20
 
21
- #ifdef HAVE_HEADER_POSTGRES_H
22
- #include <postgres.h>
23
- #endif
24
- #ifdef HAVE_HEADER_LIBPQ_FE_H
25
- #include <libpq-fe.h>
26
- #endif
27
- #ifdef HAVE_HEADER_CATALOG_PG_TYPE_H
28
- #include <catalog/pg_type.h>
29
- #endif
21
+ #include <postgres.h>
22
+ #include <libpq-fe.h>
23
+ #include <catalog/pg_type.h>
30
24
  #include "undef.h"
31
25
 
32
26
 
data/lib/result.c CHANGED
@@ -11,9 +11,6 @@
11
11
  static void pgresult_init( struct pgresult_data *r, PGresult *result, struct pgconn_data *conn);
12
12
  static VALUE pgreserror_new( VALUE result, VALUE cmd, VALUE par);
13
13
 
14
- static VALUE pgreserror_command( VALUE self);
15
- static VALUE pgreserror_params( VALUE self);
16
-
17
14
  static struct pgresult_data *pgreserror_result( VALUE self);
18
15
  static VALUE pgreserror_status( VALUE self);
19
16
  static VALUE pgreserror_sqlst( VALUE self);
@@ -25,7 +22,6 @@ static VALUE pgreserror_diag( VALUE self, VALUE field);
25
22
 
26
23
  static VALUE pgresult_s_translate_results_set( VALUE cls, VALUE fact);
27
24
 
28
- static void pgresult_mark( struct pgresult_data *ptr);
29
25
  static void pgresult_free( struct pgresult_data *ptr);
30
26
  extern VALUE pgresult_new( PGresult *result, struct pgconn_data *conn, VALUE cmd, VALUE par);
31
27
 
@@ -214,13 +210,6 @@ pgresult_s_translate_results_set( VALUE cls, VALUE fact)
214
210
 
215
211
 
216
212
 
217
- void
218
- pgresult_mark( struct pgresult_data *ptr)
219
- {
220
- rb_gc_mark( ptr->fields);
221
- rb_gc_mark( ptr->indices);
222
- }
223
-
224
213
  void
225
214
  pgresult_free( struct pgresult_data *ptr)
226
215
  {
@@ -252,6 +241,8 @@ pgresult_new( PGresult *result, struct pgconn_data *conn, VALUE cmd, VALUE par)
252
241
  case PGRES_TUPLES_OK:
253
242
  case PGRES_COPY_OUT:
254
243
  case PGRES_COPY_IN:
244
+ case PGRES_COPY_BOTH:
245
+ case PGRES_SINGLE_TUPLE:
255
246
  break;
256
247
  case PGRES_BAD_RESPONSE:
257
248
  case PGRES_NONFATAL_ERROR:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgsql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: '1.9'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bertram Scharpf
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2021-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: autorake
@@ -55,7 +55,7 @@ homepage: http://www.bertram-scharpf.de/software/pgsql
55
55
  licenses:
56
56
  - BSD-2-Clause
57
57
  metadata: {}
58
- post_install_message:
58
+ post_install_message:
59
59
  rdoc_options:
60
60
  - "--main"
61
61
  - README
@@ -73,8 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  version: '0'
74
74
  requirements:
75
75
  - PostgreSQL
76
- rubygems_version: 3.0.6
77
- signing_key:
76
+ rubygems_version: 3.0.8
77
+ signing_key:
78
78
  specification_version: 4
79
79
  summary: PostgreSQL-API for Ruby
80
80
  test_files: []