pg 0.21.0 → 1.3.2
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 +5 -5
- 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 +130 -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 -4
- data/Manifest.txt +8 -4
- data/README-Windows.rdoc +4 -4
- data/README.ja.rdoc +1 -2
- data/README.rdoc +62 -16
- data/Rakefile +32 -142
- data/Rakefile.cross +69 -71
- data/certs/ged.pem +24 -0
- data/certs/larskanis-2022.pem +26 -0
- data/ext/errorcodes.def +84 -0
- data/ext/errorcodes.rb +1 -1
- data/ext/errorcodes.txt +23 -2
- data/ext/extconf.rb +109 -52
- data/ext/gvl_wrappers.c +8 -0
- data/ext/gvl_wrappers.h +40 -33
- data/ext/pg.c +211 -146
- data/ext/pg.h +85 -95
- data/ext/pg_binary_decoder.c +82 -15
- data/ext/pg_binary_encoder.c +13 -12
- data/ext/pg_coder.c +145 -30
- data/ext/pg_connection.c +1349 -929
- data/ext/pg_copy_coder.c +60 -23
- data/ext/pg_record_coder.c +519 -0
- data/ext/pg_result.c +613 -207
- data/ext/pg_text_decoder.c +606 -40
- data/ext/pg_text_encoder.c +190 -59
- data/ext/pg_tuple.c +575 -0
- 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} +12 -12
- data/ext/{util.h → pg_util.h} +2 -2
- 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/binary_decoder.rb +23 -0
- data/lib/pg/coder.rb +24 -3
- data/lib/pg/connection.rb +600 -46
- data/lib/pg/constants.rb +2 -1
- data/lib/pg/exceptions.rb +2 -1
- data/lib/pg/result.rb +14 -2
- data/lib/pg/text_decoder.rb +21 -26
- data/lib/pg/text_encoder.rb +32 -8
- data/lib/pg/tuple.rb +30 -0
- data/lib/pg/type_map_by_column.rb +3 -2
- data/lib/pg/version.rb +4 -0
- data/lib/pg.rb +51 -38
- 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 +96 -229
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -6595
- data/lib/pg/basic_type_mapping.rb +0 -426
- data/lib/pg/deprecated_constants.rb +0 -21
- data/spec/data/expected_trace.out +0 -26
- data/spec/data/random_binary_data +0 -0
- data/spec/helpers.rb +0 -352
- data/spec/pg/basic_type_mapping_spec.rb +0 -305
- data/spec/pg/connection_spec.rb +0 -1676
- data/spec/pg/result_spec.rb +0 -456
- 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 -777
- data/spec/pg_spec.rb +0 -50
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
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
# src/pl/tcl/pltclerrcodes.h
|
|
19
19
|
# the same, for PL/Tcl
|
|
20
20
|
#
|
|
21
|
-
# doc/src/sgml/errcodes-
|
|
21
|
+
# doc/src/sgml/errcodes-table.sgml
|
|
22
22
|
# a SGML table of error codes for inclusion in the documentation
|
|
23
23
|
#
|
|
24
24
|
# The format of this file is one error code per line, with the following
|
|
@@ -177,6 +177,7 @@ Section: Class 22 - Data Exception
|
|
|
177
177
|
22P06 E ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER nonstandard_use_of_escape_character
|
|
178
178
|
22010 E ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE invalid_indicator_parameter_value
|
|
179
179
|
22023 E ERRCODE_INVALID_PARAMETER_VALUE invalid_parameter_value
|
|
180
|
+
22013 E ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE invalid_preceding_or_following_size
|
|
180
181
|
2201B E ERRCODE_INVALID_REGULAR_EXPRESSION invalid_regular_expression
|
|
181
182
|
2201W E ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE invalid_row_count_in_limit_clause
|
|
182
183
|
2201X E ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE invalid_row_count_in_result_offset_clause
|
|
@@ -188,6 +189,7 @@ Section: Class 22 - Data Exception
|
|
|
188
189
|
22004 E ERRCODE_NULL_VALUE_NOT_ALLOWED null_value_not_allowed
|
|
189
190
|
22002 E ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER null_value_no_indicator_parameter
|
|
190
191
|
22003 E ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE numeric_value_out_of_range
|
|
192
|
+
2200H E ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED sequence_generator_limit_exceeded
|
|
191
193
|
22026 E ERRCODE_STRING_DATA_LENGTH_MISMATCH string_data_length_mismatch
|
|
192
194
|
22001 E ERRCODE_STRING_DATA_RIGHT_TRUNCATION string_data_right_truncation
|
|
193
195
|
22011 E ERRCODE_SUBSTRING_ERROR substring_error
|
|
@@ -204,6 +206,22 @@ Section: Class 22 - Data Exception
|
|
|
204
206
|
2200N E ERRCODE_INVALID_XML_CONTENT invalid_xml_content
|
|
205
207
|
2200S E ERRCODE_INVALID_XML_COMMENT invalid_xml_comment
|
|
206
208
|
2200T E ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION invalid_xml_processing_instruction
|
|
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
|
|
211
|
+
22032 E ERRCODE_INVALID_JSON_TEXT invalid_json_text
|
|
212
|
+
22033 E ERRCODE_INVALID_SQL_JSON_SUBSCRIPT invalid_sql_json_subscript
|
|
213
|
+
22034 E ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM more_than_one_sql_json_item
|
|
214
|
+
22035 E ERRCODE_NO_SQL_JSON_ITEM no_sql_json_item
|
|
215
|
+
22036 E ERRCODE_NON_NUMERIC_SQL_JSON_ITEM non_numeric_sql_json_item
|
|
216
|
+
22037 E ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT non_unique_keys_in_a_json_object
|
|
217
|
+
22038 E ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED singleton_sql_json_item_required
|
|
218
|
+
22039 E ERRCODE_SQL_JSON_ARRAY_NOT_FOUND sql_json_array_not_found
|
|
219
|
+
2203A E ERRCODE_SQL_JSON_MEMBER_NOT_FOUND sql_json_member_not_found
|
|
220
|
+
2203B E ERRCODE_SQL_JSON_NUMBER_NOT_FOUND sql_json_number_not_found
|
|
221
|
+
2203C E ERRCODE_SQL_JSON_OBJECT_NOT_FOUND sql_json_object_not_found
|
|
222
|
+
2203D E ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS too_many_json_array_elements
|
|
223
|
+
2203E E ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS too_many_json_object_members
|
|
224
|
+
2203F E ERRCODE_SQL_JSON_SCALAR_REQUIRED sql_json_scalar_required
|
|
207
225
|
|
|
208
226
|
Section: Class 23 - Integrity Constraint Violation
|
|
209
227
|
|
|
@@ -326,6 +344,7 @@ Section: Class 42 - Syntax Error or Access Rule Violation
|
|
|
326
344
|
42P21 E ERRCODE_COLLATION_MISMATCH collation_mismatch
|
|
327
345
|
42P22 E ERRCODE_INDETERMINATE_COLLATION indeterminate_collation
|
|
328
346
|
42809 E ERRCODE_WRONG_OBJECT_TYPE wrong_object_type
|
|
347
|
+
428C9 E ERRCODE_GENERATED_ALWAYS generated_always
|
|
329
348
|
|
|
330
349
|
# Note: for ERRCODE purposes, we divide namable objects into these categories:
|
|
331
350
|
# databases, schemas, prepared statements, cursors, tables, columns,
|
|
@@ -398,6 +417,7 @@ Section: Class 55 - Object Not In Prerequisite State
|
|
|
398
417
|
55006 E ERRCODE_OBJECT_IN_USE object_in_use
|
|
399
418
|
55P02 E ERRCODE_CANT_CHANGE_RUNTIME_PARAM cant_change_runtime_param
|
|
400
419
|
55P03 E ERRCODE_LOCK_NOT_AVAILABLE lock_not_available
|
|
420
|
+
55P04 E ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE unsafe_new_enum_value_usage
|
|
401
421
|
|
|
402
422
|
Section: Class 57 - Operator Intervention
|
|
403
423
|
|
|
@@ -408,6 +428,7 @@ Section: Class 57 - Operator Intervention
|
|
|
408
428
|
57P02 E ERRCODE_CRASH_SHUTDOWN crash_shutdown
|
|
409
429
|
57P03 E ERRCODE_CANNOT_CONNECT_NOW cannot_connect_now
|
|
410
430
|
57P04 E ERRCODE_DATABASE_DROPPED database_dropped
|
|
431
|
+
57P05 E ERRCODE_IDLE_SESSION_TIMEOUT idle_session_timeout
|
|
411
432
|
|
|
412
433
|
Section: Class 58 - System Error (errors external to PostgreSQL itself)
|
|
413
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,74 +41,124 @@ 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
|
-
|
|
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 => 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
|
|
57
115
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
have_library( 'libpq', 'PQconnectdb', ['libpq-fe.h'] ) ||
|
|
61
|
-
have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
|
|
116
|
+
$stderr.puts <<-EOT
|
|
117
|
+
*****************************************************************************
|
|
62
118
|
|
|
63
|
-
|
|
64
|
-
|
|
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/
|
|
127
|
+
|
|
128
|
+
EOT
|
|
129
|
+
raise
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
if /mingw/ =~ RUBY_PLATFORM && RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
|
|
133
|
+
# Work around: https://sourceware.org/bugzilla/show_bug.cgi?id=22504
|
|
134
|
+
checking_for "workaround gcc version with link issue" do
|
|
135
|
+
`#{RbConfig::MAKEFILE_CONFIG['CC']} --version`.chomp =~ /\s(\d+)\.\d+\.\d+(\s|$)/ &&
|
|
136
|
+
$1.to_i >= 6 &&
|
|
137
|
+
have_library(':libpq.lib') # Prefer linking to libpq.lib over libpq.dll if available
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
have_func 'PQconninfo', 'libpq-fe.h' or
|
|
65
142
|
abort "Your PostgreSQL is too old. Either install an older version " +
|
|
66
|
-
"of this gem or upgrade your database."
|
|
67
|
-
|
|
68
|
-
have_func '
|
|
69
|
-
have_func '
|
|
70
|
-
have_func '
|
|
71
|
-
have_func '
|
|
72
|
-
have_func '
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
have_func '
|
|
77
|
-
have_func '
|
|
78
|
-
have_func '
|
|
79
|
-
have_func '
|
|
80
|
-
have_func 'PQping'
|
|
81
|
-
have_func 'PQsetSingleRowMode'
|
|
82
|
-
have_func 'PQconninfo'
|
|
83
|
-
have_func 'PQsslAttribute'
|
|
84
|
-
|
|
85
|
-
have_func 'rb_encdb_alias'
|
|
86
|
-
have_func 'rb_enc_alias'
|
|
87
|
-
have_func 'rb_thread_call_without_gvl'
|
|
88
|
-
have_func 'rb_thread_call_with_gvl'
|
|
89
|
-
have_func 'rb_thread_fd_select'
|
|
90
|
-
have_func 'rb_w32_wrap_io_handle'
|
|
91
|
-
have_func 'rb_str_modify_expand'
|
|
92
|
-
have_func 'rb_hash_dup'
|
|
93
|
-
|
|
94
|
-
have_const 'PGRES_COPY_BOTH', 'libpq-fe.h'
|
|
95
|
-
have_const 'PGRES_SINGLE_TUPLE', 'libpq-fe.h'
|
|
96
|
-
have_const 'PG_DIAG_TABLE_NAME', 'libpq-fe.h'
|
|
97
|
-
|
|
98
|
-
$defs.push( "-DHAVE_ST_NOTIFY_EXTRA" ) if
|
|
99
|
-
have_struct_member 'struct pgNotify', 'extra', 'libpq-fe.h'
|
|
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
|
|
153
|
+
have_func 'timegm'
|
|
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
|
|
100
157
|
|
|
101
158
|
# unistd.h confilicts with ruby/win32.h when cross compiling for win32 and ruby 1.9.1
|
|
102
159
|
have_header 'unistd.h'
|
|
103
160
|
have_header 'inttypes.h'
|
|
104
|
-
have_header
|
|
161
|
+
have_header('ruby/fiber/scheduler.h') if RUBY_PLATFORM=~/mingw|mswin/
|
|
105
162
|
|
|
106
163
|
checking_for "C99 variable length arrays" do
|
|
107
164
|
$defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }')
|
data/ext/gvl_wrappers.c
CHANGED
|
@@ -5,9 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
#include "pg.h"
|
|
7
7
|
|
|
8
|
+
#ifndef HAVE_PQENCRYPTPASSWORDCONN
|
|
9
|
+
char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm){return NULL;}
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
#ifdef ENABLE_GVL_UNLOCK
|
|
8
13
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
|
|
9
14
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_SKELETON );
|
|
15
|
+
#endif
|
|
10
16
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB );
|
|
17
|
+
#ifdef ENABLE_GVL_UNLOCK
|
|
11
18
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
|
|
12
19
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_SKELETON );
|
|
20
|
+
#endif
|
|
13
21
|
FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_STUB );
|
data/ext/gvl_wrappers.h
CHANGED
|
@@ -15,13 +15,10 @@
|
|
|
15
15
|
#ifndef __gvl_wrappers_h
|
|
16
16
|
#define __gvl_wrappers_h
|
|
17
17
|
|
|
18
|
-
#
|
|
19
|
-
extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
|
|
20
|
-
#endif
|
|
18
|
+
#include <ruby/thread.h>
|
|
21
19
|
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
rb_unblock_function_t *ubf, void *data2);
|
|
20
|
+
#ifdef RUBY_EXTCONF_H
|
|
21
|
+
# include RUBY_EXTCONF_H
|
|
25
22
|
#endif
|
|
26
23
|
|
|
27
24
|
#define DEFINE_PARAM_LIST1(type, name) \
|
|
@@ -53,20 +50,21 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
53
50
|
return NULL; \
|
|
54
51
|
}
|
|
55
52
|
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
53
|
+
#ifdef ENABLE_GVL_UNLOCK
|
|
54
|
+
#define DEFINE_GVL_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
|
55
|
+
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
|
56
|
+
struct gvl_wrapper_##name##_params params = { \
|
|
57
|
+
{FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname}, when_non_void((rettype)0) \
|
|
58
|
+
}; \
|
|
59
|
+
rb_thread_call_without_gvl(gvl_##name##_skeleton, ¶ms, RUBY_UBF_IO, 0); \
|
|
60
|
+
when_non_void( return params.retval; ) \
|
|
61
|
+
}
|
|
65
62
|
#else
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
+
}
|
|
70
68
|
#endif
|
|
71
69
|
|
|
72
70
|
#define DEFINE_GVL_STUB_DECL(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
|
@@ -80,20 +78,21 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
80
78
|
return NULL; \
|
|
81
79
|
}
|
|
82
80
|
|
|
83
|
-
#
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
81
|
+
#ifdef ENABLE_GVL_UNLOCK
|
|
82
|
+
#define DEFINE_GVLCB_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
|
|
83
|
+
rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
|
|
84
|
+
struct gvl_wrapper_##name##_params params = { \
|
|
85
|
+
{FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname}, when_non_void((rettype)0) \
|
|
86
|
+
}; \
|
|
87
|
+
rb_thread_call_with_gvl(gvl_##name##_skeleton, ¶ms); \
|
|
88
|
+
when_non_void( return params.retval; ) \
|
|
89
|
+
}
|
|
92
90
|
#else
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
+
}
|
|
97
96
|
#endif
|
|
98
97
|
|
|
99
98
|
#define GVL_TYPE_VOID(string)
|
|
@@ -116,6 +115,8 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
116
115
|
|
|
117
116
|
#define FOR_EACH_PARAM_OF_PQresetPoll(param)
|
|
118
117
|
|
|
118
|
+
#define FOR_EACH_PARAM_OF_PQping(param)
|
|
119
|
+
|
|
119
120
|
#define FOR_EACH_PARAM_OF_PQexec(param) \
|
|
120
121
|
param(PGconn *, conn)
|
|
121
122
|
|
|
@@ -200,6 +201,11 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
200
201
|
|
|
201
202
|
#define FOR_EACH_PARAM_OF_PQisBusy(param)
|
|
202
203
|
|
|
204
|
+
#define FOR_EACH_PARAM_OF_PQencryptPasswordConn(param) \
|
|
205
|
+
param(PGconn *, conn) \
|
|
206
|
+
param(const char *, passwd) \
|
|
207
|
+
param(const char *, user)
|
|
208
|
+
|
|
203
209
|
#define FOR_EACH_PARAM_OF_PQcancel(param) \
|
|
204
210
|
param(PGcancel *, cancel) \
|
|
205
211
|
param(char *, errbuf)
|
|
@@ -212,6 +218,7 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
212
218
|
function(PQreset, GVL_TYPE_VOID, void, PGconn *, conn) \
|
|
213
219
|
function(PQresetStart, GVL_TYPE_NONVOID, int, PGconn *, conn) \
|
|
214
220
|
function(PQresetPoll, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
|
|
221
|
+
function(PQping, GVL_TYPE_NONVOID, PGPing, const char *, conninfo) \
|
|
215
222
|
function(PQexec, GVL_TYPE_NONVOID, PGresult *, const char *, command) \
|
|
216
223
|
function(PQexecParams, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
|
|
217
224
|
function(PQexecPrepared, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
|
|
@@ -231,9 +238,9 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
|
|
231
238
|
function(PQsendDescribePortal, GVL_TYPE_NONVOID, int, const char *, portal) \
|
|
232
239
|
function(PQsetClientEncoding, GVL_TYPE_NONVOID, int, const char *, encoding) \
|
|
233
240
|
function(PQisBusy, GVL_TYPE_NONVOID, int, PGconn *, conn) \
|
|
241
|
+
function(PQencryptPasswordConn, GVL_TYPE_NONVOID, char *, const char *, algorithm) \
|
|
234
242
|
function(PQcancel, GVL_TYPE_NONVOID, int, int, errbufsize);
|
|
235
243
|
|
|
236
|
-
|
|
237
244
|
FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB_DECL );
|
|
238
245
|
|
|
239
246
|
|