pgsql 1.3 → 1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MTM2YjZhYjdkMzM5ZDdjYTAyZmJjOTMzYTM3NTFiY2M0Y2Y0ZWI1ZA==
5
- data.tar.gz: !binary |-
6
- YWVlZTViMjA4YmYwYzg2MjVlYWYwNjdjNTA1N2ExMmRlMDU5MTY3MA==
2
+ SHA256:
3
+ metadata.gz: dc7ec22892e0bd75f3a0c63832471264c74e5bf758844f3fc87b9b5e2fb73b59
4
+ data.tar.gz: c1d31689274d2ccd7a97b4381b635f390886e419cbef1c44b7017839b8b520a9
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OWY0NWYwYzA0ZjZkZWFjYjkwMGNhOGFiZmQ3M2U5ZWRmZjY3ODc4NjRkNzhl
10
- MDg2YzdlMmVkZDAzZjZiY2RmOWFkNTgyZTFjNzQxMTM1ZjRhN2ExNmU4OWEx
11
- MmQzZTAwOGI4NGNkZmNhNDQyMGNhM2Y3Yjg0ODNlNDQxODFmNTg=
12
- data.tar.gz: !binary |-
13
- YTc3ZWJkMDg0MWUwYjdhZDdkMGViMDM5MzE5YmU2MGVmZTBkYTNlMGIwNWZh
14
- YzQwN2Y4ZjQ0ZjE2Yjk4OWI1OTFmMzY4NGVjNmY5NDk2MjIzYTIyMzc5MWI0
15
- ODFiNTRjMjBkN2YxNDljN2FlYWJmOWUzMDQwMDE1ODAyYWQyZGY=
6
+ metadata.gz: 2c94ab8fc0eb95ed34e1ffb84d0f90dd34d7ac4858b693217d94e36e913d5b02f9a7653459864f002d9d84cf02219b07191ee64757a5a42899cae6b8f31aa512
7
+ data.tar.gz: 4a893e13d60d470e8bde739c7f33f3d6260cd20670c746d115ebd93aa74531af69059c32a9dd59419fc68dd6ddd7d7630b12b892c615c1beeb4600aa336d9c31
data/LICENSE CHANGED
@@ -1,12 +1,6 @@
1
- _
2
- _ __ __ _ ___ __ _| |
3
- | '_ \ / _` / __|/ _` | |
4
- | |_) | (_| \__ \ (_| | |
5
- | .__/ \__, |___/\__, |_|
6
- |_| |___/ |_|
1
+ = pgsql Ruby Gem
7
2
 
8
-
9
- Copyright (c) 2011-2013, Bertram Scharpf <software@bertram-scharpf.de>.
3
+ Copyright (C) 2011-2020, Bertram Scharpf <software@bertram-scharpf.de>.
10
4
  All rights reserved.
11
5
 
12
6
  Redistribution and use in source and binary forms, with or without
data/README CHANGED
@@ -1,14 +1,13 @@
1
- _
2
- _ __ __ _ ___ __ _| |
3
- | '_ \ / _` / __|/ _` | |
4
- | |_) | (_| \__ \ (_| | |
5
- | .__/ \__, |___/\__, |_|
6
- |_| |___/ |_|
7
-
8
- == Description
1
+ = pgsql Ruby Gem
9
2
 
10
3
  A PostgreSQL library that was carefully designed.
11
4
 
5
+
6
+ == Author
7
+
8
+ Bertram Scharpf <software@bertram-scharpf.de>
9
+
10
+
12
11
  == Features
13
12
 
14
13
  * Connection parameters from hash
@@ -18,28 +17,30 @@ A PostgreSQL library that was carefully designed.
18
17
  * Full PostgreSQL quoting support
19
18
  * Built-in transactions and savepoints by Ruby blocks
20
19
 
20
+
21
21
  == Example
22
22
 
23
23
  Write something like this:
24
24
 
25
- require "pgsql"
26
-
27
- Pg::Conn.open :dbname => "test1", :user => "jdoe" do |conn|
28
- conn.exec "select * from mytable;" do |result|
29
- result.each { |row|
30
- l = row.join ", "
31
- ...
32
- }
25
+ require "pgsql"
26
+
27
+ Pg::Conn.open :dbname => "test1", :user => "jdoe" do |conn|
28
+ conn.exec "SELECT * FROM mytable;" do |result|
29
+ result.each { |row|
30
+ l = row.join ", "
31
+ ...
32
+ }
33
+ end
34
+ cmd = <<-ENDSQL
35
+ SELECT * FROM mytable WHERE num=$1::INTEGER;
36
+ ENDSQL
37
+ conn.query cmd, 42 do |row|
38
+ l = row.join ", "
39
+ ...
40
+ end
41
+ ...
33
42
  end
34
- cmd = <<-ENDSQL
35
- select * from mytable where num=$1::integer;
36
- ENDSQL
37
- conn.query cmd, 42 do |row|
38
- l = row.join ", "
39
- ...
40
- end
41
- ...
42
- end
43
+
43
44
 
44
45
  == Thanks
45
46
 
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
@@ -5,6 +5,8 @@
5
5
 
6
6
  #include "conn.h"
7
7
 
8
+ #include "conn_quote.h"
9
+ #include "conn_exec.h"
8
10
 
9
11
  #if defined( HAVE_HEADER_ST_H)
10
12
  #include <st.h>
@@ -24,12 +26,12 @@ extern VALUE pgconn_mkstring( struct pgconn_data *ptr, const char *str);
24
26
  extern VALUE pgconn_mkstringn( struct pgconn_data *ptr, const char *str, int len);
25
27
  static VALUE pgconn_alloc( VALUE cls);
26
28
  static VALUE pgconn_s_connect( int argc, VALUE *argv, VALUE cls);
27
- static VALUE pgconn_s_parse( VALUE cls, VALUE str);
28
29
  static VALUE pgconn_init( int argc, VALUE *argv, VALUE self);
29
30
  static int set_connect_params( st_data_t key, st_data_t val, st_data_t args);
30
- static void connstr_to_hash( VALUE params, VALUE str);
31
- static void connstr_passwd( VALUE self, VALUE params);
32
- 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));
33
35
 
34
36
  static VALUE pgconn_close( VALUE self);
35
37
  static VALUE pgconn_reset( VALUE self);
@@ -69,6 +71,9 @@ VALUE rb_cPgConn;
69
71
  static VALUE rb_ePgConnFailed;
70
72
  static VALUE rb_ePgConnInvalid;
71
73
 
74
+ static VALUE sym_dbname = Qundef;
75
+ static VALUE sym_password = Qundef;
76
+
72
77
 
73
78
 
74
79
  void
@@ -198,7 +203,7 @@ pgconn_alloc( VALUE cls)
198
203
  }
199
204
 
200
205
  /*
201
- * Document-method: connect
206
+ * Document-method: Pg::Conn.connect
202
207
  *
203
208
  * call-seq:
204
209
  * Pg::Conn.connect( hash) -> conn
@@ -219,27 +224,9 @@ pgconn_s_connect( int argc, VALUE *argv, VALUE cls)
219
224
  rb_ensure( rb_yield, pgconn, pgconn_close, pgconn) : pgconn;
220
225
  }
221
226
 
222
- /*
223
- * call-seq:
224
- * Pg::Conn.parse( str) -> hash
225
- *
226
- * Parse a connection string and return a hash with keys <code>:dbname</code>,
227
- * <code>:user</code>, <code>:host</code>, etc.
228
- *
229
- */
230
- VALUE
231
- pgconn_s_parse( VALUE cls, VALUE str)
232
- {
233
- VALUE params;
234
-
235
- params = rb_hash_new();
236
- connstr_to_hash( params, str);
237
- return params;
238
- }
239
-
240
227
 
241
228
  /*
242
- * Document-method: new
229
+ * Document-method: Pg::Conn.new
243
230
  *
244
231
  * call-seq:
245
232
  * Pg::Conn.new( hash) -> conn
@@ -250,23 +237,39 @@ pgconn_s_parse( VALUE cls, VALUE str)
250
237
  *
251
238
  * c = Pg::Conn.new :dbname => "movies", :host => "jupiter", ...
252
239
  *
253
- * The most common parameters may be given in a URL-like
254
- * connection string:
240
+ * If the +str+ argument is given but no further parameters,
241
+ * the PQconnectdb() (not PQconnectdbParams()) function will be called.
242
+ * If further arguments are present, the +str+ argument will be made into
243
+ * the "dbname" parameter, but without overwriting an existing one.
255
244
  *
256
- * "user:password@host:port/dbname"
245
+ * The "dbname" parameter may be a +conninfo+ string as described in the
246
+ * PostgreSQL documentation:
257
247
  *
258
- * Any of these parts may be omitted. If there is no slash, the part after the
259
- * @ sign will be read as database name.
248
+ * c = Pg::Conn.new "postgresql://user:password@host:port/dbname"
249
+ * c = Pg::Conn.new "postgres://user:password@host:port/dbname"
250
+ * c = Pg::Conn.new "dbname=... host=... user=..."
251
+ *
252
+ * The password may be specified as an extra parameter:
253
+ *
254
+ * c = Pg::Conn.new "postgresql://user@host/dbname", password: "verysecret"
260
255
  *
261
256
  * If the password is the empty string, and there is either an instance method
262
257
  * or a class method <code>password?</code>, that method will be asked. This
263
258
  * method may ask <code>yield :user</code> or <code>yield :dbname</code> and so
264
259
  * on to get the connection parameters.
265
260
  *
261
+ * class Pg::Conn
262
+ * def password?
263
+ * "tercesyrev".reverse
264
+ * end
265
+ * end
266
+ * c = Pg::Conn.new "postgresql://user@host/dbname", password: ""
267
+ *
266
268
  * See the PostgreSQL documentation for a full list:
267
269
  * [http://www.postgresql.org/docs/current/interactive/libpq-connect.html#LIBPQ-PQCONNECTDBPARAMS]
268
270
  *
269
271
  * On failure, a +Pg::Error+ exception will be raised.
272
+ *
270
273
  */
271
274
  VALUE
272
275
  pgconn_init( int argc, VALUE *argv, VALUE self)
@@ -278,32 +281,44 @@ pgconn_init( int argc, VALUE *argv, VALUE self)
278
281
  struct pgconn_data *c;
279
282
 
280
283
  if (rb_scan_args( argc, argv, "02", &str, &params) < 2)
281
- if (TYPE( str) != T_STRING) {
284
+ if (TYPE( str) == T_HASH) {
282
285
  params = str;
283
286
  str = Qnil;
284
287
  }
285
- if (NIL_P( params))
286
- params = rb_hash_new();
287
- else if (TYPE( params) != T_HASH)
288
- params = rb_convert_type( params, T_HASH, "Hash", "to_hash");
289
- else
290
- params = rb_obj_dup( params);
291
- if (!NIL_P( str))
292
- connstr_to_hash( params, str);
293
- connstr_passwd( self, params);
294
288
 
295
289
  Data_Get_Struct( self, struct pgconn_data, c);
296
290
 
297
- l = RHASH_SIZE( params) + 1;
298
- keywords = (const char **) ALLOCA_N( char *, l);
299
- values = (const char **) ALLOCA_N( char *, l);
300
- ptrs[ 0] = keywords;
301
- ptrs[ 1] = values;
302
- ptrs[ 2] = (const char **) c;
303
- st_foreach( RHASH_TBL( params), &set_connect_params, (st_data_t) ptrs);
304
- *(ptrs[ 0]) = *(ptrs[ 1]) = NULL;
305
-
306
- c->conn = PQconnectdbParams( keywords, values, 1);
291
+ if (NIL_P( params)) {
292
+ StringValue( str);
293
+ c->conn = PQconnectdb( RSTRING_PTR( str));
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
+ }
307
322
  if (PQstatus( c->conn) == CONNECTION_BAD)
308
323
  rb_exc_raise( pgconnfailederror_new( c, params));
309
324
 
@@ -329,50 +344,29 @@ set_connect_params( st_data_t key, st_data_t val, st_data_t args)
329
344
  return ST_CONTINUE;
330
345
  }
331
346
 
332
- static const char re_connstr[] =
333
- "\\A"
334
- "(?:(.*?)(?::(.*))?@)?" /* user:passwd@ */
335
- "(?:(.*?)(?::(\\d+))?/)?(?:(.+))?" /* host:port/dbname */
336
- "\\z"
337
- ;
338
-
339
- #define KEY_USER "user"
340
- #define KEY_PASSWORD "password"
341
- #define KEY_HOST "host"
342
- #define KEY_PORT "port"
343
- #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
+ }
344
354
 
345
- void
346
- connstr_to_hash( VALUE params, VALUE str)
347
- {
348
- VALUE re, match, k, m;
349
-
350
- re = rb_reg_new( re_connstr, sizeof re_connstr - 1, 0);
351
- if (RTEST( rb_reg_match( re, str))) {
352
- match = rb_backref_get();
353
- #define ADD_TO_RES( key, n) \
354
- k = ID2SYM( rb_intern( key)); m = rb_reg_nth_match( n, match); \
355
- if (NIL_P( rb_hash_aref( params, k)) && !NIL_P(m)) \
356
- rb_hash_aset( params, k, m)
357
- ADD_TO_RES( KEY_USER, 1);
358
- ADD_TO_RES( KEY_PASSWORD, 2);
359
- ADD_TO_RES( KEY_HOST, 3);
360
- ADD_TO_RES( KEY_PORT, 4);
361
- ADD_TO_RES( KEY_DBNAME, 5);
362
- #undef ADD_TO_RES
363
- } else
364
- 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;
365
361
  }
366
362
 
363
+
367
364
  void
368
- connstr_passwd( VALUE self, VALUE params)
365
+ connstr_passwd( VALUE self, VALUE orig_params, VALUE *params)
369
366
  {
370
- static VALUE sym_password = Qundef;
371
367
  VALUE pw;
372
368
 
373
- if (sym_password == Qundef)
374
- sym_password = ID2SYM( rb_intern( KEY_PASSWORD));
375
- pw = rb_hash_aref( params, sym_password);
369
+ pw = rb_hash_aref( *params, connstr_sym_password());
376
370
  if (TYPE( pw) == T_STRING && RSTRING_LEN( pw) == 0) {
377
371
  static ID id_password_q = 0;
378
372
  VALUE pwobj;
@@ -384,14 +378,18 @@ connstr_passwd( VALUE self, VALUE params)
384
378
  pwobj = self;
385
379
  if (rb_respond_to( CLASS_OF( self), id_password_q))
386
380
  pwobj = CLASS_OF( self);
387
- if (pwobj != Qundef)
388
- 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,
389
385
  rb_block_call( pwobj, id_password_q, 0, NULL,
390
- &connstr_getparam, params));
386
+ &connstr_getparam, *params));
387
+ }
391
388
  }
392
389
  }
393
390
 
394
- VALUE connstr_getparam( VALUE yielded, VALUE params)
391
+ VALUE
392
+ connstr_getparam( RB_BLOCK_CALL_FUNC_ARGLIST( yielded, params))
395
393
  {
396
394
  return rb_hash_aref( params, yielded);
397
395
  }
@@ -454,7 +452,7 @@ pgconn_set_client_encoding( VALUE self, VALUE str)
454
452
  {
455
453
  StringValue( str);
456
454
  if ((PQsetClientEncoding( get_pgconn( self)->conn, RSTRING_PTR( str))) == -1)
457
- rb_raise( rb_ePgError, "Invalid encoding name %s", str);
455
+ rb_raise( rb_ePgError, "Invalid encoding name %s", RSTRING_PTR( str));
458
456
  return Qnil;
459
457
  }
460
458
 
@@ -491,6 +489,8 @@ pgconn_set_externalenc( VALUE self, VALUE enc)
491
489
  e = NIL_P( enc) ? rb_to_encoding( enc) : rb_default_external_encoding();
492
490
  Data_Get_Struct( self, struct pgconn_data, c);
493
491
  c->external = rb_enc_from_encoding( e);
492
+
493
+ return Qnil;
494
494
  }
495
495
 
496
496
  /*
@@ -523,6 +523,8 @@ pgconn_set_internalenc( VALUE self, VALUE enc)
523
523
  e = NIL_P( enc) ? rb_to_encoding( enc) : rb_default_internal_encoding();
524
524
  Data_Get_Struct( self, struct pgconn_data, c);
525
525
  c->internal = rb_enc_from_encoding( e);
526
+
527
+ return Qnil;
526
528
  }
527
529
 
528
530
  #endif
@@ -769,14 +771,14 @@ pgconn_untrace( VALUE self)
769
771
  * == Example
770
772
  *
771
773
  * conn.exec <<-EOT
772
- * create or replace function noise() returns void as $$
773
- * begin
774
- * raise notice 'Hi!';
775
- * end;
776
- * $$ language plpgsql;
774
+ * CREATE OR REPLACE FUNCTION noise() RETURNS VOID AS $$
775
+ * BEGIN
776
+ * RAISE NOTICE 'Hi!';
777
+ * END;
778
+ * $$ LANGUAGE plpgsql;
777
779
  * EOT
778
780
  * conn.on_notice { |e| puts e.inspect }
779
- * conn.exec "select noise();"
781
+ * conn.exec "SELECT noise();"
780
782
  */
781
783
  VALUE
782
784
  pgconn_on_notice( VALUE self)
@@ -808,23 +810,20 @@ notice_receiver( void *self, const PGresult *result)
808
810
 
809
811
 
810
812
 
811
- /********************************************************************
812
- *
813
+ /*
813
814
  * Document-class: Pg::Conn::Failed
814
815
  *
815
816
  * Error while establishing a connection to the PostgreSQL server.
816
817
  */
817
818
 
818
- /********************************************************************
819
- *
819
+ /*
820
820
  * Document-class: Pg::Conn::Invalid
821
821
  *
822
822
  * Invalid (closed) connection.
823
823
  */
824
824
 
825
825
 
826
- /********************************************************************
827
- *
826
+ /*
828
827
  * Document-class: Pg::Conn
829
828
  *
830
829
  * The class to access a PostgreSQL database.
@@ -833,7 +832,7 @@ notice_receiver( void *self, const PGresult *result)
833
832
  *
834
833
  * require "pgsql"
835
834
  * conn = Pg::Conn.open :dbname => "test1"
836
- * res = conn.exec "select * from mytable;"
835
+ * res = conn.exec "SELECT * FROM mytable;"
837
836
  *
838
837
  * See the Pg::Result class for information on working with the results of a
839
838
  * query.
@@ -842,9 +841,14 @@ notice_receiver( void *self, const PGresult *result)
842
841
  void
843
842
  Init_pgsql_conn( void)
844
843
  {
845
- #ifdef RDOC_NEEDS_THIS
846
- rb_mPg = rb_define_module( "Pg");
847
- #endif
844
+ {
845
+ ID id_require;
846
+
847
+ id_require = rb_intern( "require");
848
+ rb_funcall( Qnil, id_require, 1, rb_str_new2( "date"));
849
+ rb_funcall( Qnil, id_require, 1, rb_str_new2( "time"));
850
+ rb_funcall( Qnil, id_require, 1, rb_str_new2( "bigdecimal"));
851
+ }
848
852
 
849
853
  rb_cPgConn = rb_define_class_under( rb_mPg, "Conn", rb_cObject);
850
854
 
@@ -857,7 +861,6 @@ Init_pgsql_conn( void)
857
861
  rb_define_alloc_func( rb_cPgConn, pgconn_alloc);
858
862
  rb_define_singleton_method( rb_cPgConn, "connect", pgconn_s_connect, -1);
859
863
  rb_define_alias( rb_singleton_class( rb_cPgConn), "open", "connect");
860
- rb_define_singleton_method( rb_cPgConn, "parse", pgconn_s_parse, 1);
861
864
  rb_define_method( rb_cPgConn, "initialize", &pgconn_init, -1);
862
865
  rb_define_method( rb_cPgConn, "close", &pgconn_close, 0);
863
866
  rb_define_alias( rb_cPgConn, "finish", "close");
data/lib/conn_exec.c CHANGED
@@ -9,13 +9,6 @@
9
9
  #include "result.h"
10
10
 
11
11
 
12
- #ifdef HAVE_FUNC_RB_ERRINFO
13
- #define RB_ERRINFO (rb_errinfo())
14
- #else
15
- #define RB_ERRINFO ruby_errinfo
16
- #endif
17
-
18
-
19
12
  static void pg_raise_connexec( struct pgconn_data *c);
20
13
 
21
14
  static VALUE pg_statement_exec( VALUE conn, VALUE cmd, VALUE par);
@@ -37,11 +30,11 @@ static VALUE pgconn_select_values( int argc, VALUE *argv, VALUE self);
37
30
  static VALUE pgconn_get_notify( VALUE self);
38
31
 
39
32
  static VALUE pgconn_transaction( int argc, VALUE *argv, VALUE self);
40
- static VALUE rollback_transaction( VALUE self);
33
+ static VALUE rollback_transaction( VALUE self, VALUE err);
41
34
  static VALUE commit_transaction( VALUE self);
42
35
  static VALUE yield_transaction( VALUE self);
43
36
  static VALUE pgconn_subtransaction( int argc, VALUE *argv, VALUE self);
44
- static VALUE rollback_subtransaction( VALUE ary);
37
+ static VALUE rollback_subtransaction( VALUE ary, VALUE err);
45
38
  static VALUE release_subtransaction( VALUE ary);
46
39
  static VALUE yield_subtransaction( VALUE ary);
47
40
  static VALUE pgconn_transaction_status( VALUE self);
@@ -69,7 +62,7 @@ static ID id_to_a;
69
62
  void
70
63
  pg_raise_connexec( struct pgconn_data *c)
71
64
  {
72
- rb_raise( rb_ePgConnExec, PQerrorMessage( c->conn));
65
+ rb_raise( rb_ePgConnExec, "%s", PQerrorMessage( c->conn));
73
66
  }
74
67
 
75
68
 
@@ -144,7 +137,7 @@ params_to_strings( VALUE conn, VALUE params, int *len)
144
137
 
145
138
  q = pgconn_destring( c, pgconn_stringize( conn, *ptr), &n);
146
139
  a = ALLOC_N( char, n + 1);
147
- for (p = a; *p = n ? *q : '\0'; ++p, ++q, --n)
140
+ for (p = a; (*p = n ? *q : '\0'); ++p, ++q, --n)
148
141
  ;
149
142
  *v = a;
150
143
  }
@@ -166,8 +159,6 @@ free_strings( char **strs, int len)
166
159
  void
167
160
  pg_parse_parameters( int argc, VALUE *argv, VALUE *cmd, VALUE *par)
168
161
  {
169
- int len;
170
-
171
162
  rb_scan_args( argc, argv, "1*", cmd, par);
172
163
  StringValue( *cmd);
173
164
  if (RARRAY_LEN( *par) <= 0)
@@ -207,7 +198,7 @@ pgconn_exec( int argc, VALUE *argv, VALUE self)
207
198
  * Use Pg::Conn#fetch to fetch the results after you waited for data.
208
199
  *
209
200
  * Pg::Conn.connect do |conn|
210
- * conn.send "select pg_sleep(3), * from t;" do
201
+ * conn.send "SELECT pg_sleep(3), * FROM t;" do
211
202
  * ins = [ conn.socket]
212
203
  * loop do
213
204
  * r = IO.select ins, nil, nil, 0.5
@@ -244,7 +235,6 @@ pgconn_fetch( VALUE self)
244
235
  {
245
236
  struct pgconn_data *c;
246
237
  PGresult *result;
247
- VALUE res;
248
238
 
249
239
  Data_Get_Struct( self, struct pgconn_data, c);
250
240
  pg_check_conninvalid( c);
@@ -260,9 +250,6 @@ pgconn_fetch( VALUE self)
260
250
  VALUE
261
251
  yield_or_return_result( VALUE result)
262
252
  {
263
- struct pgresult_data *r;
264
-
265
- Data_Get_Struct( result, struct pgresult_data, r);
266
253
  return rb_block_given_p() ?
267
254
  rb_ensure( rb_yield, result, pgresult_clear, result) : result;
268
255
  }
@@ -472,10 +459,10 @@ yield_transaction( VALUE self)
472
459
  }
473
460
 
474
461
  VALUE
475
- rollback_transaction( VALUE self)
462
+ rollback_transaction( VALUE self, VALUE err)
476
463
  {
477
- pgresult_clear( pg_statement_exec( self, rb_str_new2( "rollback;"), Qnil));
478
- rb_exc_raise( RB_ERRINFO);
464
+ pgresult_clear( pg_statement_exec( self, rb_str_new2( "ROLLBACK;"), Qnil));
465
+ rb_exc_raise( err);
479
466
  return Qnil;
480
467
  }
481
468
 
@@ -486,7 +473,7 @@ commit_transaction( VALUE self)
486
473
 
487
474
  Data_Get_Struct( self, struct pgconn_data, c);
488
475
  if (PQtransactionStatus( c->conn) > PQTRANS_IDLE)
489
- pgresult_clear( pg_statement_exec( self, rb_str_new2( "commit;"), Qnil));
476
+ pgresult_clear( pg_statement_exec( self, rb_str_new2( "COMMIT;"), Qnil));
490
477
  return Qnil;
491
478
  }
492
479
 
@@ -533,7 +520,7 @@ yield_subtransaction( VALUE ary)
533
520
  }
534
521
 
535
522
  VALUE
536
- rollback_subtransaction( VALUE ary)
523
+ rollback_subtransaction( VALUE ary, VALUE err)
537
524
  {
538
525
  VALUE cmd;
539
526
 
@@ -542,7 +529,7 @@ rollback_subtransaction( VALUE ary)
542
529
  rb_str_buf_cat2( cmd, ";");
543
530
  pgresult_clear( pg_statement_exec( rb_ary_entry( ary, 0), cmd, Qnil));
544
531
  rb_ary_store( ary, 1, Qnil);
545
- rb_exc_raise( RB_ERRINFO);
532
+ rb_exc_raise( err);
546
533
  return Qnil;
547
534
  }
548
535
 
@@ -595,7 +582,7 @@ pgconn_transaction_status( VALUE self)
595
582
  * Write lines into a +COPY+ command. See +stringize_line+ for how to build
596
583
  * standard lines.
597
584
  *
598
- * conn.copy_stdin "copy t from stdin;" do
585
+ * conn.copy_stdin "COPY t FROM STDIN;" do
599
586
  * ary = ...
600
587
  * l = stringize_line ary
601
588
  * conn.put l
@@ -625,7 +612,7 @@ put_end( VALUE self)
625
612
  Data_Get_Struct( self, struct pgconn_data, c);
626
613
  /*
627
614
  * I would like to hand over something like
628
- * RSTRING_PTR( rb_obj_as_string( RB_ERRINFO))
615
+ * RSTRING_PTR( rb_obj_as_string( rb_errinfo()))
629
616
  * here but when execution is inside a rescue block
630
617
  * the error info will be non-null even though the
631
618
  * exception just has been caught.
@@ -700,7 +687,7 @@ pgconn_putline( VALUE self, VALUE arg)
700
687
  * Read lines from a +COPY+ command. The form of the lines depends
701
688
  * on the statement's parameters.
702
689
  *
703
- * conn.copy_stdout "copy t to stdout;" do
690
+ * conn.copy_stdout "COPY t TO STDOUT;" do
704
691
  * l = conn.getline
705
692
  * ary = l.split /\t/
706
693
  * ary.map! { |x|
@@ -821,7 +808,7 @@ pgconn_backup( VALUE self, VALUE label)
821
808
  {
822
809
  VALUE cmd, arg;
823
810
 
824
- cmd = rb_str_new2( "select pg_start_backup($1);");
811
+ cmd = rb_str_new2( "SELECT pg_start_backup($1);");
825
812
  arg = rb_ary_new3( 1, label);
826
813
  pgresult_clear( pg_statement_exec( self, cmd, arg));
827
814
  return rb_ensure( rb_yield, Qnil, backup_end, self);
@@ -833,31 +820,28 @@ backup_end( VALUE self)
833
820
  {
834
821
  VALUE cmd;
835
822
 
836
- cmd = rb_str_new2( "select pg_stop_backup();");
823
+ cmd = rb_str_new2( "SELECT pg_stop_backup();");
837
824
  pgresult_clear( pg_statement_exec( self, cmd, Qnil));
838
825
  return Qnil;
839
826
  }
840
827
 
841
828
 
842
829
 
843
- /********************************************************************
844
- *
830
+ /*
845
831
  * Document-class: Pg::Conn::ExecError
846
832
  *
847
833
  * Error while querying from a PostgreSQL connection.
848
834
  */
849
835
 
850
836
 
851
- /********************************************************************
852
- *
837
+ /*
853
838
  * Document-class: Pg::Conn::TransactionError
854
839
  *
855
840
  * Nested transaction blocks. Use savepoints.
856
841
  */
857
842
 
858
843
 
859
- /********************************************************************
860
- *
844
+ /*
861
845
  * Document-class: Pg::Conn::CopyError
862
846
  *
863
847
  * Nested transaction blocks. Use savepoints.
@@ -911,6 +895,6 @@ Init_pgsql_conn_exec( void)
911
895
 
912
896
  rb_define_method( rb_cPgConn, "backup", &pgconn_backup, 1);
913
897
 
914
- ID id_to_a = 0;
898
+ id_to_a = 0;
915
899
  }
916
900
 
data/lib/conn_quote.c CHANGED
@@ -6,7 +6,7 @@
6
6
  #include "conn_quote.h"
7
7
 
8
8
 
9
- extern VALUE pg_currency_class( void);
9
+ extern VALUE pg_monetary_class( void);
10
10
 
11
11
  static VALUE pgconn_format( VALUE self, VALUE obj);
12
12
 
@@ -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);
@@ -34,33 +35,60 @@ static void quote_all( VALUE self, VALUE ary, VALUE res);
34
35
  static VALUE pgconn_quote_identifier( VALUE self, VALUE value);
35
36
 
36
37
 
37
-
38
38
  VALUE rb_cDate;
39
39
  VALUE rb_cDateTime;
40
- VALUE rb_cCurrency;
40
+
41
+ static VALUE rb_cMoney;
41
42
 
42
43
  static ID id_format;
43
44
  static ID id_iso8601;
44
45
  static ID id_raw;
45
46
  static ID id_to_postgres;
46
47
  static ID id_gsub;
47
- static ID id_currency;
48
+
49
+ static int lookup_monetary;
48
50
 
49
51
  static VALUE pg_string_null;
50
52
  static VALUE pg_string_bsl_N;
51
53
  static VALUE pg_escape_regex;
52
54
 
53
55
 
56
+ static const char *monetary[] = { "Money", "Monetary", "Amount", "Currency"};
54
57
 
58
+ /*
59
+ * Document-class: Pg::Money
60
+ *
61
+ * The class the PostgreSQL-builtin type +MONEY+ wil be mapped to.
62
+ * If not set, some global classes will be searched
63
+ * (+Money+, +Monetary+, +Amount+, +Currency+) and the constant will be
64
+ * set to that.
65
+ *
66
+ * Set this constant to your own class before you do the first query,
67
+ * or set it to +nil+ to inhibit the auto-detect.
68
+ *
69
+ * The resulting class must have a method +parse+ to build a new object
70
+ * from a string. It may respond to +raw+ which overwrites +to_s+.
71
+ *
72
+ */
55
73
  VALUE
56
- pg_currency_class( void)
74
+ pg_monetary_class( void)
57
75
  {
58
- if (NIL_P( rb_cCurrency) && id_currency) {
59
- if (rb_const_defined( rb_cObject, id_currency))
60
- rb_cCurrency = rb_const_get( rb_cObject, id_currency);
61
- id_currency = 0;
76
+ if (lookup_monetary) {
77
+ ID id_MONEY = rb_intern( "Money");
78
+ if (rb_const_defined( rb_mPg, id_MONEY))
79
+ rb_cMoney = rb_const_get( rb_mPg, id_MONEY);
80
+ else {
81
+ int i;
82
+ for (i = 0; i < (sizeof monetary) / sizeof (char *) && NIL_P( rb_cMoney); i++) {
83
+ ID id = rb_intern( monetary[ i]);
84
+ if (rb_const_defined( rb_cObject, id))
85
+ rb_cMoney = rb_const_get( rb_cObject, id);
86
+ }
87
+ rb_const_set( rb_mPg, id_MONEY, rb_cMoney);
88
+ }
89
+ lookup_monetary = 0;
62
90
  }
63
- return rb_cCurrency;
91
+ return rb_cMoney;
64
92
  }
65
93
 
66
94
 
@@ -80,8 +108,8 @@ pg_currency_class( void)
80
108
  * class MyConn < Pg::Conn
81
109
  * def format obj
82
110
  * case obj
83
- * when Currency then obj.to_s_by_locale
84
- * else obj
111
+ * when Money then obj.to_s_by_locale
112
+ * else obj
85
113
  * end
86
114
  * end
87
115
  * end
@@ -121,7 +149,7 @@ VALUE
121
149
  pgconn_escape_bytea( VALUE self, VALUE str)
122
150
  {
123
151
  unsigned char *s;
124
- int l;
152
+ size_t l;
125
153
  VALUE ret;
126
154
 
127
155
  if (NIL_P( str))
@@ -172,11 +200,11 @@ pgconn_unescape_bytea( VALUE self, VALUE obj)
172
200
  size_t l;
173
201
  VALUE ret;
174
202
 
175
- if (NIL_P( obj))
176
- return Qnil;
177
203
  #ifdef RUBY_ENCODING
178
204
  rb_scan_args( argc, argv, "11", &obj, &enc);
179
205
  #endif
206
+ if (NIL_P( obj))
207
+ return Qnil;
180
208
  StringValue( obj);
181
209
 
182
210
  s = PQunescapeBytea( (unsigned char *) RSTRING_PTR( obj), &l);
@@ -264,7 +292,7 @@ pgconn_stringize( VALUE self, VALUE obj)
264
292
  result = rb_obj_as_string( obj);
265
293
  else if (co == rb_cDateTime)
266
294
  result = rb_obj_as_string( obj);
267
- else if (co == pg_currency_class() &&
295
+ else if (co == pg_monetary_class() &&
268
296
  rb_respond_to( obj, id_raw))
269
297
  result = rb_funcall( obj, id_raw, 0);
270
298
  else if (rb_respond_to( obj, id_to_postgres)) {
@@ -292,7 +320,7 @@ pgconn_stringize_line( VALUE self, VALUE ary)
292
320
  VALUE a;
293
321
  VALUE *p;
294
322
  int l;
295
- VALUE ret, s;
323
+ VALUE ret;
296
324
 
297
325
  a = rb_check_convert_type( ary, T_ARRAY, "Array", "to_ary");
298
326
  if (NIL_P(a))
@@ -384,13 +412,13 @@ dquote_string( VALUE str)
384
412
  VALUE
385
413
  stringize_array( VALUE self, VALUE result, VALUE ary)
386
414
  {
387
- long i, j;
415
+ long i;
388
416
  VALUE *o;
389
417
  VALUE cf, co;
390
418
  VALUE r;
391
419
 
392
420
  cf = Qundef;
393
- 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) {
394
422
  co = CLASS_OF( *o);
395
423
  if (cf == Qundef)
396
424
  cf = co;
@@ -411,7 +439,7 @@ stringize_array( VALUE self, VALUE result, VALUE ary)
411
439
 
412
440
 
413
441
  VALUE
414
- gsub_escape_i( VALUE c, VALUE arg)
442
+ gsub_escape_i( RB_BLOCK_CALL_FUNC_ARGLIST( c, arg))
415
443
  {
416
444
  const char *r;
417
445
 
@@ -453,7 +481,9 @@ gsub_escape_i( VALUE c, VALUE arg)
453
481
  * Call Pg::Conn#escape_bytea first if you want to tell your string is a byte
454
482
  * array and the quote that result.
455
483
  */
456
- VALUE pgconn_quote( VALUE self, VALUE obj) { VALUE o, res;
484
+ VALUE pgconn_quote( VALUE self, VALUE obj)
485
+ {
486
+ VALUE o, res;
457
487
 
458
488
  o = rb_funcall( self, id_format, 1, obj);
459
489
  if (!NIL_P( o))
@@ -494,7 +524,7 @@ VALUE pgconn_quote( VALUE self, VALUE obj) { VALUE o, res;
494
524
  } else if (co == rb_cDateTime) {
495
525
  res = rb_obj_as_string( obj);
496
526
  type = "timestamptz";
497
- } else if (co == pg_currency_class() &&
527
+ } else if (co == pg_monetary_class() &&
498
528
  rb_respond_to( obj, id_raw)) {
499
529
  res = rb_funcall( obj, id_raw, 0);
500
530
  StringValue( res);
@@ -555,12 +585,12 @@ quote_string( VALUE conn, VALUE str)
555
585
  VALUE
556
586
  quote_array( VALUE self, VALUE result, VALUE ary)
557
587
  {
558
- long i, j;
588
+ long i;
559
589
  VALUE *o;
560
590
  VALUE cf, co;
561
591
 
562
592
  cf = Qundef;
563
- 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) {
564
594
  co = CLASS_OF( *o);
565
595
  if (cf == Qundef)
566
596
  cf = co;
@@ -622,11 +652,9 @@ pgconn_quote_identifier( VALUE self, VALUE str)
622
652
  void
623
653
  Init_pgsql_conn_quote( void)
624
654
  {
625
- rb_require( "date");
626
- rb_require( "time");
627
655
  rb_cDate = rb_const_get( rb_cObject, rb_intern( "Date"));
628
656
  rb_cDateTime = rb_const_get( rb_cObject, rb_intern( "DateTime"));
629
- rb_cCurrency = Qnil;
657
+ rb_cMoney = Qnil;
630
658
 
631
659
  #ifdef RDOC_NEEDS_THIS
632
660
  rb_cPgConn = rb_define_class_under( rb_mPg, "Conn", rb_cObject);
@@ -660,7 +688,7 @@ Init_pgsql_conn_quote( void)
660
688
  id_to_postgres = rb_intern( "to_postgres");
661
689
  id_gsub = rb_intern( "gsub");
662
690
 
663
- id_currency = rb_intern( "Currency");
691
+ lookup_monetary = 1;
664
692
 
665
693
  pg_string_null = rb_str_new2( "NULL"); rb_global_variable( &pg_string_null); rb_str_freeze( pg_string_null);
666
694
  pg_string_bsl_N = rb_str_new2( "\\N"); rb_global_variable( &pg_string_bsl_N); rb_str_freeze( pg_string_bsl_N);
data/lib/conn_quote.h CHANGED
@@ -10,10 +10,9 @@
10
10
 
11
11
  extern VALUE rb_cDate;
12
12
  extern VALUE rb_cDateTime;
13
- extern VALUE rb_cCurrency;
14
13
 
15
14
 
16
- extern VALUE pg_currency_class( void);
15
+ extern VALUE pg_monetary_class( void);
17
16
 
18
17
 
19
18
  extern VALUE pgconn_stringize( VALUE self, VALUE obj);
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
@@ -5,17 +5,17 @@
5
5
  #include "module.h"
6
6
 
7
7
  #include "conn.h"
8
+ #include "result.h"
8
9
 
9
10
 
10
- #define PGSQL_VERSION "1.3"
11
+ #define PGSQL_VERSION "1.7"
11
12
 
12
13
 
13
14
  VALUE rb_mPg;
14
15
  VALUE rb_ePgError;
15
16
 
16
17
 
17
- /********************************************************************
18
- *
18
+ /*
19
19
  * Document-module: Pg
20
20
  *
21
21
  * The module to enclose everything.
@@ -24,8 +24,7 @@ VALUE rb_ePgError;
24
24
  * connection.
25
25
  */
26
26
 
27
- /********************************************************************
28
- *
27
+ /*
29
28
  * Document-class: Pg::Error
30
29
  *
31
30
  * Generic PostgreSQL error.
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
 
@@ -57,8 +53,6 @@ static VALUE pgresult_cmdstatus( VALUE self);
57
53
  static VALUE pgresult_oid( VALUE self);
58
54
 
59
55
 
60
- static VALUE rb_cBigDecimal;
61
-
62
56
  static VALUE rb_cPgResult;
63
57
  static VALUE rb_ePgResError;
64
58
 
@@ -216,13 +210,6 @@ pgresult_s_translate_results_set( VALUE cls, VALUE fact)
216
210
 
217
211
 
218
212
 
219
- void
220
- pgresult_mark( struct pgresult_data *ptr)
221
- {
222
- rb_gc_mark( ptr->fields);
223
- rb_gc_mark( ptr->indices);
224
- }
225
-
226
213
  void
227
214
  pgresult_free( struct pgresult_data *ptr)
228
215
  {
@@ -280,8 +267,8 @@ pgresult_clear( VALUE self)
280
267
 
281
268
  Data_Get_Struct( self, struct pgresult_data, r);
282
269
  if (r->res != NULL) {
283
- PQclear( r->res);
284
- r->res = NULL;
270
+ PQclear( r->res);
271
+ r->res = NULL;
285
272
  }
286
273
  return Qnil;
287
274
  }
@@ -513,7 +500,7 @@ pg_fetchrow( struct pgresult_data *r, int num)
513
500
  n = PQnfields( r->res);
514
501
  if (num < PQntuples( r->res)) {
515
502
  row = rb_ary_new2( n);
516
- for (i = 0, n; n; ++i, --n)
503
+ for (i = 0; n; ++i, --n)
517
504
  rb_ary_store( row, i, pg_fetchresult( r, num, i));
518
505
  } else
519
506
  row = Qnil;
@@ -525,7 +512,7 @@ pg_fetchresult( struct pgresult_data *r, int row, int col)
525
512
  {
526
513
  char *string;
527
514
  Oid typ;
528
- VALUE ret;
515
+ VALUE cls, ret;
529
516
 
530
517
  if (PQgetisnull( r->res, row, col))
531
518
  return Qnil;
@@ -538,50 +525,59 @@ pg_fetchresult( struct pgresult_data *r, int row, int col)
538
525
  return pgconn_mkstring( r->conn, string);
539
526
 
540
527
  typ = PQftype( r->res, col);
528
+ cls = Qnil;
529
+ ret = Qnil;
541
530
  switch (typ) {
542
531
  case NUMERICOID:
543
532
  {
544
533
  int typmod;
545
534
 
546
535
  typmod = PQfmod( r->res, col);
547
- if (typmod == -1 || (typmod - VARHDRSZ) & 0xffff)
536
+ if (typmod == -1 || (typmod - VARHDRSZ) & 0xffff) {
537
+ ret = rb_funcall( Qnil, rb_intern( "BigDecimal"), 1, rb_str_new2( string));
548
538
  break;
539
+ }
549
540
  }
550
- /* if scale == 0 fall through and return inum */
541
+ /* fall through if scale == 0 */
551
542
  case INT8OID:
552
543
  case INT4OID:
553
544
  case INT2OID:
554
545
  case OIDOID:
555
- return rb_cstr_to_inum( string, 10, 0);
546
+ ret = rb_cstr_to_inum( string, 10, 0);
547
+ break;
556
548
  case FLOAT8OID:
557
549
  case FLOAT4OID:
558
- return rb_float_new( rb_cstr_to_dbl( string, Qfalse));
550
+ ret = rb_float_new( rb_cstr_to_dbl( string, Qfalse));
551
+ break;
559
552
  case BOOLOID:
560
- return *string == 't' ? Qtrue : Qfalse;
561
- /* strchr( "tTyY", *string) != NULL */
553
+ ret = strchr( "tTyY", *string) != NULL ? Qtrue : Qfalse;
554
+ break;
562
555
  case BYTEAOID:
563
- return rb_str_new2( string);
564
- default:
556
+ ret = rb_str_new2( string);
565
557
  break;
566
- }
567
- ret = pgconn_mkstring( r->conn, string);
568
- switch (typ) {
569
- case NUMERICOID:
570
- return rb_funcall( rb_cBigDecimal, id_new, 1, ret);
571
558
  case DATEOID:
572
- return rb_funcall( rb_cDate, id_parse, 1, ret);
559
+ cls = rb_cDate;
560
+ break;
573
561
  case TIMEOID:
574
562
  case TIMETZOID:
575
- return rb_funcall( rb_cTime, id_parse, 1, ret);
563
+ cls = rb_cTime;
564
+ break;
576
565
  case TIMESTAMPOID:
577
566
  case TIMESTAMPTZOID:
578
- return rb_funcall( rb_cDateTime, id_parse, 1, ret);
567
+ cls = rb_cDateTime;
568
+ break;
579
569
  case CASHOID:
580
- return RTEST( pg_currency_class()) ?
581
- rb_funcall( rb_cCurrency, id_parse, 1, ret) : ret;
570
+ cls = pg_monetary_class();
571
+ break;
582
572
  default:
583
- return ret;
573
+ break;
584
574
  }
575
+ if (NIL_P( ret)) {
576
+ ret = pgconn_mkstring( r->conn, string);
577
+ if (RTEST( cls))
578
+ ret = rb_funcall( cls, id_parse, 1, ret);
579
+ }
580
+ return ret;
585
581
  }
586
582
 
587
583
  /*
@@ -803,9 +799,6 @@ pgresult_oid( VALUE self)
803
799
  void
804
800
  Init_pgsql_result( void)
805
801
  {
806
- rb_require( "bigdecimal");
807
- rb_cBigDecimal = rb_const_get( rb_cObject, rb_intern( "BigDecimal"));
808
-
809
802
  rb_cPgResult = rb_define_class_under( rb_mPg, "Result", rb_cObject);
810
803
 
811
804
 
metadata CHANGED
@@ -1,38 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgsql
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.3'
4
+ version: '1.7'
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: 2013-11-29 00:00:00.000000000 Z
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: autorake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
- description: ! 'This is not the official PostgreSQL library that was originally written
28
- by Guy
29
-
30
- Decoux. As the project wasn''t maintained a long time after Guy''s decease, I
31
-
27
+ description: |
28
+ This is not the official PostgreSQL library that was originally written by Guy
29
+ Decoux. As the project wasn't maintained a long time after Guy's decease, I
32
30
  decided to fork my own project.
33
-
34
- '
35
- email: <software@bertram-scharpf.de>
31
+ email: "<software@bertram-scharpf.de>"
36
32
  executables: []
37
33
  extensions:
38
34
  - lib/mkrf_conf
@@ -40,47 +36,45 @@ extra_rdoc_files:
40
36
  - README
41
37
  - LICENSE
42
38
  files:
39
+ - LICENSE
40
+ - README
43
41
  - lib/Rakefile
44
- - lib/mkrf_conf
45
- - lib/undef.h
46
- - lib/module.h
47
- - lib/module.c
48
- - lib/conn.h
49
42
  - lib/conn.c
50
- - lib/conn_quote.h
51
- - lib/conn_quote.c
52
- - lib/conn_exec.h
43
+ - lib/conn.h
53
44
  - lib/conn_exec.c
54
- - lib/result.h
45
+ - lib/conn_exec.h
46
+ - lib/conn_quote.c
47
+ - lib/conn_quote.h
48
+ - lib/mkrf_conf
49
+ - lib/module.c
50
+ - lib/module.h
55
51
  - lib/result.c
56
- - README
57
- - LICENSE
52
+ - lib/result.h
53
+ - lib/undef.h
58
54
  homepage: http://www.bertram-scharpf.de/software/pgsql
59
- licenses: []
55
+ licenses:
56
+ - BSD-2-Clause
60
57
  metadata: {}
61
- post_install_message:
58
+ post_install_message:
62
59
  rdoc_options:
63
- - --charset
64
- - utf-8
65
- - --main
60
+ - "--main"
66
61
  - README
67
62
  require_paths:
68
63
  - lib
69
64
  required_ruby_version: !ruby/object:Gem::Requirement
70
65
  requirements:
71
- - - ! '>='
66
+ - - ">="
72
67
  - !ruby/object:Gem::Version
73
68
  version: '0'
74
69
  required_rubygems_version: !ruby/object:Gem::Requirement
75
70
  requirements:
76
- - - ! '>='
71
+ - - ">="
77
72
  - !ruby/object:Gem::Version
78
73
  version: '0'
79
74
  requirements:
80
75
  - PostgreSQL
81
- rubyforge_project: NONE
82
- rubygems_version: 2.1.11
83
- signing_key:
76
+ rubygems_version: 3.0.8
77
+ signing_key:
84
78
  specification_version: 4
85
79
  summary: PostgreSQL-API for Ruby
86
80
  test_files: []