pg 1.2.3-x86-mingw32 → 1.3.0.rc1-x86-mingw32
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.appveyor.yml +36 -0
- data/.gems +6 -0
- data/.github/workflows/binary-gems.yml +80 -0
- data/.github/workflows/source-gem.yml +129 -0
- data/.gitignore +13 -0
- data/.hgsigs +34 -0
- data/.hgtags +41 -0
- data/.irbrc +23 -0
- data/.pryrc +23 -0
- data/.tm_properties +21 -0
- data/.travis.yml +49 -0
- data/Gemfile +14 -0
- data/History.rdoc +75 -7
- data/Manifest.txt +0 -1
- data/README.rdoc +7 -6
- data/Rakefile +27 -138
- data/Rakefile.cross +5 -5
- data/certs/ged.pem +24 -0
- data/ext/errorcodes.def +8 -0
- data/ext/errorcodes.txt +3 -1
- data/ext/extconf.rb +90 -19
- data/ext/gvl_wrappers.c +4 -0
- data/ext/gvl_wrappers.h +23 -0
- data/ext/pg.c +35 -1
- data/ext/pg.h +18 -1
- data/ext/pg_coder.c +82 -28
- data/ext/pg_connection.c +538 -279
- data/ext/pg_copy_coder.c +45 -16
- data/ext/pg_record_coder.c +38 -10
- data/ext/pg_result.c +61 -31
- data/ext/pg_text_decoder.c +1 -1
- data/ext/pg_text_encoder.c +6 -6
- data/ext/pg_tuple.c +47 -21
- data/ext/pg_type_map.c +41 -8
- data/ext/pg_type_map_all_strings.c +14 -1
- data/ext/pg_type_map_by_class.c +49 -24
- data/ext/pg_type_map_by_column.c +64 -28
- data/ext/pg_type_map_by_mri_type.c +47 -18
- data/ext/pg_type_map_by_oid.c +52 -23
- data/ext/pg_type_map_in_ruby.c +50 -19
- data/ext/pg_util.c +2 -2
- data/lib/2.5/pg_ext.so +0 -0
- data/lib/2.6/pg_ext.so +0 -0
- data/lib/2.7/pg_ext.so +0 -0
- data/lib/3.0/pg_ext.so +0 -0
- data/lib/pg/basic_type_map_based_on_result.rb +47 -0
- data/lib/pg/basic_type_map_for_queries.rb +193 -0
- data/lib/pg/basic_type_map_for_results.rb +81 -0
- data/lib/pg/basic_type_registry.rb +296 -0
- data/lib/pg/coder.rb +1 -1
- data/lib/pg/connection.rb +369 -56
- data/lib/pg/version.rb +4 -0
- data/lib/pg.rb +38 -25
- data/lib/x86-mingw32/libpq.dll +0 -0
- data/misc/openssl-pg-segfault.rb +31 -0
- data/misc/postgres/History.txt +9 -0
- data/misc/postgres/Manifest.txt +5 -0
- data/misc/postgres/README.txt +21 -0
- data/misc/postgres/Rakefile +21 -0
- data/misc/postgres/lib/postgres.rb +16 -0
- data/misc/ruby-pg/History.txt +9 -0
- data/misc/ruby-pg/Manifest.txt +5 -0
- data/misc/ruby-pg/README.txt +21 -0
- data/misc/ruby-pg/Rakefile +21 -0
- data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
- data/pg.gemspec +32 -0
- data/sample/array_insert.rb +20 -0
- data/sample/async_api.rb +106 -0
- data/sample/async_copyto.rb +39 -0
- data/sample/async_mixed.rb +56 -0
- data/sample/check_conn.rb +21 -0
- data/sample/copydata.rb +71 -0
- data/sample/copyfrom.rb +81 -0
- data/sample/copyto.rb +19 -0
- data/sample/cursor.rb +21 -0
- data/sample/disk_usage_report.rb +177 -0
- data/sample/issue-119.rb +94 -0
- data/sample/losample.rb +69 -0
- data/sample/minimal-testcase.rb +17 -0
- data/sample/notify_wait.rb +72 -0
- data/sample/pg_statistics.rb +285 -0
- data/sample/replication_monitor.rb +222 -0
- data/sample/test_binary_values.rb +33 -0
- data/sample/wal_shipper.rb +434 -0
- data/sample/warehouse_partitions.rb +311 -0
- data.tar.gz.sig +0 -0
- metadata +81 -230
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -0
- data/lib/2.2/pg_ext.so +0 -0
- data/lib/2.3/pg_ext.so +0 -0
- data/lib/2.4/pg_ext.so +0 -0
- data/lib/pg/basic_type_mapping.rb +0 -522
- data/spec/data/expected_trace.out +0 -26
- data/spec/data/random_binary_data +0 -0
- data/spec/helpers.rb +0 -380
- data/spec/pg/basic_type_mapping_spec.rb +0 -630
- data/spec/pg/connection_spec.rb +0 -1949
- data/spec/pg/connection_sync_spec.rb +0 -41
- data/spec/pg/result_spec.rb +0 -681
- data/spec/pg/tuple_spec.rb +0 -333
- data/spec/pg/type_map_by_class_spec.rb +0 -138
- data/spec/pg/type_map_by_column_spec.rb +0 -226
- data/spec/pg/type_map_by_mri_type_spec.rb +0 -136
- data/spec/pg/type_map_by_oid_spec.rb +0 -149
- data/spec/pg/type_map_in_ruby_spec.rb +0 -164
- data/spec/pg/type_map_spec.rb +0 -22
- data/spec/pg/type_spec.rb +0 -1123
- data/spec/pg_spec.rb +0 -50
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.
|
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,20 +25,20 @@ 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('
|
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://
|
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.
|
40
|
-
* PostgreSQL 9.
|
40
|
+
* Ruby 2.4 or newer
|
41
|
+
* PostgreSQL 9.3.x or later (with headers, -dev packages, etc).
|
41
42
|
|
42
43
|
It usually works with earlier versions of Ruby/PostgreSQL as well, but those are
|
43
44
|
not regularly tested.
|
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,82 +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
|
-
|
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
28
|
CLEAN.include "lib/*/libpq.dll"
|
39
29
|
CLEAN.include "lib/pg_ext.*"
|
40
|
-
|
41
|
-
# Set up Hoe plugins
|
42
|
-
Hoe.plugin :mercurial
|
43
|
-
Hoe.plugin :signing
|
44
|
-
Hoe.plugin :deveiate
|
45
|
-
Hoe.plugin :bundler
|
46
|
-
|
47
|
-
Hoe.plugins.delete :rubyforge
|
48
|
-
Hoe.plugins.delete :compiler
|
30
|
+
CLEAN.include "lib/pg/postgresql_lib_path.rb"
|
49
31
|
|
50
32
|
load 'Rakefile.cross'
|
51
33
|
|
52
|
-
|
53
|
-
|
54
|
-
$hoespec = Hoe.spec 'pg' do
|
55
|
-
self.readme_file = 'README.rdoc'
|
56
|
-
self.history_file = 'History.rdoc'
|
57
|
-
self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
|
58
|
-
self.extra_rdoc_files.include( 'POSTGRES', 'LICENSE' )
|
59
|
-
self.extra_rdoc_files.include( 'ext/*.c' )
|
60
|
-
self.license 'BSD-2-Clause'
|
61
|
-
|
62
|
-
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
63
|
-
self.developer 'Lars Kanis', 'lars@greiz-reinsdorf.de'
|
64
|
-
|
65
|
-
self.dependency 'rake-compiler', '~> 1.0', :developer
|
66
|
-
self.dependency 'rake-compiler-dock', ['~> 1.0'], :developer
|
67
|
-
self.dependency 'hoe-deveiate', '~> 0.9', :developer
|
68
|
-
self.dependency 'hoe-bundler', '~> 1.0', :developer
|
69
|
-
self.dependency 'rspec', '~> 3.5', :developer
|
70
|
-
self.dependency 'rdoc', '~> 5.1', :developer
|
71
|
-
|
72
|
-
self.spec_extras[:extensions] = [ 'ext/extconf.rb' ]
|
73
|
-
|
74
|
-
self.require_ruby_version( '>= 2.2' )
|
75
|
-
|
76
|
-
self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
|
77
|
-
self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
|
78
|
-
|
79
|
-
self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
80
|
-
end
|
81
|
-
|
82
|
-
ENV['VERSION'] ||= $hoespec.spec.version.to_s
|
83
|
-
|
84
|
-
# Tests should pass before checking in
|
85
|
-
task 'hg:precheckin' => [ :check_history, :check_manifest, :spec, :gemspec ]
|
86
|
-
|
87
|
-
# Support for 'rvm specs'
|
88
|
-
task :specs => :spec
|
89
|
-
|
90
|
-
# Compile before testing
|
91
|
-
task :spec => :compile
|
92
|
-
|
93
|
-
# gem-testers support
|
94
|
-
task :test do
|
95
|
-
# rake-compiler always wants to copy the compiled extension into lib/, but
|
96
|
-
# we don't want testers to have to re-compile, especially since that
|
97
|
-
# often fails because they can't (and shouldn't have to) write to tmp/ in
|
98
|
-
# the installed gem dir. So we clear the task rake-compiler set up
|
99
|
-
# to break the dependency between :spec and :compile when running under
|
100
|
-
# rubygems-test, and then run :spec.
|
101
|
-
Rake::Task[ EXT.to_s ].clear if File.exist?(EXT.to_s)
|
102
|
-
Rake::Task[ :spec ].execute
|
103
|
-
end
|
34
|
+
Bundler::GemHelper.install_tasks
|
35
|
+
$gem_spec = Bundler.load_gemspec(GEMSPEC)
|
104
36
|
|
105
37
|
desc "Turn on warnings and debugging in the build."
|
106
38
|
task :maint do
|
@@ -110,7 +42,7 @@ end
|
|
110
42
|
# Rake-compiler task
|
111
43
|
Rake::ExtensionTask.new do |ext|
|
112
44
|
ext.name = 'pg_ext'
|
113
|
-
ext.gem_spec = $
|
45
|
+
ext.gem_spec = $gem_spec
|
114
46
|
ext.ext_dir = 'ext'
|
115
47
|
ext.lib_dir = 'lib'
|
116
48
|
ext.source_pattern = "*.{c,h}"
|
@@ -135,58 +67,32 @@ Rake::ExtensionTask.new do |ext|
|
|
135
67
|
end
|
136
68
|
end
|
137
69
|
|
70
|
+
RSpec::Core::RakeTask.new(:spec).rspec_opts = "--profile -cfdoc"
|
71
|
+
task :test => :spec
|
138
72
|
|
139
73
|
# Use the fivefish formatter for docs generated from development checkout
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
rdoc.title = "PG: The Ruby PostgreSQL Driver"
|
149
|
-
rdoc.rdoc_dir = 'doc'
|
150
|
-
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'
|
151
82
|
end
|
152
83
|
|
84
|
+
desc "Build the source gem #{$gem_spec.full_name}.gem into the pkg directory"
|
85
|
+
task :gem => :build
|
153
86
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
Rake::Task["ChangeLog"].clear
|
159
|
-
file 'ChangeLog' do |task|
|
160
|
-
if File.exist?('.hg/branch')
|
161
|
-
$stderr.puts "Updating the changelog..."
|
162
|
-
begin
|
163
|
-
include Hoe::MercurialHelpers
|
164
|
-
content = make_changelog()
|
165
|
-
rescue NameError
|
166
|
-
abort "Packaging tasks require the hoe-mercurial plugin (gem install hoe-mercurial)"
|
167
|
-
end
|
168
|
-
File.open( task.name, 'w', 0644 ) do |fh|
|
169
|
-
fh.print( content )
|
170
|
-
end
|
171
|
-
else
|
172
|
-
touch 'ChangeLog'
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
# Rebuild the ChangeLog immediately before release
|
177
|
-
task :prerelease => 'ChangeLog'
|
178
|
-
|
179
|
-
|
180
|
-
desc "Stop any Postmaster instances that remain after testing."
|
181
|
-
task :cleanup_testing_dbs do
|
182
|
-
require 'spec/lib/helpers'
|
183
|
-
PgTestingHelpers.stop_existing_postmasters()
|
184
|
-
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()
|
185
91
|
end
|
186
92
|
|
187
93
|
desc "Update list of server error codes"
|
188
94
|
task :update_error_codes do
|
189
|
-
URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/
|
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"
|
190
96
|
|
191
97
|
ERRORCODES_TXT = "ext/errorcodes.txt"
|
192
98
|
sh "wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}"
|
@@ -198,20 +104,3 @@ file 'ext/pg_errors.c' => ['ext/errorcodes.def'] do
|
|
198
104
|
# trigger compilation of changed errorcodes.def
|
199
105
|
touch 'ext/pg_errors.c'
|
200
106
|
end
|
201
|
-
|
202
|
-
task :gemspec => GEMSPEC
|
203
|
-
file GEMSPEC => __FILE__
|
204
|
-
task GEMSPEC do |task|
|
205
|
-
spec = $hoespec.spec
|
206
|
-
spec.files.delete( '.gemtest' )
|
207
|
-
spec.signing_key = nil
|
208
|
-
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
209
|
-
spec.cert_chain = [ 'certs/ged.pem' ]
|
210
|
-
File.open( task.name, 'w' ) do |fh|
|
211
|
-
fh.write( spec.to_ruby )
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
CLOBBER.include( '*.gemspec' )
|
216
|
-
task :default => :gemspec
|
217
|
-
|
data/Rakefile.cross
CHANGED
@@ -29,8 +29,8 @@ 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.
|
33
|
-
self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '
|
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.
|
@@ -272,7 +272,7 @@ task 'gem:windows:prepare' do
|
|
272
272
|
require 'io/console'
|
273
273
|
require 'rake_compiler_dock'
|
274
274
|
|
275
|
-
# Copy gem signing key and certs to be
|
275
|
+
# Copy gem signing key and certs to be accessible from the docker container
|
276
276
|
mkdir_p 'build/gem'
|
277
277
|
sh "cp ~/.gem/gem-*.pem build/gem/ || true"
|
278
278
|
sh "bundle package"
|
@@ -287,11 +287,11 @@ end
|
|
287
287
|
CrossLibraries.each do |xlib|
|
288
288
|
platform = xlib.for_platform
|
289
289
|
desc "Build fat binary gem for platform #{platform}"
|
290
|
-
task "gem:windows:#{platform}" => ['
|
290
|
+
task "gem:windows:#{platform}" => ['gem:windows:prepare', xlib.openssl_tarball, xlib.postgresql_tarball] do
|
291
291
|
RakeCompilerDock.sh <<-EOT, platform: platform
|
292
292
|
(cp build/gem/gem-*.pem ~/.gem/ || true) &&
|
293
293
|
bundle install --local &&
|
294
|
-
rake native:#{platform} pkg/#{$
|
294
|
+
rake native:#{platform} pkg/#{$gem_spec.full_name}-#{platform}.gem MAKE="make -j`nproc`" RUBY_CC_VERSION=3.0.0:2.7.0:2.6.0:2.5.0
|
295
295
|
EOT
|
296
296
|
end
|
297
297
|
desc "Build the windows binary gems"
|
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 );
|
data/ext/errorcodes.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# errcodes.txt
|
3
3
|
# PostgreSQL error codes
|
4
4
|
#
|
5
|
-
# Copyright (c) 2003-
|
5
|
+
# Copyright (c) 2003-2021, PostgreSQL Global Development Group
|
6
6
|
#
|
7
7
|
# This list serves as the basis for generating source files containing error
|
8
8
|
# codes. It is kept in a common format to make sure all these source files have
|
@@ -207,6 +207,7 @@ Section: Class 22 - Data Exception
|
|
207
207
|
2200S E ERRCODE_INVALID_XML_COMMENT invalid_xml_comment
|
208
208
|
2200T E ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION invalid_xml_processing_instruction
|
209
209
|
22030 E ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE duplicate_json_object_key_value
|
210
|
+
22031 E ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION invalid_argument_for_sql_json_datetime_function
|
210
211
|
22032 E ERRCODE_INVALID_JSON_TEXT invalid_json_text
|
211
212
|
22033 E ERRCODE_INVALID_SQL_JSON_SUBSCRIPT invalid_sql_json_subscript
|
212
213
|
22034 E ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM more_than_one_sql_json_item
|
@@ -427,6 +428,7 @@ Section: Class 57 - Operator Intervention
|
|
427
428
|
57P02 E ERRCODE_CRASH_SHUTDOWN crash_shutdown
|
428
429
|
57P03 E ERRCODE_CANNOT_CONNECT_NOW cannot_connect_now
|
429
430
|
57P04 E ERRCODE_DATABASE_DROPPED database_dropped
|
431
|
+
57P05 E ERRCODE_IDLE_SESSION_TIMEOUT idle_session_timeout
|
430
432
|
|
431
433
|
Section: Class 58 - System Error (errors external to PostgreSQL itself)
|
432
434
|
|
data/ext/extconf.rb
CHANGED
@@ -15,6 +15,13 @@ if pgdir = with_config( 'pg' )
|
|
15
15
|
ENV['PATH'] = "#{pgdir}/bin" + File::PATH_SEPARATOR + ENV['PATH']
|
16
16
|
end
|
17
17
|
|
18
|
+
if enable_config("gvl-unlock", true)
|
19
|
+
$defs.push( "-DENABLE_GVL_UNLOCK" )
|
20
|
+
$stderr.puts "Calling libpq with GVL unlocked"
|
21
|
+
else
|
22
|
+
$stderr.puts "Calling libpq with GVL locked"
|
23
|
+
end
|
24
|
+
|
18
25
|
if enable_config("windows-cross")
|
19
26
|
# Avoid dependency to external libgcc.dll on x86-mingw32
|
20
27
|
$LDFLAGS << " -static-libgcc"
|
@@ -34,31 +41,93 @@ else
|
|
34
41
|
libdir = `"#{pgconfig}" --libdir`.chomp
|
35
42
|
dir_config 'pg', incdir, libdir
|
36
43
|
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
44
|
+
# Windows traditionally stores DLLs beside executables, not in libdir
|
45
|
+
dlldir = RUBY_PLATFORM=~/mingw|mswin/ ? `"#{pgconfig}" --bindir`.chomp : libdir
|
46
|
+
|
47
|
+
elsif checking_for "libpq per pkg-config" do
|
48
|
+
_cflags, ldflags, _libs = pkg_config("libpq")
|
49
|
+
dlldir = ldflags && ldflags[/-L([^ ]+)/] && $1
|
42
50
|
end
|
51
|
+
|
43
52
|
else
|
44
|
-
|
45
|
-
|
46
|
-
dir_config 'pg'
|
53
|
+
incdir, libdir = dir_config 'pg'
|
54
|
+
dlldir = libdir
|
47
55
|
end
|
56
|
+
|
57
|
+
# Try to use runtime path linker option, even if RbConfig doesn't know about it.
|
58
|
+
# The rpath option is usually set implicit by dir_config(), but so far not
|
59
|
+
# on MacOS-X.
|
60
|
+
if dlldir && RbConfig::CONFIG["RPATHFLAG"].to_s.empty?
|
61
|
+
append_ldflags "-Wl,-rpath,#{dlldir.quote}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
$stderr.puts "Using libpq from #{dlldir}"
|
66
|
+
|
67
|
+
File.write("postgresql_lib_path.rb", <<-EOT)
|
68
|
+
module PG
|
69
|
+
POSTGRESQL_LIB_PATH = #{dlldir.inspect}
|
48
70
|
end
|
71
|
+
EOT
|
72
|
+
$INSTALLFILES = {
|
73
|
+
"./postgresql_lib_path.rb" => "$(RUBYLIBDIR)/pg/"
|
74
|
+
}
|
49
75
|
|
50
76
|
if RUBY_VERSION >= '2.3.0' && /solaris/ =~ RUBY_PLATFORM
|
51
77
|
append_cppflags( '-D__EXTENSIONS__' )
|
52
78
|
end
|
53
79
|
|
54
|
-
|
55
|
-
find_header( 'libpq
|
56
|
-
find_header( '
|
80
|
+
begin
|
81
|
+
find_header( 'libpq-fe.h' ) or abort "Can't find the 'libpq-fe.h header"
|
82
|
+
find_header( 'libpq/libpq-fs.h' ) or abort "Can't find the 'libpq/libpq-fs.h header"
|
83
|
+
find_header( 'pg_config_manual.h' ) or abort "Can't find the 'pg_config_manual.h' header"
|
84
|
+
|
85
|
+
abort "Can't find the PostgreSQL client library (libpq)" unless
|
86
|
+
have_library( 'pq', 'PQconnectdb', ['libpq-fe.h'] ) ||
|
87
|
+
have_library( 'libpq', 'PQconnectdb', ['libpq-fe.h'] ) ||
|
88
|
+
have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
|
89
|
+
|
90
|
+
rescue SystemExit => err
|
91
|
+
install_text = case RUBY_PLATFORM
|
92
|
+
when /linux/
|
93
|
+
<<-EOT
|
94
|
+
Please install libpq or postgresql client package like so:
|
95
|
+
sudo apt install libpq-dev
|
96
|
+
sudo yum install postgresql-devel
|
97
|
+
sudo zypper in postgresql-devel
|
98
|
+
sudo pacman -S postgresql-libs
|
99
|
+
EOT
|
100
|
+
when /darwin/
|
101
|
+
<<-EOT
|
102
|
+
Please install libpq or postgresql client package like so:
|
103
|
+
brew install libpq
|
104
|
+
EOT
|
105
|
+
when /mingw/
|
106
|
+
<<-EOT
|
107
|
+
Please install libpq or postgresql client package like so:
|
108
|
+
ridk exec sh -c "pacman -S ${MINGW_PACKAGE_PREFIX}-postgresql"
|
109
|
+
EOT
|
110
|
+
else
|
111
|
+
<<-EOT
|
112
|
+
Please install libpq or postgresql client package.
|
113
|
+
EOT
|
114
|
+
end
|
115
|
+
|
116
|
+
$stderr.puts <<-EOT
|
117
|
+
*****************************************************************************
|
118
|
+
|
119
|
+
Unable to find PostgreSQL client library.
|
120
|
+
|
121
|
+
#{install_text}
|
122
|
+
or try again with:
|
123
|
+
gem install pg -- --with-pg-config=/path/to/pg_config
|
57
124
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
125
|
+
or set library paths manually with:
|
126
|
+
gem install pg -- --with-pg-include=/path/to/libpq-fe.h/ --with-pg-lib=/path/to/libpq.so/
|
127
|
+
|
128
|
+
EOT
|
129
|
+
raise
|
130
|
+
end
|
62
131
|
|
63
132
|
if /mingw/ =~ RUBY_PLATFORM && RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
|
64
133
|
# Work around: https://sourceware.org/bugzilla/show_bug.cgi?id=22504
|
@@ -69,17 +138,19 @@ if /mingw/ =~ RUBY_PLATFORM && RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
|
|
69
138
|
end
|
70
139
|
end
|
71
140
|
|
72
|
-
|
73
|
-
have_func 'PQsetSingleRowMode' or
|
141
|
+
have_func 'PQconninfo' or
|
74
142
|
abort "Your PostgreSQL is too old. Either install an older version " +
|
75
|
-
"of this gem or upgrade your database to at least PostgreSQL-9.
|
76
|
-
|
143
|
+
"of this gem or upgrade your database to at least PostgreSQL-9.3."
|
144
|
+
# optional headers/functions
|
77
145
|
have_func 'PQsslAttribute' # since PostgreSQL-9.5
|
78
146
|
have_func 'PQresultVerboseErrorMessage' # since PostgreSQL-9.6
|
79
147
|
have_func 'PQencryptPasswordConn' # since PostgreSQL-10
|
80
148
|
have_func 'PQresultMemorySize' # since PostgreSQL-12
|
149
|
+
have_func 'PQenterPipelineMode' # since PostgreSQL-14
|
81
150
|
have_func 'timegm'
|
82
151
|
have_func 'rb_gc_adjust_memory_usage' # since ruby-2.4
|
152
|
+
have_func 'rb_gc_mark_movable' # since ruby-2.7
|
153
|
+
have_func 'rb_io_wait' # since ruby-3.0
|
83
154
|
|
84
155
|
# unistd.h confilicts with ruby/win32.h when cross compiling for win32 and ruby 1.9.1
|
85
156
|
have_header 'unistd.h'
|
data/ext/gvl_wrappers.c
CHANGED
@@ -9,9 +9,13 @@
|
|
9
9
|
char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm){return NULL;}
|
10
10
|
#endif
|
11
11
|
|
12
|
+
#ifdef ENABLE_GVL_UNLOCK
|
12
13
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
|
13
14
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_SKELETON );
|
15
|
+
#endif
|
14
16
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB );
|
17
|
+
#ifdef ENABLE_GVL_UNLOCK
|
15
18
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
|
16
19
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_SKELETON );
|
20
|
+
#endif
|
17
21
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_STUB );
|
data/ext/gvl_wrappers.h
CHANGED
@@ -17,6 +17,10 @@
|
|
17
17
|
|
18
18
|
#include <ruby/thread.h>
|
19
19
|
|
20
|
+
#ifdef RUBY_EXTCONF_H
|
21
|
+
# include RUBY_EXTCONF_H
|
22
|
+
#endif
|
23
|
+
|
20
24
|
#define DEFINE_PARAM_LIST1(type, name) \
|
21
25
|
name,
|
22
26
|
|
@@ -46,6 +50,7 @@
|
|
46
50
|
return NULL; \
|
47
51
|
}
|
48
52
|
|
53
|
+
#ifdef ENABLE_GVL_UNLOCK
|
49
54
|
#define DEFINE_GVL_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
50
55
|
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
51
56
|
struct gvl_wrapper_##name##_params params = { \
|
@@ -54,6 +59,13 @@
|
|
54
59
|
rb_thread_call_without_gvl(gvl_##name##_skeleton, ¶ms, RUBY_UBF_IO, 0); \
|
55
60
|
when_non_void( return params.retval; ) \
|
56
61
|
}
|
62
|
+
#else
|
63
|
+
#define DEFINE_GVL_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
64
|
+
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
65
|
+
when_non_void( return ) \
|
66
|
+
name( FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname ); \
|
67
|
+
}
|
68
|
+
#endif
|
57
69
|
|
58
70
|
#define DEFINE_GVL_STUB_DECL(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
59
71
|
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname);
|
@@ -66,6 +78,7 @@
|
|
66
78
|
return NULL; \
|
67
79
|
}
|
68
80
|
|
81
|
+
#ifdef ENABLE_GVL_UNLOCK
|
69
82
|
#define DEFINE_GVLCB_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
70
83
|
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
71
84
|
struct gvl_wrapper_##name##_params params = { \
|
@@ -74,6 +87,13 @@
|
|
74
87
|
rb_thread_call_with_gvl(gvl_##name##_skeleton, ¶ms); \
|
75
88
|
when_non_void( return params.retval; ) \
|
76
89
|
}
|
90
|
+
#else
|
91
|
+
#define DEFINE_GVLCB_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
92
|
+
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
93
|
+
when_non_void( return ) \
|
94
|
+
name( FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname ); \
|
95
|
+
}
|
96
|
+
#endif
|
77
97
|
|
78
98
|
#define GVL_TYPE_VOID(string)
|
79
99
|
#define GVL_TYPE_NONVOID(string) string
|
@@ -95,6 +115,8 @@
|
|
95
115
|
|
96
116
|
#define FOR_EACH_PARAM_OF_PQresetPoll(param)
|
97
117
|
|
118
|
+
#define FOR_EACH_PARAM_OF_PQping(param)
|
119
|
+
|
98
120
|
#define FOR_EACH_PARAM_OF_PQexec(param) \
|
99
121
|
param(PGconn *, conn)
|
100
122
|
|
@@ -196,6 +218,7 @@
|
|
196
218
|
function(PQreset, GVL_TYPE_VOID, void, PGconn *, conn) \
|
197
219
|
function(PQresetStart, GVL_TYPE_NONVOID, int, PGconn *, conn) \
|
198
220
|
function(PQresetPoll, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
|
221
|
+
function(PQping, GVL_TYPE_NONVOID, PGPing, const char *, conninfo) \
|
199
222
|
function(PQexec, GVL_TYPE_NONVOID, PGresult *, const char *, command) \
|
200
223
|
function(PQexecParams, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
|
201
224
|
function(PQexecPrepared, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
|
data/ext/pg.c
CHANGED
@@ -526,6 +526,19 @@ Init_pg_ext()
|
|
526
526
|
/* Result#result_status constant - Single tuple from larger resultset. */
|
527
527
|
rb_define_const(rb_mPGconstants, "PGRES_SINGLE_TUPLE", INT2FIX(PGRES_SINGLE_TUPLE));
|
528
528
|
|
529
|
+
#ifdef HAVE_PQENTERPIPELINEMODE
|
530
|
+
/* Result#result_status constant - The PG::Result represents a synchronization point in pipeline mode, requested by Connection#pipeline_sync.
|
531
|
+
*
|
532
|
+
* This status occurs only when pipeline mode has been selected. */
|
533
|
+
rb_define_const(rb_mPGconstants, "PGRES_PIPELINE_SYNC", INT2FIX(PGRES_PIPELINE_SYNC));
|
534
|
+
|
535
|
+
/* Result#result_status constant - The PG::Result represents a pipeline that has received an error from the server.
|
536
|
+
*
|
537
|
+
* Connection#get_result must be called repeatedly, and each time it will return this status code until the end of the current pipeline, at which point it will return PG::PGRES_PIPELINE_SYNC and normal processing can resume.
|
538
|
+
*/
|
539
|
+
rb_define_const(rb_mPGconstants, "PGRES_PIPELINE_ABORTED", INT2FIX(PGRES_PIPELINE_ABORTED));
|
540
|
+
#endif
|
541
|
+
|
529
542
|
/****** Result CONSTANTS: result error field codes ******/
|
530
543
|
|
531
544
|
/* Result#result_error_field argument constant
|
@@ -549,7 +562,7 @@ Init_pg_ext()
|
|
549
562
|
/* Result#result_error_field argument constant
|
550
563
|
*
|
551
564
|
* The SQLSTATE code for the error.
|
552
|
-
* The SQLSTATE code identies the type of error that has occurred; it can be used by front-end applications to perform
|
565
|
+
* The SQLSTATE code identies the type of error that has occurred; it can be used by front-end applications to perform specific operations (such as error handling) in response to a particular database error.
|
553
566
|
* For a list of the possible SQLSTATE codes, see Appendix A.
|
554
567
|
* This field is not localizable, and is always present.
|
555
568
|
*/
|
@@ -645,6 +658,27 @@ Init_pg_ext()
|
|
645
658
|
rb_define_const(rb_mPGconstants, "PG_DIAG_CONSTRAINT_NAME", INT2FIX(PG_DIAG_CONSTRAINT_NAME));
|
646
659
|
#endif
|
647
660
|
|
661
|
+
#ifdef HAVE_PQENTERPIPELINEMODE
|
662
|
+
/* Connection#pipeline_status constant
|
663
|
+
*
|
664
|
+
* The libpq connection is in pipeline mode.
|
665
|
+
*/
|
666
|
+
rb_define_const(rb_mPGconstants, "PQ_PIPELINE_ON", INT2FIX(PQ_PIPELINE_ON));
|
667
|
+
|
668
|
+
/* Connection#pipeline_status constant
|
669
|
+
*
|
670
|
+
* The libpq connection is not in pipeline mode.
|
671
|
+
*/
|
672
|
+
rb_define_const(rb_mPGconstants, "PQ_PIPELINE_OFF", INT2FIX(PQ_PIPELINE_OFF));
|
673
|
+
|
674
|
+
/* Connection#pipeline_status constant
|
675
|
+
*
|
676
|
+
* The libpq connection is in pipeline mode and an error occurred while processing the current pipeline.
|
677
|
+
* The aborted flag is cleared when PQgetResult returns a result of type PGRES_PIPELINE_SYNC.
|
678
|
+
*/
|
679
|
+
rb_define_const(rb_mPGconstants, "PQ_PIPELINE_ABORTED", INT2FIX(PQ_PIPELINE_ABORTED));
|
680
|
+
#endif
|
681
|
+
|
648
682
|
/* Invalid OID constant */
|
649
683
|
rb_define_const(rb_mPGconstants, "INVALID_OID", INT2FIX(InvalidOid));
|
650
684
|
rb_define_const(rb_mPGconstants, "InvalidOid", INT2FIX(InvalidOid));
|