Hello community, here is the log from the commit of package rubygem-pg for openSUSE:Factory checked in at 2015-05-16 07:14:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-pg (Old) and /work/SRC/openSUSE:Factory/.rubygem-pg.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-pg" Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-pg/rubygem-pg.changes 2015-02-10 20:21:51.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-pg.new/rubygem-pg.changes 2015-05-16 07:14:20.000000000 +0200 @@ -1,0 +2,173 @@ +Fri May 15 04:31:04 UTC 2015 - [email protected] + +- updated to version 0.18.2 + see installed ChangeLog + + 2015-05-14 Michael Granger <[email protected]> + + * .rvmrc: + Bump default rvm Ruby to 2.2 + [128b075d5800] [tip] + + 2015-03-13 Lars Kanis <[email protected]> + + * ext/pg_text_encoder.c, ext/util.c, ext/util.h: + Avoid possible symbol name clash when linking againt static libpq. + + This should fix issue #209 . + [b859963462b2] + + 2015-02-11 Lars Kanis <[email protected]> + + * ext/pg.c, spec/pg/connection_spec.rb: + Merge from git branch. + [b60c89ee93c8] + + * ext/pg.h, ext/pg_text_decoder.c: + Merge branch 'non-c99-compiler' + [b111c84b8445] + + 2015-02-06 Lars Kanis <[email protected]> + + * ext/extconf.rb, ext/pg.h, ext/pg_result.c, ext/pg_text_decoder.c, + ext/pg_type_map_by_mri_type.c: + Use fixed size arrays in case the compiler doesn't support C99 + variable length arrays. + + This is notably the MSVC compiler. + + Note: The MSVC build environment is currently not tested on a + regular base, so is not fully supported. + [1269b8ad77b8] + + 2015-02-11 Lars Kanis <[email protected]> + + * ext/pg_connection.c: + Replace quote_ident implementation with that of + PG::TextEncoder::Identifier . + + This allowes quoation of array of strings in addition to plain + strings and removes duplicated code. + + It also removes the 63 byte limitation and therefore obsolets pull + request #21 https://bitbucket.org/ged/ruby-pg/pull-request/21 + [714601d05fba] + + * ext/pg.c, ext/pg.h, ext/pg_text_decoder.c, ext/pg_text_encoder.c, + spec/pg/connection_spec.rb, spec/pg/type_spec.rb: + Derive PG::TextDecoder::Identifier from PG::SimpleDecoder instead of + CompositeDecoder + + .. and equally for Encoder. + + Identifiers are strings, so there is no good reason to compose it + from other element types. This change allows a faster quoting + implementation. + [df67241d1a4f] + + 2015-02-03 Michael Granger <[email protected]> + + * README.rdoc, ext/pg.c: + Update copyright notices + [447962e0dcba] [github/master] + + * spec/pg/connection_spec.rb: + Whitespace fixes + [f4a85f78807d] + + 2014-08-22 Chris Bandy <[email protected]> + + * lib/pg/connection.rb, spec/pg/connection_spec.rb: + Allow URI connection string + + (Imported from https://github.com/ged/ruby-pg/pull/3) + [d4579ef9eae4] + + 2015-01-27 Lars Kanis <[email protected]> + + * lib/pg/text_decoder.rb, spec/pg/type_spec.rb: + Fix decoding of fractional timezones like "-00:25:21". + [766aa353b392] + + 2015-01-27 Lars Kanis <[email protected]> + + * History.rdoc, lib/pg/text_decoder.rb, spec/pg/type_spec.rb: + Fix decoding of fractional timezones like "04:30". + + This fixes https://bitbucket.org/ged/ruby-pg/issue/203 . + [33225805259c] + + 2015-01-16 Lars Kanis <[email protected]> + + * History.rdoc, ext/extconf.rb, ext/pg_connection.c, + spec/pg/connection_spec.rb: + Revert "Add PG::Connection#hostaddr. This is new in PostgreSQL-9.4." + + PQhostaddr was removed from final PostgreSQL-9.4.0. + + This fixes issue #202 :https://bitbucket.org/ged/ruby-pg/issue/202 + + This reverts commit 03deab7aa63f9a00984014ce59617d552b4eac34. + [b51d736bca77] + + * History.rdoc: + Add a missing enhancement for pg-0.18.0 + [a7635c3425f3] + + * .travis.yml: + Update ruby and postgresql versions for travic-ci + [b67b92f7db97] + + 2015-01-06 Lars Kanis <[email protected]> + + * Merge from git. + [625e9359ac47] + + 2015-01-05 Lars Kanis <[email protected]> + + * ext/pg_type_map_in_ruby.c: + Use a simpler fix for https://bitbucket.org/ged/ruby- + pg/commits/a38cf53a96f + [3d89d3aae4fd] + + 2015-01-05 Michael Granger <[email protected]> + + * .hgtags: + Added tag v0.18.1 for changeset f97dd6cb4f34 + [f8122014065a] + + * .hgsigs: + Added signature for changeset ba5aff64b5cb + [f97dd6cb4f34] [v0.18.1] + + * History.rdoc, lib/pg.rb: + Bump the patch version, update history + [ba5aff64b5cb] + + * Rakefile: + Fix the minimum Ruby version (closes #199) + [69422cc8dc45] + + 2015-01-03 Michael Granger <[email protected]> + + * .hgtags: + Added tag v0.18.0 for changeset cfb2bfc0f661 + [8aff3973f2d2] + + * .hgsigs: + Added signature for changeset c519766e3ec9 + [cfb2bfc0f661] [v0.18.0] + + * History.rdoc: + Update the History + [c519766e3ec9] + + * Manifest.txt: + Keep the manifest sorted so it can be diffed. + [d7cdbfd1b516] + + * Rakefile: + Add a Rake task for generating the gemspec + [ec6d6ce61a15] + +------------------------------------------------------------------- Old: ---- pg-0.18.1.gem New: ---- pg-0.18.2.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-pg.spec ++++++ --- /var/tmp/diff_new_pack.28qWmT/_old 2015-05-16 07:14:21.000000000 +0200 +++ /var/tmp/diff_new_pack.28qWmT/_new 2015-05-16 07:14:21.000000000 +0200 @@ -24,7 +24,7 @@ # Name: rubygem-pg -Version: 0.18.1 +Version: 0.18.2 Release: 0 %define mod_name pg %define mod_full_name %{mod_name}-%{version} ++++++ pg-0.18.1.gem -> pg-0.18.2.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ChangeLog new/ChangeLog --- old/ChangeLog 2015-01-05 21:59:11.000000000 +0100 +++ new/ChangeLog 2015-05-14 20:50:00.000000000 +0200 @@ -1,9 +1,176 @@ +2015-05-14 Michael Granger <[email protected]> + + * .rvmrc: + Bump default rvm Ruby to 2.2 + [128b075d5800] [tip] + +2015-03-13 Lars Kanis <[email protected]> + + * ext/pg_text_encoder.c, ext/util.c, ext/util.h: + Avoid possible symbol name clash when linking againt static libpq. + + This should fix issue #209 . + [b859963462b2] + +2015-02-11 Lars Kanis <[email protected]> + + * ext/pg.c, spec/pg/connection_spec.rb: + Merge from git branch. + [b60c89ee93c8] + + * ext/pg.h, ext/pg_text_decoder.c: + Merge branch 'non-c99-compiler' + [b111c84b8445] + +2015-02-06 Lars Kanis <[email protected]> + + * ext/extconf.rb, ext/pg.h, ext/pg_result.c, ext/pg_text_decoder.c, + ext/pg_type_map_by_mri_type.c: + Use fixed size arrays in case the compiler doesn't support C99 + variable length arrays. + + This is notably the MSVC compiler. + + Note: The MSVC build environment is currently not tested on a + regular base, so is not fully supported. + [1269b8ad77b8] + +2015-02-11 Lars Kanis <[email protected]> + + * ext/pg_connection.c: + Replace quote_ident implementation with that of + PG::TextEncoder::Identifier . + + This allowes quoation of array of strings in addition to plain + strings and removes duplicated code. + + It also removes the 63 byte limitation and therefore obsolets pull + request #21 https://bitbucket.org/ged/ruby-pg/pull-request/21 + [714601d05fba] + + * ext/pg.c, ext/pg.h, ext/pg_text_decoder.c, ext/pg_text_encoder.c, + spec/pg/connection_spec.rb, spec/pg/type_spec.rb: + Derive PG::TextDecoder::Identifier from PG::SimpleDecoder instead of + CompositeDecoder + + .. and equally for Encoder. + + Identifiers are strings, so there is no good reason to compose it + from other element types. This change allows a faster quoting + implementation. + [df67241d1a4f] + +2015-02-03 Michael Granger <[email protected]> + + * README.rdoc, ext/pg.c: + Update copyright notices + [447962e0dcba] [github/master] + + * spec/pg/connection_spec.rb: + Whitespace fixes + [f4a85f78807d] + +2014-08-22 Chris Bandy <[email protected]> + + * lib/pg/connection.rb, spec/pg/connection_spec.rb: + Allow URI connection string + + (Imported from https://github.com/ged/ruby-pg/pull/3) + [d4579ef9eae4] + +2015-01-27 Lars Kanis <[email protected]> + + * lib/pg/text_decoder.rb, spec/pg/type_spec.rb: + Fix decoding of fractional timezones like "-00:25:21". + [766aa353b392] + +2015-01-27 Lars Kanis <[email protected]> + + * History.rdoc, lib/pg/text_decoder.rb, spec/pg/type_spec.rb: + Fix decoding of fractional timezones like "04:30". + + This fixes https://bitbucket.org/ged/ruby-pg/issue/203 . + [33225805259c] + +2015-01-16 Lars Kanis <[email protected]> + + * History.rdoc, ext/extconf.rb, ext/pg_connection.c, + spec/pg/connection_spec.rb: + Revert "Add PG::Connection#hostaddr. This is new in PostgreSQL-9.4." + + PQhostaddr was removed from final PostgreSQL-9.4.0. + + This fixes issue #202 :https://bitbucket.org/ged/ruby-pg/issue/202 + + This reverts commit 03deab7aa63f9a00984014ce59617d552b4eac34. + [b51d736bca77] + + * History.rdoc: + Add a missing enhancement for pg-0.18.0 + [a7635c3425f3] + + * .travis.yml: + Update ruby and postgresql versions for travic-ci + [b67b92f7db97] + +2015-01-06 Lars Kanis <[email protected]> + + * Merge from git. + [625e9359ac47] + +2015-01-05 Lars Kanis <[email protected]> + + * ext/pg_type_map_in_ruby.c: + Use a simpler fix for https://bitbucket.org/ged/ruby- + pg/commits/a38cf53a96f + [3d89d3aae4fd] + +2015-01-05 Michael Granger <[email protected]> + + * .hgtags: + Added tag v0.18.1 for changeset f97dd6cb4f34 + [f8122014065a] + + * .hgsigs: + Added signature for changeset ba5aff64b5cb + [f97dd6cb4f34] [v0.18.1] + + * History.rdoc, lib/pg.rb: + Bump the patch version, update history + [ba5aff64b5cb] + + * Rakefile: + Fix the minimum Ruby version (closes #199) + [69422cc8dc45] + +2015-01-03 Michael Granger <[email protected]> + + * .hgtags: + Added tag v0.18.0 for changeset cfb2bfc0f661 + [8aff3973f2d2] + + * .hgsigs: + Added signature for changeset c519766e3ec9 + [cfb2bfc0f661] [v0.18.0] + + * History.rdoc: + Update the History + [c519766e3ec9] + + * Manifest.txt: + Keep the manifest sorted so it can be diffed. + [d7cdbfd1b516] + + * Rakefile: + Add a Rake task for generating the gemspec + [ec6d6ce61a15] + 2014-12-26 Lars Kanis <[email protected]> * lib/pg/basic_type_mapping.rb: Add a warning about Type OIDs without decoder in PG::BasicTypeMapForResults. - [592e29cdf2e9] [tip] + [592e29cdf2e9] 2014-12-13 Lars Kanis <[email protected]> @@ -285,7 +452,7 @@ * ext/pg_text_encoder.c, spec/pg/type_spec.rb: Allow non Array values as input for TextEncoder::Array. - [a4725dfca9e4] [github/master] + [a4725dfca9e4] * ext/pg_coder.c, spec/pg/type_spec.rb: Clarify handling of nil/NULL values by PG::Coders. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/History.rdoc new/History.rdoc --- old/History.rdoc 2015-01-05 21:59:11.000000000 +0100 +++ new/History.rdoc 2015-05-14 20:50:00.000000000 +0200 @@ -1,3 +1,18 @@ +== v0.18.2 [2015-05-14] Michael Granger <[email protected]> + +Enhancements: + +- Allow URI connection string (thanks to Chris Bandy) + +Bugfixes: + +- Speedups and fixes for PG::TextDecoder::Identifier and quoting behavior +- Revert addition of PG::Connection#hostaddr [#202]. +- Fix decoding of fractional timezones and timestamps [#203] +- Fixes for non-C99 compilers +- Avoid possible symbol name clash when linking againt static libpq. + + == v0.18.1 [2015-01-05] Michael Granger <[email protected]> Correct the minimum compatible Ruby version to 1.9.3. #199 @@ -19,6 +34,7 @@ - Add Enumerator variant to PG::Result#each and #each_row. - Add PG::Connection#conninfo and #hostaddr. - Add PG.init_openssl and PG.init_ssl methods. +- Add PG::Result.inspect - Force zero termination for all text strings that are given to libpq. It raises an ArgumentError if the string contains a null byte. - Update Windows cross build to PostgreSQL 9.3. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.rdoc new/README.rdoc --- old/README.rdoc 2015-01-05 21:59:11.000000000 +0100 +++ new/README.rdoc 2015-05-14 20:50:00.000000000 +0200 @@ -130,7 +130,7 @@ == Copying -Copyright (c) 1997-2013 by the authors. +Copyright (c) 1997-2015 by the authors. * Jeff Davis <[email protected]> * Guy Decoux (ts) <[email protected]> Files old/checksums.yaml.gz and new/checksums.yaml.gz differ Files old/checksums.yaml.gz.sig and new/checksums.yaml.gz.sig differ Files old/data.tar.gz.sig and new/data.tar.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/extconf.rb new/ext/extconf.rb --- old/ext/extconf.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/extconf.rb 2015-05-14 20:50:00.000000000 +0200 @@ -73,7 +73,6 @@ have_func 'PQping' have_func 'PQsetSingleRowMode' have_func 'PQconninfo' -have_func 'PQhostaddr' have_func 'rb_encdb_alias' have_func 'rb_enc_alias' @@ -95,6 +94,10 @@ have_header 'unistd.h' have_header 'ruby/st.h' or have_header 'st.h' or abort "pg currently requires the ruby/st.h header" +checking_for "C99 variable length arrays" do + $defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }') +end + create_header() create_makefile( "pg_ext" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg.c new/ext/pg.c --- old/ext/pg.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg.c - Toplevel extension - * $Id: pg.c,v a9724aef9116 2014/12/12 21:03:27 lars $ + * $Id: pg.c,v b60c89ee93c8 2015/02/11 20:59:36 lars $ * * Author/s: * @@ -15,7 +15,7 @@ * See Contributors.rdoc for the many additional fine people that have contributed * to this library over the years. * - * Copyright (c) 1997-2012 by the authors. + * Copyright (c) 1997-2015 by the authors. * * You may redistribute this software under the same terms as Ruby itself; see * http://www.ruby-lang.org/en/LICENSE.txt or the LICENSE file in the source @@ -252,7 +252,7 @@ * char *current_out, *end_capa; * PG_RB_STR_NEW( string, current_out, end_capa ); * while( data_is_going_to_be_processed ){ - * PG_RB_STR_ENSURE_CAPA( string, 2 current_out, end_capa ); + * PG_RB_STR_ENSURE_CAPA( string, 2, current_out, end_capa ); * *current_out++ = databyte1; * *current_out++ = databyte2; * } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg.h new/ext/pg.h --- old/ext/pg.h 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg.h 2015-05-14 20:50:00.000000000 +0200 @@ -133,6 +133,15 @@ typedef long suseconds_t; #endif +#if defined(HAVE_VARIABLE_LENGTH_ARRAYS) + #define PG_VARIABLE_LENGTH_ARRAY(type, name, len, maxlen) type name[(len)]; +#else + #define PG_VARIABLE_LENGTH_ARRAY(type, name, len, maxlen) \ + type name[(maxlen)] = {(len)>(maxlen) ? (rb_raise(rb_eArgError, "Number of " #name " (%d) exceeds allowed maximum of " #maxlen, (len) ), (type)1) : (type)0}; + + #define PG_MAX_COLUMNS 4000 +#endif + /* The data behind each PG::Connection object */ typedef struct { PGconn *pgconn; @@ -313,6 +322,7 @@ VALUE pg_bin_dec_bytea _(( t_pg_coder*, char *, int, int, int, int )); VALUE pg_text_dec_string _(( t_pg_coder*, char *, int, int, int, int )); int pg_coder_enc_to_s _(( t_pg_coder*, VALUE, char *, VALUE *)); +int pg_text_enc_identifier _(( t_pg_coder*, VALUE, char *, VALUE *)); t_pg_coder_enc_func pg_coder_enc_func _(( t_pg_coder* )); t_pg_coder_dec_func pg_coder_dec_func _(( t_pg_coder*, int )); void pg_define_coder _(( const char *, void *, VALUE, VALUE )); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_connection.c new/ext/pg_connection.c --- old/ext/pg_connection.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_connection.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_connection.c - PG::Connection class extension - * $Id: pg_connection.c,v a7befacdef4e 2014/12/12 20:57:14 lars $ + * $Id: pg_connection.c,v 714601d05fba 2015/02/11 20:45:04 lars $ * */ @@ -627,22 +627,6 @@ return rb_tainted_str_new2(host); } -#ifdef HAVE_PQHOSTADDR -/* - * call-seq: - * conn.hostaddr() - * - * Returns the server numeric IP address of the connection. - */ -static VALUE -pgconn_hostaddr(VALUE self) -{ - char *hostaddr = PQhostaddr(pg_get_pgconn(self)); - if (!hostaddr) return Qnil; - return rb_tainted_str_new2(hostaddr); -} -#endif - /* * call-seq: * conn.port() @@ -3013,7 +2997,9 @@ /* * call-seq: * PG::Connection.quote_ident( str ) -> String + * PG::Connection.quote_ident( array ) -> String * conn.quote_ident( str ) -> String + * conn.quote_ident( array ) -> String * * Returns a string that is safe for inclusion in a SQL query as an * identifier. Note: this is not a quote function for values, but for @@ -3030,31 +3016,20 @@ * Similarly, this function also protects against special characters, * and other things that might allow SQL injection if the identifier * comes from an untrusted source. + * + * If the parameter is an Array, then all it's values are separately quoted + * and then joined by a "." character. This can be used for identifiers in + * the form "schema"."table"."column" . + * + * This method is functional identical to the encoder PG::TextEncoder::Identifier . + * */ static VALUE pgconn_s_quote_ident(VALUE self, VALUE in_str) { VALUE ret; - char *str = StringValuePtr(in_str); - /* result size at most NAMEDATALEN*2 plus surrounding - * double-quotes. */ - char buffer[NAMEDATALEN*2+2]; - unsigned int i=0,j=0; - unsigned int str_len = RSTRING_LENINT(in_str); - - if(str_len >= NAMEDATALEN) { - rb_raise(rb_eArgError, - "Input string is longer than NAMEDATALEN-1 (%d)", - NAMEDATALEN-1); - } - buffer[j++] = '"'; - for(i = 0; i < str_len && str[i]; i++) { - if(str[i] == '"') - buffer[j++] = '"'; - buffer[j++] = str[i]; - } - buffer[j++] = '"'; - ret = rb_str_new(buffer,j); + pg_text_enc_identifier(NULL, in_str, NULL, &ret); + OBJ_INFECT(ret, in_str); PG_ENCODING_SET_NOCHECK(ret, ENCODING_GET( rb_obj_class(self) == rb_cPGconn ? self : in_str )); @@ -3835,9 +3810,6 @@ rb_define_method(rb_cPGconn, "user", pgconn_user, 0); rb_define_method(rb_cPGconn, "pass", pgconn_pass, 0); rb_define_method(rb_cPGconn, "host", pgconn_host, 0); -#ifdef HAVE_PQHOSTADDR - rb_define_method(rb_cPGconn, "hostaddr", pgconn_hostaddr, 0); -#endif rb_define_method(rb_cPGconn, "port", pgconn_port, 0); rb_define_method(rb_cPGconn, "tty", pgconn_tty, 0); #ifdef HAVE_PQCONNINFO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_result.c new/ext/pg_result.c --- old/ext/pg_result.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_result.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_result.c - PG::Result class extension - * $Id: pg_result.c,v f23dd01bcb52 2014/11/17 10:47:53 kanis $ + * $Id: pg_result.c,v 1269b8ad77b8 2015/02/06 16:38:23 lars $ * */ @@ -863,7 +863,7 @@ num_fields = PQnfields(this->pgresult); for ( row = 0; row < num_rows; row++ ) { - VALUE row_values[num_fields]; + PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, num_fields, PG_MAX_COLUMNS) /* populate the row */ for ( field = 0; field < num_fields; field++ ) { @@ -892,7 +892,7 @@ VALUE results = rb_ary_new2( num_rows ); for ( row = 0; row < num_rows; row++ ) { - VALUE row_values[num_fields]; + PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, num_fields, PG_MAX_COLUMNS) /* populate the row */ for ( field = 0; field < num_fields; field++ ) { @@ -1176,7 +1176,7 @@ } for ( row = 0; row < ntuples; row++ ) { - VALUE row_values[nfields]; + PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, nfields, PG_MAX_COLUMNS) int field; /* populate the row */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_text_decoder.c new/ext/pg_text_decoder.c --- old/ext/pg_text_decoder.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_text_decoder.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_text_decoder.c - PG::TextDecoder module - * $Id: pg_text_decoder.c,v b7f9daeeba29 2014/11/21 19:53:47 lars $ + * $Id: pg_text_decoder.c,v b111c84b8445 2015/02/11 20:54:03 lars $ * */ @@ -293,7 +293,7 @@ } /* - * Document-class: PG::TextDecoder::Identifier < PG::CompositeDecoder + * Document-class: PG::TextDecoder::Identifier < PG::SimpleDecoder * * This is the decoder class for PostgreSQL identifiers. * @@ -305,16 +305,13 @@ static VALUE pg_text_dec_identifier(t_pg_coder *conv, char *val, int len, int tuple, int field, int enc_idx) { - t_pg_composite_coder *this = (t_pg_composite_coder *)conv; - t_pg_coder_dec_func dec_func = pg_coder_dec_func(this->elem, 0); - /* Return value: array */ VALUE array; VALUE elem; int word_index = 0; int index; /* Use a buffer of the same length, as that will be the worst case */ - char word[len + 1]; + PG_VARIABLE_LENGTH_ARRAY(char, word, len + 1, NAMEDATALEN) /* The current character in the input string. */ char c; @@ -331,7 +328,7 @@ if(c == '.' && openQuote < 2 ) { word[word_index] = 0; - elem = dec_func(conv, word, word_index, tuple, field, enc_idx); + elem = pg_text_dec_string(conv, word, word_index, tuple, field, enc_idx); rb_ary_push(array, elem); openQuote = 0; @@ -353,7 +350,7 @@ } word[word_index] = 0; - elem = dec_func(conv, word, word_index, tuple, field, enc_idx); + elem = pg_text_dec_string(conv, word, word_index, tuple, field, enc_idx); rb_ary_push(array, elem); return array; @@ -412,11 +409,11 @@ pg_define_coder( "String", pg_text_dec_string, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder ); /* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Bytea", rb_cPG_SimpleDecoder ); */ pg_define_coder( "Bytea", pg_text_dec_bytea, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder ); + /* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Identifier", rb_cPG_SimpleDecoder ); */ + pg_define_coder( "Identifier", pg_text_dec_identifier, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder ); /* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Array", rb_cPG_CompositeDecoder ); */ pg_define_coder( "Array", pg_text_dec_array, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder ); - /* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Identifier", rb_cPG_CompositeDecoder ); */ - pg_define_coder( "Identifier", pg_text_dec_identifier, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder ); /* dummy = rb_define_class_under( rb_mPG_TextDecoder, "FromBase64", rb_cPG_CompositeDecoder ); */ pg_define_coder( "FromBase64", pg_text_dec_from_base64, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_text_encoder.c new/ext/pg_text_encoder.c --- old/ext/pg_text_encoder.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_text_encoder.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_text_encoder.c - PG::TextEncoder module - * $Id: pg_text_encoder.c,v 1a13e7eafeb7 2014/12/12 20:57:39 lars $ + * $Id: pg_text_encoder.c,v b859963462b2 2015/03/13 17:39:35 lars $ * */ @@ -299,7 +299,7 @@ /* count data plus backslashes; detect chars needing quotes */ if (strlen == 0) needquote = 1; /* force quotes for empty string */ - else if (strlen == 4 && pg_strncasecmp(p_in, "NULL", strlen) == 0) + else if (strlen == 4 && rbpg_strncasecmp(p_in, "NULL", strlen) == 0) needquote = 1; /* force quotes for literal NULL */ else needquote = 0; @@ -455,39 +455,34 @@ } } -static int -quote_identifier_buffer( void *_this, char *p_in, int strlen, char *p_out ){ +static char * +quote_identifier( VALUE value, VALUE out_string, char *current_out ){ + char *p_in = RSTRING_PTR(value); char *ptr1; - char *ptr2; - int backslashs = 0; + size_t strlen = RSTRING_LEN(value); + char *end_capa = current_out; - /* count required backlashs */ + PG_RB_STR_ENSURE_CAPA( out_string, strlen + 2, current_out, end_capa ); + *current_out++ = '"'; for(ptr1 = p_in; ptr1 != p_in + strlen; ptr1++) { - if (*ptr1 == '"'){ - backslashs++; + char c = *ptr1; + if (c == '"'){ + strlen++; + PG_RB_STR_ENSURE_CAPA( out_string, p_in - ptr1 + strlen + 1, current_out, end_capa ); + *current_out++ = '"'; + } else if (c == 0){ + break; } + *current_out++ = c; } + PG_RB_STR_ENSURE_CAPA( out_string, 1, current_out, end_capa ); + *current_out++ = '"'; - ptr1 = p_in + strlen; - ptr2 = p_out + strlen + backslashs + 2; - /* Write end quote */ - *--ptr2 = '"'; - - /* Then store the escaped string on the final position, walking - * right to left, until all backslashs are placed. */ - while( ptr1 != p_in ) { - *--ptr2 = *--ptr1; - if(*ptr2 == '"'){ - *--ptr2 = '"'; - } - } - /* Write start quote */ - *p_out = '"'; - return strlen + backslashs + 2; + return current_out; } static char * -pg_text_enc_array_identifier(t_pg_composite_coder *this, VALUE value, VALUE string, char *out) +pg_text_enc_array_identifier(VALUE value, VALUE string, char *out) { int i; int nr_elems; @@ -498,7 +493,7 @@ for( i=0; i<nr_elems; i++){ VALUE entry = rb_ary_entry(value, i); - out = quote_string(this->elem, entry, string, out, this->needs_quotation, quote_identifier_buffer, this); + out = quote_identifier(entry, string, out); if( i < nr_elems-1 ){ out = pg_rb_str_ensure_capa( string, 1, out, NULL ); *out++ = '.'; @@ -508,27 +503,29 @@ } /* - * Document-class: PG::TextEncoder::Identifier < PG::CompositeEncoder + * Document-class: PG::TextEncoder::Identifier < PG::SimpleEncoder * * This is the encoder class for PostgreSQL identifiers. * * An Array value can be used for "schema.table.column" type identifiers: * PG::TextEncoder::Identifier.new.encode(['schema', 'table', 'column']) - * => "schema"."table"."column" + * => '"schema"."table"."column"' * + * This encoder can also be used per PG::Connection#quote_ident . */ -static int -pg_text_enc_identifier(t_pg_coder *conv, VALUE value, char *out, VALUE *intermediate) +int +pg_text_enc_identifier(t_pg_coder *this, VALUE value, char *out, VALUE *intermediate) { - t_pg_composite_coder *this = (t_pg_composite_coder *)conv; - - *intermediate = rb_str_new(NULL, 0); - out = RSTRING_PTR(*intermediate); - + UNUSED( this ); if( TYPE(value) == T_ARRAY){ - out = pg_text_enc_array_identifier(this, value, *intermediate, out); + *intermediate = rb_str_new(NULL, 0); + out = RSTRING_PTR(*intermediate); + out = pg_text_enc_array_identifier(value, *intermediate, out); } else { - out = quote_string(this->elem, value, *intermediate, out, this->needs_quotation, quote_identifier_buffer, this); + StringValue(value); + *intermediate = rb_str_new(NULL, RSTRING_LEN(value) + 2); + out = RSTRING_PTR(*intermediate); + out = quote_identifier(value, *intermediate, out); } rb_str_set_len( *intermediate, out - RSTRING_PTR(*intermediate) ); return -1; @@ -651,11 +648,11 @@ pg_define_coder( "String", pg_coder_enc_to_s, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder ); /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Bytea", rb_cPG_SimpleEncoder ); */ pg_define_coder( "Bytea", pg_text_enc_bytea, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder ); + /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Identifier", rb_cPG_SimpleEncoder ); */ + pg_define_coder( "Identifier", pg_text_enc_identifier, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder ); /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Array", rb_cPG_CompositeEncoder ); */ pg_define_coder( "Array", pg_text_enc_array, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder ); - /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Identifier", rb_cPG_CompositeEncoder ); */ - pg_define_coder( "Identifier", pg_text_enc_identifier, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder ); /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "QuotedLiteral", rb_cPG_CompositeEncoder ); */ pg_define_coder( "QuotedLiteral", pg_text_enc_quoted_literal, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder ); /* dummy = rb_define_class_under( rb_mPG_TextEncoder, "ToBase64", rb_cPG_CompositeEncoder ); */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_type_map_by_mri_type.c new/ext/pg_type_map_by_mri_type.c --- old/ext/pg_type_map_by_mri_type.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_type_map_by_mri_type.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_type_map_by_mri_type.c - PG::TypeMapByMriType class extension - * $Id: pg_type_map_by_mri_type.c,v 27987dbd0b32 2014/11/07 20:55:52 lars $ + * $Id: pg_type_map_by_mri_type.c,v 1269b8ad77b8 2015/02/06 16:38:23 lars $ * * This type map can be used to select value encoders based on the MRI-internal * value type code. @@ -39,7 +39,7 @@ typedef struct { t_typemap typemap; struct pg_tmbmt_converter { - FOR_EACH_MRI_TYPE( DECLARE_CODER ); + FOR_EACH_MRI_TYPE( DECLARE_CODER ) } coders; } t_tmbmt; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/pg_type_map_in_ruby.c new/ext/pg_type_map_in_ruby.c --- old/ext/pg_type_map_in_ruby.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/pg_type_map_in_ruby.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * pg_type_map_in_ruby.c - PG::TypeMapInRuby class extension - * $Id: pg_type_map_in_ruby.c,v a38cf53a96f1 2014/12/13 21:59:57 lars $ + * $Id: pg_type_map_in_ruby.c,v 3d89d3aae4fd 2015/01/05 16:19:41 kanis $ * */ @@ -212,12 +212,9 @@ rb_encoding *p_encoding = rb_enc_from_index(enc_idx); VALUE enc = rb_enc_from_encoding(p_encoding); /* field_str is reused in-place by pg_text_dec_copy_row(), so we need to make - * a copy of the string buffer before used in ruby space. - * This requires rb_str_new() instead of rb_str_dup() for Rubinius. - */ - VALUE field_str_copy = rb_str_new(RSTRING_PTR(field_str), RSTRING_LEN(field_str)); - PG_ENCODING_SET_NOCHECK(field_str_copy, ENCODING_GET(field_str)); - OBJ_INFECT(field_str_copy, field_str); + * a copy of the string buffer for use in ruby space. */ + VALUE field_str_copy = rb_str_dup(field_str); + rb_str_modify(field_str_copy); return rb_funcall( this->self, s_id_typecast_copy_get, 4, field_str_copy, INT2NUM(fieldno), INT2NUM(format), enc ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/util.c new/ext/util.c --- old/ext/util.c 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/util.c 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,6 @@ /* * util.c - Utils for ruby-pg - * $Id: util.c,v 117fb5c5eed7 2014/10/15 18:36:39 lars $ + * $Id: util.c,v b859963462b2 2015/03/13 17:39:35 lars $ * */ @@ -124,7 +124,7 @@ * At most n bytes will be examined from each string. */ int -pg_strncasecmp(const char *s1, const char *s2, size_t n) +rbpg_strncasecmp(const char *s1, const char *s2, size_t n) { while (n-- > 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/util.h new/ext/util.h --- old/ext/util.h 2015-01-05 21:59:11.000000000 +0100 +++ new/ext/util.h 2015-05-14 20:50:00.000000000 +0200 @@ -60,6 +60,6 @@ void base64_encode( char *out, char *in, int len); int base64_decode( char *out, char *in, unsigned int len); -int pg_strncasecmp(const char *s1, const char *s2, size_t n); +int rbpg_strncasecmp(const char *s1, const char *s2, size_t n); #endif /* end __utils_h */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/pg/connection.rb new/lib/pg/connection.rb --- old/lib/pg/connection.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/lib/pg/connection.rb 2015-05-14 20:50:00.000000000 +0200 @@ -1,6 +1,7 @@ #!/usr/bin/env ruby require 'pg' unless defined?( PG ) +require 'uri' # The PostgreSQL connection class. The interface for this class is based on # {libpq}[http://www.postgresql.org/docs/9.2/interactive/libpq.html], the C @@ -34,46 +35,55 @@ def self::parse_connect_args( *args ) return '' if args.empty? - # This will be swapped soon for code that makes options like those required for - # PQconnectdbParams()/PQconnectStartParams(). For now, stick to an options string for - # PQconnectdb()/PQconnectStart(). + hash_arg = args.last.is_a?( Hash ) ? args.pop : {} + option_string = '' + options = {} # Parameter 'fallback_application_name' was introduced in PostgreSQL 9.0 # together with PQescapeLiteral(). - if PG::Connection.instance_methods.find{|m| m.to_sym == :escape_literal } - appname = $0.sub(/^(.{30}).{4,}(.{30})$/){ $1+"..."+$2 } - appname = PG::Connection.quote_connstr( appname ) - connopts = ["fallback_application_name=#{appname}"] - else - connopts = [] + if PG::Connection.instance_methods.find {|m| m.to_sym == :escape_literal } + options[:fallback_application_name] = $0.sub( /^(.{30}).{4,}(.{30})$/ ){ $1+"..."+$2 } end - # Handle an options hash first - if args.last.is_a?( Hash ) - opthash = args.pop - opthash.each do |key, val| - connopts.push( "%s=%s" % [key, PG::Connection.quote_connstr(val)] ) + if args.length == 1 + case args.first + when URI, URI.regexp + uri = URI(args.first) + options.merge!( Hash[URI.decode_www_form( uri.query )] ) if uri.query + when /=/ + # Option string style + option_string = args.first.to_s + else + # Positional parameters + options[CONNECT_ARGUMENT_ORDER.first.to_sym] = args.first end - end - - # Option string style - if args.length == 1 && args.first.to_s.index( '=' ) - connopts.unshift( args.first ) - - # Append positional parameters else - args.each_with_index do |val, i| - next unless val # Skip nil placeholders + max = CONNECT_ARGUMENT_ORDER.length + raise ArgumentError, + "Extra positional parameter %d: %p" % [ max + 1, args[max] ] if args.length > max - key = CONNECT_ARGUMENT_ORDER[ i ] or - raise ArgumentError, "Extra positional parameter %d: %p" % [ i+1, val ] - connopts.push( "%s=%s" % [key, PG::Connection.quote_connstr(val.to_s)] ) + CONNECT_ARGUMENT_ORDER.zip( args ) do |(k,v)| + options[ k.to_sym ] = v if v end end - return connopts.join(' ') + options.merge!( hash_arg ) + + if uri + uri.host = nil if options[:host] + uri.port = nil if options[:port] + uri.user = nil if options[:user] + uri.password = nil if options[:password] + uri.path = '' if options[:dbname] + uri.query = URI.encode_www_form( options ) + return uri.to_s.sub( /^#{uri.scheme}:(?!\/\/)/, "#{uri.scheme}://" ) + else + option_string += ' ' unless option_string.empty? && options.empty? + return option_string + options.map { |k,v| "#{k}=#{quote_connstr(v)}" }.join( ' ' ) + end end + # call-seq: # conn.copy_data( sql ) {|sql_result| ... } -> PG::Result # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/pg/text_decoder.rb new/lib/pg/text_decoder.rb --- old/lib/pg/text_decoder.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/lib/pg/text_decoder.rb 2015-05-14 20:50:00.000000000 +0200 @@ -27,11 +27,11 @@ end class TimestampWithTimeZone < SimpleDecoder - ISO_DATETIME_WITH_TIMEZONE = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?([-\+]\d\d)\z/ + ISO_DATETIME_WITH_TIMEZONE = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?([-\+]\d\d):?(\d\d)?:?(\d\d)?\z/ def decode(string, tuple=nil, field=nil) if string =~ ISO_DATETIME_WITH_TIMEZONE - Time.new $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, "#{$6}#{$7}".to_r, "#{$8}:00" + Time.new $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, "#{$6}#{$7}".to_r, "#{$8}:#{$9 || '00'}:#{$10 || '00'}" else string end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/pg.rb new/lib/pg.rb --- old/lib/pg.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/lib/pg.rb 2015-05-14 20:50:00.000000000 +0200 @@ -24,10 +24,10 @@ module PG # Library version - VERSION = '0.18.1' + VERSION = '0.18.2' # VCS revision - REVISION = %q$Revision: ba5aff64b5cb $ + REVISION = %q$Revision: 7d31b04e7913 $ class NotAllCopyDataRetrieved < PG::Error end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2015-01-05 21:59:11.000000000 +0100 +++ new/metadata 2015-05-14 20:50:00.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: pg version: !ruby/object:Gem::Version - version: 0.18.1 + version: 0.18.2 platform: ruby authors: - Michael Granger @@ -13,7 +13,7 @@ -----BEGIN CERTIFICATE----- MIIDbDCCAlSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQwwCgYDVQQDDANnZWQx GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw - HhcNMTQwMzE5MDQzNTI2WhcNMTUwMzE5MDQzNTI2WjA+MQwwCgYDVQQDDANnZWQx + HhcNMTUwNDAxMjEyNDEzWhcNMTYwMzMxMjEyNDEzWjA+MQwwCgYDVQQDDANnZWQx GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb92mkyYwuGBg1oRxt2tkH +Uo3LAsaL/APBfSLzy8o3+B3AUHKCjMUaVeBoZdWtMHB75X3VQlvXfZMyBxj59Vo @@ -24,125 +24,125 @@ AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSZ0hCV qoHr122fGKelqffzEQBhszAcBgNVHREEFTATgRFnZWRARmFlcmllTVVELm9yZzAc BgNVHRIEFTATgRFnZWRARmFlcmllTVVELm9yZzANBgkqhkiG9w0BAQUFAAOCAQEA - TuL1Bzl6TBs1YEzEubFHb9XAPgehWzzUudjDKzTRd+uyZmxnomBqTCQjT5ucNRph - 3jZ6bhLNooLQxTjIuHodeGcEMHZdt4Yi7SyPmw5Nry12z6wrDp+5aGps3HsE5WsQ - Zq2EuyEOc96g31uoIvjNdieKs+1kE+K+dJDjtw+wTH2i63P7r6N/NfPPXpxsFquo - wcYRRrHdR7GhdJeT+V8Q8Bi5bglCUGdx+8scMgkkePc98k9osQHypbACmzO+Bqkv - c7ZKPJcWBv0sm81+FCZXNACn2f9jfF8OQinxVs0O052KbGuEQaaiGIYeuuwQE2q6 - ggcrPfcYeTwWlfZPu2LrBg== + lUKo3NXePpuvN3QGsOLJ6QhNd4+Q9Rz75GipuMrCl296V8QFkd2gg9EG44Pqtk+9 + Zac8TkKc9bCSR0snakp+cCPplVvZF0/gMzkSTUJkDBHlNV16z73CyWpbQQa+iLJ4 + uisI6gF2ZXK919MYLn2bFJfb7OsCvVfyTPqq8afPY+rq9vlf9ZPwU49AlD8bPRic + 0LX0gO5ykvETIOv+WgGcqp96ceNi9XVuJMh20uWuw6pmv/Ub2RqAf82jQSbpz09G + G8LHR7EjtPPmqCCunfyecJ6MmCNaiJCBxq2NYzyNmluPyHT8+0fuB5kccUVZm6CD + xn3DzOkDE6NYbk8gC9rTsA== -----END CERTIFICATE----- -date: 2015-01-05 00:00:00.000000000 Z +date: 2015-05-14 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: hoe-mercurial requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '1.4' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '1.4' - !ruby/object:Gem::Dependency name: hoe-deveiate requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.6' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.6' - !ruby/object:Gem::Dependency name: hoe-highline requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.2' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.2' - !ruby/object:Gem::Dependency name: rdoc requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '4.0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '4.0' - !ruby/object:Gem::Dependency name: rake-compiler requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.9' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '0.9' - !ruby/object:Gem::Dependency name: hoe requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '3.12' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '3.12' - !ruby/object:Gem::Dependency name: hoe-bundler requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '1.0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '1.0' - !ruby/object:Gem::Dependency name: rspec requirement: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '3.0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - ~> + - - "~>" - !ruby/object:Gem::Version version: '3.0' description: |- @@ -202,7 +202,7 @@ - ext/pg_type_map_in_ruby.c - ext/util.c files: -- .gemtest +- ".gemtest" - BSDL - ChangeLog - Contributors.rdoc @@ -295,27 +295,27 @@ metadata: {} post_install_message: rdoc_options: -- -f +- "-f" - fivefish -- -t +- "-t" - 'pg: The Ruby Interface to PostgreSQL' -- -m +- "-m" - README.rdoc require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: 1.9.3 required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.4.5 +rubygems_version: 2.4.6 signing_key: specification_version: 4 summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/] Files old/metadata.gz.sig and new/metadata.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/pg/connection_spec.rb new/spec/pg/connection_spec.rb --- old/spec/pg/connection_spec.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/spec/pg/connection_spec.rb 2015-05-14 20:50:00.000000000 +0200 @@ -45,6 +45,14 @@ expect( optstring ).to match( /(^|\s)user='jrandom'/ ) end + it "can create a connection option string from an option string and a hash" do + optstring = described_class.parse_connect_args( 'dbname=original', :user => 'jrandom' ) + + expect( optstring ).to be_a( String ) + expect( optstring ).to match( /(^|\s)dbname=original/ ) + expect( optstring ).to match( /(^|\s)user='jrandom'/ ) + end + it "escapes single quotes and backslashes in connection parameters" do expect( described_class.parse_connect_args( "DB 'browser' \\" ) @@ -52,18 +60,72 @@ end + let(:uri) { 'postgresql://user:[email protected]:222/db01?sslmode=require' } + + it "can connect using a URI" do + string = described_class.parse_connect_args( uri ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql://user:[email protected]:222/db01\?} ) + expect( string ).to match( %r{\?.*sslmode=require} ) + + string = described_class.parse_connect_args( URI.parse(uri) ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql://user:[email protected]:222/db01\?} ) + expect( string ).to match( %r{\?.*sslmode=require} ) + end + + it "can create a connection URI from a URI and a hash" do + string = described_class.parse_connect_args( uri, :connect_timeout => 2 ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql://user:[email protected]:222/db01\?} ) + expect( string ).to match( %r{\?.*sslmode=require} ) + expect( string ).to match( %r{\?.*connect_timeout=2} ) + + string = described_class.parse_connect_args( uri, + :user => 'a', + :password => 'b', + :host => 'localhost', + :port => 555, + :dbname => 'x' ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql://\?} ) + expect( string ).to match( %r{\?.*user=a} ) + expect( string ).to match( %r{\?.*password=b} ) + expect( string ).to match( %r{\?.*host=localhost} ) + expect( string ).to match( %r{\?.*port=555} ) + expect( string ).to match( %r{\?.*dbname=x} ) + end + + it "can create a connection URI with a non-standard domain socket directory" do + string = described_class.parse_connect_args( 'postgresql://%2Fvar%2Flib%2Fpostgresql/dbname' ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql://%2Fvar%2Flib%2Fpostgresql/dbname} ) + + string = described_class. + parse_connect_args( 'postgresql:///dbname', :host => '/var/lib/postgresql' ) + + expect( string ).to be_a( String ) + expect( string ).to match( %r{^postgresql:///dbname\?} ) + expect( string ).to match( %r{\?.*host=%2Fvar%2Flib%2Fpostgresql} ) + end + it "connects with defaults if no connection parameters are given" do expect( described_class.parse_connect_args ).to eq( '' ) end it "connects successfully with connection string" do - tmpconn = described_class.connect(@conninfo) + tmpconn = described_class.connect( @conninfo ) expect( tmpconn.status ).to eq( PG::CONNECTION_OK ) tmpconn.finish end it "connects using 7 arguments converted to strings" do - tmpconn = described_class.connect('localhost', @port, nil, nil, :test, nil, nil) + tmpconn = described_class.connect( 'localhost', @port, nil, nil, :test, nil, nil ) expect( tmpconn.status ).to eq( PG::CONNECTION_OK ) tmpconn.finish end @@ -89,8 +151,13 @@ it "raises an exception when connecting with an invalid number of arguments" do expect { - described_class.connect( 1, 2, 3, 4, 5, 6, 7, 'extra' ) - }.to raise_error( ArgumentError, /extra positional parameter/i ) + described_class.connect( 1, 2, 3, 4, 5, 6, 7, 'the-extra-arg' ) + }.to raise_error do |error| + expect( error ).to be_an( ArgumentError ) + expect( error.message ).to match( /extra positional parameter/i ) + expect( error.message ).to match( /8/ ) + expect( error.message ).to match( /the-extra-arg/ ) + end end it "can connect asynchronously", :socket_io do @@ -162,8 +229,6 @@ expect( @conn.user ).to be_a_kind_of( String ) expect( @conn.pass ).to eq( "" ) expect( @conn.host ).to eq( "localhost" ) - # TODO: Not sure why libpq returns a NULL ptr instead of "127.0.0.1" - expect( @conn.hostaddr ).to eq( nil ) if @conn.server_version >= 9_04_00 expect( @conn.port ).to eq( 54321 ) expect( @conn.tty ).to eq( "" ) expect( @conn.options ).to eq( "" ) @@ -1128,9 +1193,20 @@ expect( escaped.encoding ).to eq( Encoding::ISO8859_1 ) expect( escaped ).to eq( "\"string to\"" ) end + end + it "can quote bigger strings with quote_ident" do + original = "'01234567\"" * 100 + escaped = described_class.quote_ident( original + "\0afterzero" ) + expect( escaped ).to eq( "\"" + original.gsub("\"", "\"\"") + "\"" ) end + it "can quote Arrays with quote_ident" do + original = "'01234567\"" + escaped = described_class.quote_ident( [original]*3 ) + expected = ["\"" + original.gsub("\"", "\"\"") + "\""] * 3 + expect( escaped ).to eq( expected.join(".") ) + end describe "Ruby 1.9.x default_internal encoding" do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/pg/type_spec.rb new/spec/pg/type_spec.rb --- old/spec/pg/type_spec.rb 2015-01-05 21:59:11.000000000 +0100 +++ new/spec/pg/type_spec.rb 2015-05-14 20:50:00.000000000 +0200 @@ -15,6 +15,8 @@ let!(:textdec_string) { PG::TextDecoder::String.new } let!(:textenc_timestamp) { PG::TextEncoder::TimestampWithoutTimeZone.new } let!(:textdec_timestamp) { PG::TextDecoder::TimestampWithoutTimeZone.new } + let!(:textenc_timestamptz) { PG::TextEncoder::TimestampWithTimeZone.new } + let!(:textdec_timestamptz) { PG::TextDecoder::TimestampWithTimeZone.new } let!(:textenc_bytea) { PG::TextEncoder::Bytea.new } let!(:textdec_bytea) { PG::TextDecoder::Bytea.new } let!(:binaryenc_int2) { PG::BinaryEncoder::Int2.new } @@ -85,6 +87,48 @@ expect( textdec_bytea.decode("\\377\\000") ).to eq( "\xff\0".b ) end + context 'timestamps' do + it 'decodes timestamps without timezone' do + expect( textdec_timestamp.decode('2016-01-02 23:23:59.123456') ). + to be_within(0.000001).of( Time.new(2016,01,02, 23, 23, 59.123456) ) + end + it 'decodes timestamps with hour timezone' do + expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-04') ). + to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:00") ) + expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511+10') ). + to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "+10:00") ) + end + it 'decodes timestamps with hour:minute timezone' do + expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-04:15') ). + to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:15") ) + expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-0430') ). + to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:30") ) + expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511+10:45') ). + to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "+10:45") ) + end + it 'decodes timestamps with hour:minute:sec timezone' do + # SET TIME ZONE 'Europe/Dublin'; -- Was UTC−00:25:21 until 1916 + # SELECT '1900-01-01'::timestamptz; + # -- "1900-01-01 00:00:00-00:25:21" + expect( textdec_timestamptz.decode('1916-01-01 00:00:00-00:25:21') ). + to be_within(0.000001).of( Time.new(1916, 1, 1, 0, 0, 0, "-00:25:21") ) + end + end + + context 'identifier quotation' do + it 'should build an array out of an quoted identifier string' do + quoted_type = PG::TextDecoder::Identifier.new + expect( quoted_type.decode(%["A.".".B"]) ).to eq( ["A.", ".B"] ) + expect( quoted_type.decode(%["'A"".""B'"]) ).to eq( ['\'A"."B\''] ) + end + + it 'should split unquoted identifier string' do + quoted_type = PG::TextDecoder::Identifier.new + expect( quoted_type.decode(%[a.b]) ).to eq( ['a','b'] ) + expect( quoted_type.decode(%[a]) ).to eq( ['a'] ) + end + end + it "should raise when decode method is called with wrong args" do expect{ textdec_int.decode() }.to raise_error(ArgumentError) expect{ textdec_int.decode("123", 2, 3, 4) }.to raise_error(ArgumentError) @@ -156,6 +200,15 @@ expect( textenc_bytea.encode("\x00\x01\x02\x03\xef".b) ).to eq( "\\x00010203ef" ) end + context 'identifier quotation' do + it 'should quote and escape identifier' do + quoted_type = PG::TextEncoder::Identifier.new + expect( quoted_type.encode(['schema','table','col']) ).to eq( %["schema"."table"."col"] ) + expect( quoted_type.encode(['A.','.B']) ).to eq( %["A.".".B"] ) + expect( quoted_type.encode(%['A"."B']) ).to eq( %["'A"".""B'"] ) + end + end + it "should encode with ruby encoder" do expect( intenc_incrementer.encode(3) ).to eq( "4 " ) end @@ -347,20 +400,6 @@ array_type = PG::TextDecoder::Array.new elements_type: nil expect( array_type.decode(%[{3,4}]) ).to eq( ['3','4'] ) end - - context 'identifier quotation' do - it 'should build an array out of an quoted identifier string' do - quoted_type = PG::TextDecoder::Identifier.new elements_type: textdec_string - expect( quoted_type.decode(%["A.".".B"]) ).to eq( ["A.", ".B"] ) - expect( quoted_type.decode(%["'A"".""B'"]) ).to eq( ['\'A"."B\''] ) - end - - it 'should split unquoted identifier string' do - quoted_type = PG::TextDecoder::Identifier.new elements_type: textdec_string - expect( quoted_type.decode(%[a.b]) ).to eq( ['a','b'] ) - expect( quoted_type.decode(%[a]) ).to eq( ['a'] ) - end - end end describe '#encode' do @@ -422,22 +461,6 @@ expect( textenc_float_array.encode(1234) ).to eq( "1234" ) end - context 'identifier quotation' do - it 'should quote and escape identifier' do - quoted_type = PG::TextEncoder::Identifier.new elements_type: textenc_string - expect( quoted_type.encode(['schema','table','col']) ).to eq( %["schema"."table"."col"] ) - expect( quoted_type.encode(['A.','.B']) ).to eq( %["A.".".B"] ) - expect( quoted_type.encode(%['A"."B']) ).to eq( %["'A"".""B'"] ) - end - - it 'shouldn\'t quote or escape identifier if requested to not do' do - quoted_type = PG::TextEncoder::Identifier.new elements_type: textenc_string, - needs_quotation: false - expect( quoted_type.encode(['a','b']) ).to eq( %[a.b] ) - expect( quoted_type.encode(%[a.b]) ).to eq( %[a.b] ) - end - end - context 'literal quotation' do it 'should quote and escape literals' do quoted_type = PG::TextEncoder::QuotedLiteral.new elements_type: textenc_string_array
