pg 1.2.1-x86-mingw32 → 1.3.0.rc2-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.appveyor.yml +36 -0
  4. data/.gems +6 -0
  5. data/.github/workflows/binary-gems.yml +85 -0
  6. data/.github/workflows/source-gem.yml +130 -0
  7. data/.gitignore +13 -0
  8. data/.hgsigs +34 -0
  9. data/.hgtags +41 -0
  10. data/.irbrc +23 -0
  11. data/.pryrc +23 -0
  12. data/.tm_properties +21 -0
  13. data/.travis.yml +49 -0
  14. data/Gemfile +14 -0
  15. data/History.rdoc +93 -7
  16. data/Manifest.txt +0 -1
  17. data/README.rdoc +8 -7
  18. data/Rakefile +31 -140
  19. data/Rakefile.cross +55 -56
  20. data/certs/ged.pem +24 -0
  21. data/ext/errorcodes.def +8 -0
  22. data/ext/errorcodes.txt +3 -1
  23. data/ext/extconf.rb +90 -19
  24. data/ext/gvl_wrappers.c +4 -0
  25. data/ext/gvl_wrappers.h +23 -0
  26. data/ext/pg.c +59 -4
  27. data/ext/pg.h +18 -0
  28. data/ext/pg_coder.c +90 -24
  29. data/ext/pg_connection.c +606 -533
  30. data/ext/pg_copy_coder.c +45 -15
  31. data/ext/pg_record_coder.c +38 -9
  32. data/ext/pg_result.c +61 -31
  33. data/ext/pg_text_decoder.c +1 -1
  34. data/ext/pg_text_encoder.c +6 -6
  35. data/ext/pg_tuple.c +47 -21
  36. data/ext/pg_type_map.c +41 -8
  37. data/ext/pg_type_map_all_strings.c +14 -1
  38. data/ext/pg_type_map_by_class.c +50 -21
  39. data/ext/pg_type_map_by_column.c +64 -28
  40. data/ext/pg_type_map_by_mri_type.c +47 -18
  41. data/ext/pg_type_map_by_oid.c +52 -23
  42. data/ext/pg_type_map_in_ruby.c +50 -19
  43. data/ext/pg_util.c +2 -2
  44. data/lib/2.5/pg_ext.so +0 -0
  45. data/lib/2.6/pg_ext.so +0 -0
  46. data/lib/2.7/pg_ext.so +0 -0
  47. data/lib/3.0/pg_ext.so +0 -0
  48. data/lib/3.1/pg_ext.so +0 -0
  49. data/lib/pg/basic_type_map_based_on_result.rb +47 -0
  50. data/lib/pg/basic_type_map_for_queries.rb +193 -0
  51. data/lib/pg/basic_type_map_for_results.rb +81 -0
  52. data/lib/pg/basic_type_registry.rb +296 -0
  53. data/lib/pg/coder.rb +1 -1
  54. data/lib/pg/connection.rb +579 -57
  55. data/lib/pg/version.rb +4 -0
  56. data/lib/pg.rb +38 -24
  57. data/lib/x86-mingw32/libpq.dll +0 -0
  58. data/misc/openssl-pg-segfault.rb +31 -0
  59. data/misc/postgres/History.txt +9 -0
  60. data/misc/postgres/Manifest.txt +5 -0
  61. data/misc/postgres/README.txt +21 -0
  62. data/misc/postgres/Rakefile +21 -0
  63. data/misc/postgres/lib/postgres.rb +16 -0
  64. data/misc/ruby-pg/History.txt +9 -0
  65. data/misc/ruby-pg/Manifest.txt +5 -0
  66. data/misc/ruby-pg/README.txt +21 -0
  67. data/misc/ruby-pg/Rakefile +21 -0
  68. data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
  69. data/pg.gemspec +32 -0
  70. data/sample/array_insert.rb +20 -0
  71. data/sample/async_api.rb +106 -0
  72. data/sample/async_copyto.rb +39 -0
  73. data/sample/async_mixed.rb +56 -0
  74. data/sample/check_conn.rb +21 -0
  75. data/sample/copydata.rb +71 -0
  76. data/sample/copyfrom.rb +81 -0
  77. data/sample/copyto.rb +19 -0
  78. data/sample/cursor.rb +21 -0
  79. data/sample/disk_usage_report.rb +177 -0
  80. data/sample/issue-119.rb +94 -0
  81. data/sample/losample.rb +69 -0
  82. data/sample/minimal-testcase.rb +17 -0
  83. data/sample/notify_wait.rb +72 -0
  84. data/sample/pg_statistics.rb +285 -0
  85. data/sample/replication_monitor.rb +222 -0
  86. data/sample/test_binary_values.rb +33 -0
  87. data/sample/wal_shipper.rb +434 -0
  88. data/sample/warehouse_partitions.rb +311 -0
  89. data.tar.gz.sig +0 -0
  90. metadata +95 -235
  91. metadata.gz.sig +0 -0
  92. data/ChangeLog +0 -0
  93. data/lib/2.2/pg_ext.so +0 -0
  94. data/lib/2.3/pg_ext.so +0 -0
  95. data/lib/2.4/pg_ext.so +0 -0
  96. data/lib/libpq.dll +0 -0
  97. data/lib/pg/basic_type_mapping.rb +0 -522
  98. data/spec/data/expected_trace.out +0 -26
  99. data/spec/data/random_binary_data +0 -0
  100. data/spec/helpers.rb +0 -382
  101. data/spec/pg/basic_type_mapping_spec.rb +0 -645
  102. data/spec/pg/connection_spec.rb +0 -1911
  103. data/spec/pg/connection_sync_spec.rb +0 -41
  104. data/spec/pg/result_spec.rb +0 -681
  105. data/spec/pg/tuple_spec.rb +0 -333
  106. data/spec/pg/type_map_by_class_spec.rb +0 -138
  107. data/spec/pg/type_map_by_column_spec.rb +0 -226
  108. data/spec/pg/type_map_by_mri_type_spec.rb +0 -136
  109. data/spec/pg/type_map_by_oid_spec.rb +0 -149
  110. data/spec/pg/type_map_in_ruby_spec.rb +0 -164
  111. data/spec/pg/type_map_spec.rb +0 -22
  112. data/spec/pg/type_spec.rb +0 -1123
  113. data/spec/pg_spec.rb +0 -50
data/History.rdoc CHANGED
@@ -1,3 +1,89 @@
1
+ == v1.3.0 [YYY-MM-DD] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Install Enhancements:
4
+ - Print some install help if libpq wasn't found. #396
5
+ This should help to pick the necessary package without googling.
6
+ - Update Windows fat binary gem to OpenSSL-1.1.1m and PostgreSQL-14.1.
7
+ - Add binary Windows gems for Ruby 3.0 and 3.1.
8
+ - Make the library path of libpq available in ruby as PG::POSTGRESQL_LIB_PATH and add it to the search paths on Windows similar to +rpath+ on Unix systems. #373
9
+ - Fall back to pkg-config if pg_config is not found. #380
10
+ - Add option to extconf.rb to disable nogvl-wrapping of libpq functions.
11
+ All methods (except PG::Connection.ping) are nonblocking now, so that GVL unlock is in theory no longer necessary.
12
+ However it can have some advantage in concurrency, so that GVL unlock is still enabled by default.
13
+ Use:
14
+ - gem inst pg -- --disable-gvl-unlock
15
+
16
+ API Enhancements:
17
+ - Add full compatibility to Fiber.scheduler introduced in Ruby-3.0. #397
18
+ - Add async_connect and async_send methods and add specific specs for Fiber.scheduler #342
19
+ - Add async_get_result and async_get_last_result
20
+ - Add async_get_copy_data
21
+ - Implement async_put_copy_data/async_put_copy_end
22
+ - Implement async_reset method using the nonblocking libpq API
23
+ - Add async_set_client_encoding which is compatible to scheduler
24
+ - Add async_cancel as a nonblocking version of conn#cancel
25
+ - Add async_encrypt_password
26
+ - Run Connection.ping in a second thread.
27
+ - Make discard_results scheduler friendly
28
+ - Do all socket waiting through the conn.socket_io object.
29
+ - Avoid PG.connect blocking while address resolution by automatically providing the +hostaddr+ parameter.
30
+ - Add support for pipeline mode of PostgreSQL-14. #401
31
+ - Allow specification of multiple hosts in PostgreSQL URI. #387
32
+ - Add new method conn.backend_key - used to implement our own cancel method.
33
+
34
+ Type cast enhancements:
35
+ - Add PG::BasicTypeMapForQueries::BinaryData for encoding of bytea columns. #348
36
+ - Reduce time to build coder maps and permit to reuse them for several type maps per PG::BasicTypeRegistry::CoderMapsBundle.new(conn) . #376
37
+ - Make BasicTypeRegistry a class and use a global default instance of it.
38
+ Now a local type registry can be instanciated and given to the type map, to avoid changing shared global states.
39
+ - Allow PG::BasicTypeMapForQueries to take a Proc as callback for undefined types.
40
+
41
+ Other Enhancements:
42
+ - Convert all PG classes implemented in C to TypedData objects. #349
43
+ - Support ObjectSpace.memsize_of(obj) on all classes implemented in C. #393
44
+ - Make all PG objects implemented in C memory moveable and therefore GC.compact friendly. #349
45
+ - Update errorcodes and error classes to PostgreSQL-14.0.
46
+ - Add PG::CONNECTION_* constants for conn.status of newer PostgreSQL versions.
47
+ - Add better support for logical replication. #339
48
+ - Change conn.socket_io to read+write mode and to a BasicSocket object instead of IO.
49
+ - Use rb_io_wait() and the conn.socket_io object if available and remove Windows specific wait functions.
50
+ Fall back to rb_wait_for_single_fd() on ruby < 3.0, which works on Windows as well.
51
+
52
+ Bugfixes:
53
+ - Release GVL while calling PQping which is a blocking method, but it didn't release GVL so far.
54
+ - Fix Connection#transaction to no longer block on interrupts, for instance when pressing Ctrl-C and cancel a running query. #390
55
+ - Avoid casting of OIDs to fix compat with Redshift database. #369
56
+ - Call conn.block before each conn.get_result call to avoid possible blocking in case of a slow network and multiple query results.
57
+ - Sporadic Errno::ENOTSOCK when using conn.socket_io on Windows #398
58
+
59
+ Deprecated:
60
+ - Add deprecation warning to PG::BasicTypeRegistry.register_type and siblings.
61
+
62
+ Removed:
63
+ - Remove support of ruby-2.2, 2.3 and 2.4. Minimum is ruby-2.5 now.
64
+ - Remove support for PostgreSQL-9.2. Minimum is PostgreSQL-9.3 now.
65
+
66
+ Repository:
67
+ - Replace Hoe by Bundler for gem packaging
68
+ - Add Github Actions CI and testing of source and binary gems.
69
+
70
+
71
+ == v1.2.3 [2020-03-18] Michael Granger <ged@FaerieMUD.org>
72
+
73
+ Bugfixes:
74
+
75
+ - Fix possible segfault at `PG::Coder#encode`, `decode` or their implicit calls through
76
+ a typemap after GC.compact. #327
77
+ - Fix possible segfault in `PG::TypeMapByClass` after GC.compact. #328
78
+
79
+
80
+ == v1.2.2 [2020-01-06] Michael Granger <ged@FaerieMUD.org>
81
+
82
+ Enhancements:
83
+
84
+ - Add a binary gem for Ruby 2.7.
85
+
86
+
1
87
  == v1.2.1 [2020-01-02] Michael Granger <ged@FaerieMUD.org>
2
88
 
3
89
  Enhancements:
@@ -38,7 +124,7 @@ Other enhancements:
38
124
  - Improve performance of PG::Result#stream_each_tuple .
39
125
  - Store client encoding in data part of PG::Connection and PG::Result objects, so that we no longer use ruby's internal encoding bits. #280
40
126
  - Update Windows fat binary gem to OpenSSL-1.1.1d and PostgreSQL-12.1.
41
- - Add support for TruffleRuby. It is regulary tested as part of our CI.
127
+ - Add support for TruffleRuby. It is regularly tested as part of our CI.
42
128
  - Enable +frozen_string_literal+ in all pg's ruby files
43
129
 
44
130
  Bugfixes:
@@ -101,10 +187,10 @@ Deprecated (disable warnings per PG_SKIP_DEPRECATION_WARNING=1):
101
187
  - Forwarding conn.async_exec_params to conn.async_exec is deprecated.
102
188
 
103
189
  PG::Connection enhancements:
104
- - Provide PG::Connection#sync_* and PG::Connection#async_* query methods for explicit calling syncronous or asynchronous libpq API.
190
+ - Provide PG::Connection#sync_* and PG::Connection#async_* query methods for explicit calling synchronous or asynchronous libpq API.
105
191
  - Make PG::Connection#exec and siblings switchable between sync and async API per PG::Connection.async_api= and change the default to async flavors.
106
192
  - Add async flavors of exec_params, prepare, exec_prepared, describe_prepared and describe_portal.
107
- They are identical to their syncronous counterpart, but make use of PostgreSQL's async API.
193
+ They are identical to their synchronous counterpart, but make use of PostgreSQL's async API.
108
194
  - Replace `rb_thread_fd_select()` by faster `rb_wait_for_single_fd()` in `conn.block` and `conn.async_exec` .
109
195
  - Add PG::Connection#discard_results .
110
196
  - Raise an ArgumentError for strings containing zero bytes by #escape, #escape_literal, #escape_identifier, #quote_ident and PG::TextEncoder::Identifier. These methods previously truncated strings.
@@ -259,7 +345,7 @@ Bugfixes:
259
345
  - Revert addition of PG::Connection#hostaddr [#202].
260
346
  - Fix decoding of fractional timezones and timestamps [#203]
261
347
  - Fixes for non-C99 compilers
262
- - Avoid possible symbol name clash when linking againt static libpq.
348
+ - Avoid possible symbol name clash when linking against static libpq.
263
349
 
264
350
 
265
351
  == v0.18.1 [2015-01-05] Michael Granger <ged@FaerieMUD.org>
@@ -295,7 +381,7 @@ Enhancements:
295
381
  Bugfixes:
296
382
 
297
383
  - Fix compatibility with signal handlers defined in Ruby. This reverts
298
- cancelation of queries running on top of the blocking libpq API (like
384
+ cancellation of queries running on top of the blocking libpq API (like
299
385
  Connection#exec) in case of signals. As an alternative the #async_exec
300
386
  can be used, which is reverted to use the non-blocking API, again.
301
387
  - Wrap PQcancel to be called without GVL. It internally waits for
@@ -373,7 +459,7 @@ Enhancements:
373
459
 
374
460
  - Tested under Ruby 2.0.0p0.
375
461
  - Add single row mode of PostgreSQL 9.2.
376
- - Set fallback_application_name to programm name $0. Thanks to Will Leinweber
462
+ - Set fallback_application_name to program name $0. Thanks to Will Leinweber
377
463
  for the patch.
378
464
  - Release Ruby's GVL while calls to blocking libpq functions to allow better
379
465
  concurrency in threaded applications.
@@ -381,7 +467,7 @@ Enhancements:
381
467
  - Make use of rb_thread_fd_select() on Ruby 1.9 and avoid deprecated
382
468
  rb_thread_select().
383
469
  - Add an example of how to insert array data using a prepared statement (#145).
384
- - Add continous integration tests on travis-ci.org.
470
+ - Add continuous integration tests on travis-ci.org.
385
471
  - Add PG::Result#each_row for iterative over result sets by row. Thanks to
386
472
  Aaron Patterson for the patch.
387
473
  - Add a PG::Connection#socket_io method for fetching a (non-autoclosing) IO
data/Manifest.txt CHANGED
@@ -1,6 +1,5 @@
1
1
  .gemtest
2
2
  BSDL
3
- ChangeLog
4
3
  Contributors.rdoc
5
4
  History.rdoc
6
5
  LICENSE
data/README.rdoc CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  home :: https://github.com/ged/ruby-pg
4
4
  docs :: http://deveiate.org/code/pg
5
+ clog :: link:/History.rdoc
5
6
 
6
7
  {<img src="https://badges.gitter.im/Join%20Chat.svg" alt="Join the chat at https://gitter.im/ged/ruby-pg">}[https://gitter.im/ged/ruby-pg?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge]
7
8
 
@@ -10,7 +11,7 @@ docs :: http://deveiate.org/code/pg
10
11
 
11
12
  Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/].
12
13
 
13
- It works with {PostgreSQL 9.2 and later}[http://www.postgresql.org/support/versioning/].
14
+ It works with {PostgreSQL 9.3 and later}[http://www.postgresql.org/support/versioning/].
14
15
 
15
16
  A small example usage:
16
17
 
@@ -24,22 +25,22 @@ A small example usage:
24
25
  puts " PID | User | Query"
25
26
  result.each do |row|
26
27
  puts " %7d | %-16s | %s " %
27
- row.values_at('procpid', 'usename', 'current_query')
28
+ row.values_at('pid', 'usename', 'query')
28
29
  end
29
30
  end
30
31
 
31
32
  == Build Status
32
33
 
33
- {<img src="https://travis-ci.org/ged/ruby-pg.svg?branch=master" alt="Build Status Travis-CI" />}[https://travis-ci.org/ged/ruby-pg]
34
+ {<img src="https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml/badge.svg?branch=master" alt="Build Status Github Actions" />}[https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml]
34
35
  {<img src="https://ci.appveyor.com/api/projects/status/gjx5axouf3b1wicp?svg=true" alt="Build Status Appveyor" />}[https://ci.appveyor.com/project/ged/ruby-pg-9j8l3]
35
-
36
+ {<img src="https://app.travis-ci.com/larskanis/ruby-pg.svg?branch=master" alt="Build Status" />}[https://app.travis-ci.com/larskanis/ruby-pg]
36
37
 
37
38
  == Requirements
38
39
 
39
- * Ruby 2.2 or newer
40
- * PostgreSQL 9.2.x or later (with headers, -dev packages, etc).
40
+ * Ruby 2.4 or newer
41
+ * PostgreSQL 9.3.x or later (with headers, -dev packages, etc).
41
42
 
42
- It usually work with earlier versions of Ruby/PostgreSQL as well, but those are
43
+ It usually works with earlier versions of Ruby/PostgreSQL as well, but those are
43
44
  not regularly tested.
44
45
 
45
46
 
data/Rakefile CHANGED
@@ -3,20 +3,11 @@
3
3
  require 'rbconfig'
4
4
  require 'pathname'
5
5
  require 'tmpdir'
6
-
7
- begin
8
- require 'rake/extensiontask'
9
- rescue LoadError
10
- abort "This Rakefile requires rake-compiler (gem install rake-compiler)"
11
- end
12
-
13
- begin
14
- require 'hoe'
15
- rescue LoadError
16
- abort "This Rakefile requires hoe (gem install hoe)"
17
- end
18
-
6
+ require 'rake/extensiontask'
19
7
  require 'rake/clean'
8
+ require 'rspec/core/rake_task'
9
+ require 'bundler'
10
+ require 'bundler/gem_helper'
20
11
 
21
12
  # Build directory constants
22
13
  BASEDIR = Pathname( __FILE__ ).dirname
@@ -25,80 +16,23 @@ LIBDIR = BASEDIR + 'lib'
25
16
  EXTDIR = BASEDIR + 'ext'
26
17
  PKGDIR = BASEDIR + 'pkg'
27
18
  TMPDIR = BASEDIR + 'tmp'
19
+ TESTDIR = BASEDIR + "tmp_test_specs"
28
20
 
29
21
  DLEXT = RbConfig::CONFIG['DLEXT']
30
22
  EXT = LIBDIR + "pg_ext.#{DLEXT}"
31
23
 
32
24
  GEMSPEC = 'pg.gemspec'
33
25
 
34
- TEST_DIRECTORY = BASEDIR + "tmp_test_specs"
35
-
36
- CLOBBER.include( TEST_DIRECTORY.to_s )
26
+ CLOBBER.include( TESTDIR.to_s )
37
27
  CLEAN.include( PKGDIR.to_s, TMPDIR.to_s )
38
-
39
- # Set up Hoe plugins
40
- Hoe.plugin :mercurial
41
- Hoe.plugin :signing
42
- Hoe.plugin :deveiate
43
- Hoe.plugin :bundler
44
-
45
- Hoe.plugins.delete :rubyforge
46
- Hoe.plugins.delete :compiler
28
+ CLEAN.include "lib/*/libpq.dll"
29
+ CLEAN.include "lib/pg_ext.*"
30
+ CLEAN.include "lib/pg/postgresql_lib_path.rb"
47
31
 
48
32
  load 'Rakefile.cross'
49
33
 
50
-
51
- # Hoe specification
52
- $hoespec = Hoe.spec 'pg' do
53
- self.readme_file = 'README.rdoc'
54
- self.history_file = 'History.rdoc'
55
- self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
56
- self.extra_rdoc_files.include( 'POSTGRES', 'LICENSE' )
57
- self.extra_rdoc_files.include( 'ext/*.c' )
58
- self.license 'BSD-2-Clause'
59
-
60
- self.developer 'Michael Granger', 'ged@FaerieMUD.org'
61
- self.developer 'Lars Kanis', 'lars@greiz-reinsdorf.de'
62
-
63
- self.dependency 'rake-compiler', '~> 1.0', :developer
64
- self.dependency 'rake-compiler-dock', ['~> 0.7.0'], :developer
65
- self.dependency 'hoe-deveiate', '~> 0.9', :developer
66
- self.dependency 'hoe-bundler', '~> 1.0', :developer
67
- self.dependency 'rspec', '~> 3.5', :developer
68
- self.dependency 'rdoc', '~> 5.1', :developer
69
-
70
- self.spec_extras[:extensions] = [ 'ext/extconf.rb' ]
71
-
72
- self.require_ruby_version( '>= 2.2' )
73
-
74
- self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
75
- self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
76
-
77
- self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
78
- end
79
-
80
- ENV['VERSION'] ||= $hoespec.spec.version.to_s
81
-
82
- # Tests should pass before checking in
83
- task 'hg:precheckin' => [ :check_history, :check_manifest, :spec, :gemspec ]
84
-
85
- # Support for 'rvm specs'
86
- task :specs => :spec
87
-
88
- # Compile before testing
89
- task :spec => :compile
90
-
91
- # gem-testers support
92
- task :test do
93
- # rake-compiler always wants to copy the compiled extension into lib/, but
94
- # we don't want testers to have to re-compile, especially since that
95
- # often fails because they can't (and shouldn't have to) write to tmp/ in
96
- # the installed gem dir. So we clear the task rake-compiler set up
97
- # to break the dependency between :spec and :compile when running under
98
- # rubygems-test, and then run :spec.
99
- Rake::Task[ EXT.to_s ].clear if File.exist?(EXT.to_s)
100
- Rake::Task[ :spec ].execute
101
- end
34
+ Bundler::GemHelper.install_tasks
35
+ $gem_spec = Bundler.load_gemspec(GEMSPEC)
102
36
 
103
37
  desc "Turn on warnings and debugging in the build."
104
38
  task :maint do
@@ -108,12 +42,12 @@ end
108
42
  # Rake-compiler task
109
43
  Rake::ExtensionTask.new do |ext|
110
44
  ext.name = 'pg_ext'
111
- ext.gem_spec = $hoespec.spec
45
+ ext.gem_spec = $gem_spec
112
46
  ext.ext_dir = 'ext'
113
47
  ext.lib_dir = 'lib'
114
48
  ext.source_pattern = "*.{c,h}"
115
49
  ext.cross_compile = true
116
- ext.cross_platform = CrossLibraries.map &:for_platform
50
+ ext.cross_platform = CrossLibraries.map(&:for_platform)
117
51
 
118
52
  ext.cross_config_options += CrossLibraries.map do |lib|
119
53
  {
@@ -129,62 +63,36 @@ Rake::ExtensionTask.new do |ext|
129
63
 
130
64
  # Add libpq.dll to windows binary gemspec
131
65
  ext.cross_compiling do |spec|
132
- spec.files << "lib/libpq.dll"
66
+ spec.files << "lib/#{spec.platform}/libpq.dll"
133
67
  end
134
68
  end
135
69
 
70
+ RSpec::Core::RakeTask.new(:spec).rspec_opts = "--profile -cfdoc"
71
+ task :test => :spec
136
72
 
137
73
  # Use the fivefish formatter for docs generated from development checkout
138
- if File.directory?( '.hg' )
139
- require 'rdoc/task'
140
-
141
- Rake::Task[ 'docs' ].clear
142
- RDoc::Task.new( 'docs' ) do |rdoc|
143
- rdoc.main = "README.rdoc"
144
- rdoc.rdoc_files.include( "*.rdoc", "ChangeLog", "lib/**/*.rb", 'ext/**/*.{c,h}' )
145
- rdoc.generator = :fivefish
146
- rdoc.title = "PG: The Ruby PostgreSQL Driver"
147
- rdoc.rdoc_dir = 'doc'
148
- end
74
+ require 'rdoc/task'
75
+
76
+ RDoc::Task.new( 'docs' ) do |rdoc|
77
+ rdoc.main = "README.rdoc"
78
+ rdoc.rdoc_files.include( "*.rdoc", "lib/**/*.rb", 'ext/**/*.{c,h}' )
79
+ rdoc.generator = :fivefish
80
+ rdoc.title = "PG: The Ruby PostgreSQL Driver"
81
+ rdoc.rdoc_dir = 'doc'
149
82
  end
150
83
 
84
+ desc "Build the source gem #{$gem_spec.full_name}.gem into the pkg directory"
85
+ task :gem => :build
151
86
 
152
- # Make the ChangeLog update if the repo has changed since it was last built
153
- file '.hg/branch' do
154
- warn "WARNING: You need the Mercurial repo to update the ChangeLog"
155
- end
156
- Rake::Task["ChangeLog"].clear
157
- file 'ChangeLog' do |task|
158
- if File.exist?('.hg/branch')
159
- $stderr.puts "Updating the changelog..."
160
- begin
161
- include Hoe::MercurialHelpers
162
- content = make_changelog()
163
- rescue NameError
164
- abort "Packaging tasks require the hoe-mercurial plugin (gem install hoe-mercurial)"
165
- end
166
- File.open( task.name, 'w', 0644 ) do |fh|
167
- fh.print( content )
168
- end
169
- else
170
- touch 'ChangeLog'
171
- end
172
- end
173
-
174
- # Rebuild the ChangeLog immediately before release
175
- task :prerelease => 'ChangeLog'
176
-
177
-
178
- desc "Stop any Postmaster instances that remain after testing."
179
- task :cleanup_testing_dbs do
180
- require 'spec/lib/helpers'
181
- PgTestingHelpers.stop_existing_postmasters()
182
- Rake::Task[:clean].invoke
87
+ task :clobber do
88
+ puts "Stop any Postmaster instances that remain after testing."
89
+ require_relative 'spec/helpers'
90
+ PG::TestingHelpers.stop_existing_postmasters()
183
91
  end
184
92
 
185
93
  desc "Update list of server error codes"
186
94
  task :update_error_codes do
187
- URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_12_0"
95
+ URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_14_0"
188
96
 
189
97
  ERRORCODES_TXT = "ext/errorcodes.txt"
190
98
  sh "wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}"
@@ -196,20 +104,3 @@ file 'ext/pg_errors.c' => ['ext/errorcodes.def'] do
196
104
  # trigger compilation of changed errorcodes.def
197
105
  touch 'ext/pg_errors.c'
198
106
  end
199
-
200
- task :gemspec => GEMSPEC
201
- file GEMSPEC => __FILE__
202
- task GEMSPEC do |task|
203
- spec = $hoespec.spec
204
- spec.files.delete( '.gemtest' )
205
- spec.signing_key = nil
206
- spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
207
- spec.cert_chain = [ 'certs/ged.pem' ]
208
- File.open( task.name, 'w' ) do |fh|
209
- fh.write( spec.to_ruby )
210
- end
211
- end
212
-
213
- CLOBBER.include( '*.gemspec' )
214
- task :default => :gemspec
215
-
data/Rakefile.cross CHANGED
@@ -29,15 +29,15 @@ class CrossLibrary < OpenStruct
29
29
  self.host_platform = toolchain
30
30
 
31
31
  # Cross-compilation constants
32
- self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.1d'
33
- self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '12.1'
32
+ self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.1m'
33
+ self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '14.1'
34
34
 
35
35
  # Check if symlinks work in the current working directory.
36
36
  # This fails, if rake-compiler-dock is running on a Windows box.
37
37
  begin
38
38
  FileUtils.rm_f '.test_symlink'
39
39
  FileUtils.ln_s '/', '.test_symlink'
40
- rescue SystemCallError
40
+ rescue NotImplementedError, SystemCallError
41
41
  # Symlinks don't work -> use home directory instead
42
42
  self.compile_home = Pathname( "~/.ruby-pg-build" ).expand_path
43
43
  else
@@ -45,6 +45,8 @@ class CrossLibrary < OpenStruct
45
45
  end
46
46
  self.static_sourcesdir = compile_home + 'sources'
47
47
  self.static_builddir = compile_home + 'builds' + for_platform
48
+ CLOBBER.include( static_sourcesdir )
49
+ CLEAN.include( static_builddir )
48
50
 
49
51
  # Static OpenSSL build vars
50
52
  self.static_openssl_builddir = static_builddir + "openssl-#{openssl_version}"
@@ -81,17 +83,6 @@ class CrossLibrary < OpenStruct
81
83
  # clean intermediate files and folders
82
84
  CLEAN.include( static_builddir.to_s )
83
85
 
84
-
85
- def download(url, save_to)
86
- part = save_to+".part"
87
- sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
88
- FileUtils.mv part, save_to
89
- end
90
-
91
- def run(*args)
92
- sh *args
93
- end
94
-
95
86
  #####################################################################
96
87
  ### C R O S S - C O M P I L A T I O N - T A S K S
97
88
  #####################################################################
@@ -141,9 +132,9 @@ class CrossLibrary < OpenStruct
141
132
  end
142
133
 
143
134
  desc "compile static openssl libraries"
144
- task :openssl_libs => [ libssl, libcrypto ]
135
+ task "openssl_libs:#{for_platform}" => [ libssl, libcrypto ]
145
136
 
146
- task :compile_static_openssl => openssl_makefile do |t|
137
+ task "compile_static_openssl:#{for_platform}" => openssl_makefile do |t|
147
138
  chdir( static_openssl_builddir ) do
148
139
  cmd = cmd_prelude.dup
149
140
  cmd << 'make' << "-j#{NUM_CPUS}" << 'build_libs'
@@ -153,12 +144,12 @@ class CrossLibrary < OpenStruct
153
144
  end
154
145
 
155
146
  desc "compile static #{libssl}"
156
- file libssl => :compile_static_openssl do |t|
147
+ file libssl => "compile_static_openssl:#{for_platform}" do |t|
157
148
  rm t.name.gsub(/\.a$/, ".dll.a")
158
149
  end
159
150
 
160
151
  desc "compile static #{libcrypto}"
161
- file libcrypto => :compile_static_openssl do |t|
152
+ file libcrypto => "compile_static_openssl:#{for_platform}" do |t|
162
153
  rm t.name.gsub(/\.a$/, ".dll.a")
163
154
  end
164
155
 
@@ -189,7 +180,7 @@ class CrossLibrary < OpenStruct
189
180
  end
190
181
 
191
182
  # generate the makefile in a clean build location
192
- file postgresql_global_makefile => [ static_postgresql_builddir, :openssl_libs ] do |t|
183
+ file postgresql_global_makefile => [ static_postgresql_builddir, "openssl_libs:#{for_platform}" ] do |t|
193
184
  options = [
194
185
  "--target=#{host_platform}",
195
186
  "--host=#{host_platform}",
@@ -231,10 +222,10 @@ class CrossLibrary < OpenStruct
231
222
 
232
223
 
233
224
  #desc 'compile libpg.a'
234
- task :libpq => postgresql_lib
225
+ task "native:#{for_platform}" => postgresql_lib
235
226
 
236
227
  # copy libpq.dll to lib dir
237
- dest_libpq = "lib/#{postgresql_lib.basename}"
228
+ dest_libpq = "lib/#{for_platform}/#{postgresql_lib.basename}"
238
229
  directory File.dirname(dest_libpq)
239
230
  file dest_libpq => [postgresql_lib, File.dirname(dest_libpq)] do
240
231
  cp postgresql_lib, dest_libpq
@@ -246,22 +237,28 @@ class CrossLibrary < OpenStruct
246
237
  cp postgresql_lib, stage_libpq
247
238
  end
248
239
  end
249
- end
250
240
 
251
- if File.exist?(File.expand_path("~/.rake-compiler/config.yml"))
252
- CrossLibraries = [
253
- ['i386-mingw32', 'mingw', 'i686-w64-mingw32'],
254
- ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
255
- ].map do |platform, openssl_config, toolchain|
256
- CrossLibrary.new platform, openssl_config, toolchain
241
+ def download(url, save_to)
242
+ part = save_to+".part"
243
+ sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
244
+ FileUtils.mv part, save_to
257
245
  end
258
- else
259
- $stderr.puts "Cross-compilation disabled -- rake-compiler not properly installed"
260
- CrossLibraries = []
246
+
247
+ def run(*args)
248
+ sh(*args)
249
+ end
250
+ end
251
+
252
+ CrossLibraries = [
253
+ ['x64-mingw-ucrt', 'mingw64', 'x86_64-w64-mingw32'],
254
+ ['x86-mingw32', 'mingw', 'i686-w64-mingw32'],
255
+ ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
256
+ ].map do |platform, openssl_config, toolchain|
257
+ CrossLibrary.new platform, openssl_config, toolchain
261
258
  end
262
259
 
263
260
  desc 'cross compile pg for win32'
264
- task :cross => [ :mingw32, :libpq ]
261
+ task :cross => [ :mingw32 ]
265
262
 
266
263
  task :mingw32 do
267
264
  # Use Rake::ExtensionCompiler helpers to find the proper host
@@ -272,30 +269,32 @@ task :mingw32 do
272
269
  end
273
270
  end
274
271
 
275
- # To reduce the gem file size strip mingw32 dlls before packaging
276
- ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version|
277
- task "tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
278
- sh "i686-w64-mingw32-strip -S tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
279
- end
280
-
281
- task "tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
282
- sh "x86_64-w64-mingw32-strip -S tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
283
- end
272
+ task 'gem:windows:prepare' do
273
+ require 'io/console'
274
+ require 'rake_compiler_dock'
275
+
276
+ # Copy gem signing key and certs to be accessible from the docker container
277
+ mkdir_p 'build/gem'
278
+ sh "cp ~/.gem/gem-*.pem build/gem/ || true"
279
+ sh "bundle package"
280
+ begin
281
+ OpenSSL::PKey.read(File.read(File.expand_path("~/.gem/gem-private_key.pem")), ENV["GEM_PRIVATE_KEY_PASSPHRASE"] || "")
282
+ rescue OpenSSL::PKey::PKeyError
283
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
284
+ retry
285
+ end
284
286
  end
285
287
 
286
- desc "Build the windows binary gems"
287
- task 'gem:windows' => ['ChangeLog'] do
288
- require 'rake_compiler_dock'
289
-
290
- # Copy gem signing key and certs to be accessable from the docker container
291
- mkdir_p 'build/gem'
292
- sh "cp ~/.gem/gem-*.pem build/gem/ || true"
293
- sh "bundle package"
294
-
295
- RakeCompilerDock.sh <<-EOT
296
- mkdir ~/.gem &&
297
- (cp build/gem/gem-*.pem ~/.gem/ || true) &&
298
- bundle install --local &&
299
- rake cross native gem MAKE="make -j`nproc`"
300
- EOT
288
+ CrossLibraries.each do |xlib|
289
+ platform = xlib.for_platform
290
+ desc "Build fat binary gem for platform #{platform}"
291
+ task "gem:windows:#{platform}" => ['gem:windows:prepare', xlib.openssl_tarball, xlib.postgresql_tarball] do
292
+ RakeCompilerDock.sh <<-EOT, platform: platform
293
+ (cp build/gem/gem-*.pem ~/.gem/ || true) &&
294
+ bundle install --local &&
295
+ rake native:#{platform} pkg/#{$gem_spec.full_name}-#{platform}.gem MAKE="make -j`nproc`" RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0:2.6.0:2.5.0
296
+ EOT
297
+ end
298
+ desc "Build the windows binary gems"
299
+ multitask 'gem:windows' => "gem:windows:#{platform}"
301
300
  end
data/certs/ged.pem ADDED
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID+DCCAmCgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
3
+ REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMDEyMjQyMDU1MjlaFw0yMTEyMjQyMDU1
4
+ MjlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
5
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
6
+ L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
7
+ M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
8
+ 5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
9
+ Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
10
+ vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
11
+ dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
12
+ ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
13
+ N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
14
+ VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
15
+ 9w0BAQsFAAOCAYEAMYegZanJi8zq7QKPT7wqXefX4C88I5JWeBHR3PvvWK0CwyMV
16
+ peyiu5I13w/lYX+HUZjE4qsSpJMJFXWl4WZCOo+AMprOcf0PxfuJpxCej5D4tavf
17
+ vRfhahSw7XJrcZih/3J+/UgoH7R05MJ+8LTcy3HGrB3a0vTafjm8OY7Xpa0LJDoN
18
+ JDqxK321VIHyTibbKeA1hWSE6ljlQDvFbTqiCj3Ulp1jTv3TOlvRl8fqcfhxUJI0
19
+ +5Q82jJODjEN+GaWs0V+NlrbU94cXwS2PH5dXogftB5YYA5Ex8A0ikZ73xns4Hdo
20
+ XxdLdd92F5ovxA23j/rKe/IDwqr6FpDkU3nPXH/Qp0TVGv9zZnVJc/Z6ChkuWj8z
21
+ pW7JAyyiiHZgKKDReDrA2LA7Zs3o/7KA6UtUH0FHf8LYhcK+pfHk6RtjRe65ffw+
22
+ MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
23
+ k9FjI4d9EP54gS/4
24
+ -----END CERTIFICATE-----
data/ext/errorcodes.def CHANGED
@@ -306,6 +306,10 @@
306
306
  VALUE klass = define_error_class( "DuplicateJsonObjectKeyValue", "22" );
307
307
  register_error_class( "22030", klass );
308
308
  }
309
+ {
310
+ VALUE klass = define_error_class( "InvalidArgumentForSqlJsonDatetimeFunction", "22" );
311
+ register_error_class( "22031", klass );
312
+ }
309
313
  {
310
314
  VALUE klass = define_error_class( "InvalidJsonText", "22" );
311
315
  register_error_class( "22032", klass );
@@ -856,6 +860,10 @@
856
860
  VALUE klass = define_error_class( "DatabaseDropped", "57" );
857
861
  register_error_class( "57P04", klass );
858
862
  }
863
+ {
864
+ VALUE klass = define_error_class( "IdleSessionTimeout", "57" );
865
+ register_error_class( "57P05", klass );
866
+ }
859
867
  {
860
868
  VALUE klass = define_error_class( "SystemError", NULL );
861
869
  register_error_class( "58000", klass );