pg 1.1.3 → 1.4.3
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 +86 -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 +291 -6
- data/Manifest.txt +3 -3
- data/README-Windows.rdoc +4 -4
- data/README.ja.rdoc +1 -2
- data/README.rdoc +51 -15
- data/Rakefile +31 -140
- data/Rakefile.cross +60 -56
- data/certs/ged.pem +24 -0
- data/certs/larskanis-2022.pem +26 -0
- data/ext/errorcodes.def +76 -0
- data/ext/errorcodes.rb +0 -0
- data/ext/errorcodes.txt +21 -2
- data/ext/extconf.rb +101 -26
- data/ext/gvl_wrappers.c +4 -0
- data/ext/gvl_wrappers.h +23 -0
- data/ext/pg.c +190 -122
- data/ext/pg.h +43 -17
- data/ext/pg_binary_decoder.c +20 -16
- data/ext/pg_binary_encoder.c +13 -12
- data/ext/pg_coder.c +95 -29
- data/ext/pg_connection.c +1214 -919
- data/ext/pg_copy_coder.c +50 -18
- data/ext/pg_record_coder.c +521 -0
- data/ext/pg_result.c +344 -153
- data/ext/pg_text_decoder.c +15 -9
- data/ext/pg_text_encoder.c +185 -53
- data/ext/pg_tuple.c +63 -35
- data/ext/pg_type_map.c +42 -9
- data/ext/pg_type_map_all_strings.c +19 -5
- data/ext/pg_type_map_by_class.c +54 -24
- data/ext/pg_type_map_by_column.c +73 -34
- data/ext/pg_type_map_by_mri_type.c +48 -19
- data/ext/pg_type_map_by_oid.c +55 -25
- data/ext/pg_type_map_in_ruby.c +51 -20
- data/ext/{util.c → pg_util.c} +7 -7
- data/ext/{util.h → pg_util.h} +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 +301 -0
- data/lib/pg/binary_decoder.rb +1 -0
- data/lib/pg/coder.rb +23 -2
- data/lib/pg/connection.rb +669 -71
- data/lib/pg/constants.rb +1 -0
- data/lib/pg/exceptions.rb +8 -1
- data/lib/pg/result.rb +13 -1
- data/lib/pg/text_decoder.rb +2 -3
- data/lib/pg/text_encoder.rb +8 -18
- data/lib/pg/type_map_by_column.rb +2 -1
- data/lib/pg/version.rb +4 -0
- data/lib/pg.rb +48 -33
- 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/rakelib/task_extension.rb +46 -0
- data/sample/array_insert.rb +20 -0
- data/sample/async_api.rb +102 -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 +94 -237
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -6595
- data/lib/pg/basic_type_mapping.rb +0 -459
- data/spec/data/expected_trace.out +0 -26
- data/spec/data/random_binary_data +0 -0
- data/spec/helpers.rb +0 -381
- data/spec/pg/basic_type_mapping_spec.rb +0 -508
- data/spec/pg/connection_spec.rb +0 -1849
- data/spec/pg/connection_sync_spec.rb +0 -41
- data/spec/pg/result_spec.rb +0 -491
- data/spec/pg/tuple_spec.rb +0 -280
- data/spec/pg/type_map_by_class_spec.rb +0 -138
- data/spec/pg/type_map_by_column_spec.rb +0 -222
- 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 -949
- data/spec/pg_spec.rb +0 -50
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"
|
|
@@ -30,35 +37,97 @@ else
|
|
|
30
37
|
|
|
31
38
|
if pgconfig && pgconfig != 'ignore'
|
|
32
39
|
$stderr.puts "Using config values from %s" % [ pgconfig ]
|
|
33
|
-
incdir =
|
|
34
|
-
libdir =
|
|
40
|
+
incdir = IO.popen([pgconfig, "--includedir"], &:read).chomp
|
|
41
|
+
libdir = IO.popen([pgconfig, "--libdir"], &:read).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/ ? IO.popen([pgconfig, "--bindir"], &:read).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
|
-
|
|
53
|
+
incdir, libdir = dir_config 'pg'
|
|
54
|
+
dlldir = libdir
|
|
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}"
|
|
47
62
|
end
|
|
48
63
|
end
|
|
49
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}
|
|
70
|
+
end
|
|
71
|
+
EOT
|
|
72
|
+
$INSTALLFILES = {
|
|
73
|
+
"./postgresql_lib_path.rb" => "$(RUBYLIBDIR)/pg/"
|
|
74
|
+
}
|
|
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
|
|
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
|
|
124
|
+
|
|
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/
|
|
57
127
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
|
|
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,21 +138,27 @@ 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', 'libpq-fe.h' 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
|
-
|
|
77
|
-
have_func 'PQsslAttribute'
|
|
78
|
-
have_func '
|
|
143
|
+
"of this gem or upgrade your database to at least PostgreSQL-9.3."
|
|
144
|
+
# optional headers/functions
|
|
145
|
+
have_func 'PQsslAttribute', 'libpq-fe.h' # since PostgreSQL-9.5
|
|
146
|
+
have_func 'PQresultVerboseErrorMessage', 'libpq-fe.h' # since PostgreSQL-9.6
|
|
147
|
+
have_func 'PQencryptPasswordConn', 'libpq-fe.h' # since PostgreSQL-10
|
|
148
|
+
have_func 'PQresultMemorySize', 'libpq-fe.h' # since PostgreSQL-12
|
|
149
|
+
have_func 'PQenterPipelineMode', 'libpq-fe.h' do |src| # since PostgreSQL-14
|
|
150
|
+
# Ensure header files fit as well
|
|
151
|
+
src + " int con(){ return PGRES_PIPELINE_SYNC; }"
|
|
152
|
+
end
|
|
79
153
|
have_func 'timegm'
|
|
80
|
-
have_func 'rb_gc_adjust_memory_usage'
|
|
81
|
-
|
|
82
|
-
|
|
154
|
+
have_func 'rb_gc_adjust_memory_usage' # since ruby-2.4
|
|
155
|
+
have_func 'rb_gc_mark_movable' # since ruby-2.7
|
|
156
|
+
have_func 'rb_io_wait' # since ruby-3.0
|
|
83
157
|
|
|
84
158
|
# unistd.h confilicts with ruby/win32.h when cross compiling for win32 and ruby 1.9.1
|
|
85
159
|
have_header 'unistd.h'
|
|
86
160
|
have_header 'inttypes.h'
|
|
161
|
+
have_header('ruby/fiber/scheduler.h') if RUBY_PLATFORM=~/mingw|mswin/
|
|
87
162
|
|
|
88
163
|
checking_for "C99 variable length arrays" do
|
|
89
164
|
$defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }')
|
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) \
|