1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
# -*- ruby -*-
# frozen_string_literal: true
# The top-level PG namespace.
module PG
# Is this file part of a fat binary gem with bundled libpq?
# This path must be enabled by add_dll_directory on Windows.
gplat = Gem::Platform.local
bundled_libpq_path = Dir[File.expand_path("../ports/#{gplat.cpu}-#{gplat.os}*/lib", __dir__)].first
if bundled_libpq_path
POSTGRESQL_LIB_PATH = bundled_libpq_path
else
# Try to load libpq path as found by extconf.rb
begin
require "pg/postgresql_lib_path"
rescue LoadError
# rake-compiler doesn't use regular "make install", but uses it's own install tasks.
# It therefore doesn't copy pg/postgresql_lib_path.rb in case of "rake compile".
POSTGRESQL_LIB_PATH = false
end
end
POSTGRESQL_LIB_PATH.freeze
add_dll_path = proc do |path, &block|
if RUBY_PLATFORM =~/(mswin|mingw)/i && path
BUNDLED_LIBPQ_WITH_UNIXSOCKET = false
begin
require 'ruby_installer/runtime'
RubyInstaller::Runtime.add_dll_directory(path, &block)
rescue LoadError
old_path = ENV['PATH']
ENV['PATH'] = "#{path};#{old_path}"
block.call
ENV['PATH'] = old_path
end
else
# libpq is found by a relative rpath in the cross compiled extension dll
# or by the system library loader
block.call
BUNDLED_LIBPQ_WITH_UNIXSOCKET = RUBY_PLATFORM=~/linux/i && PG::IS_BINARY_GEM
end
end
# Add a load path to the one retrieved from pg_config
add_dll_path.call(POSTGRESQL_LIB_PATH) do
begin
# Try the <major>.<minor> subdirectory for fat binary gems
major_minor = RUBY_VERSION[ /^(\d+\.\d+)/ ] or
raise "Oops, can't extract the major/minor version from #{RUBY_VERSION.dump}"
require "#{major_minor}/pg_ext"
rescue LoadError => error1
begin
require 'pg_ext'
rescue LoadError => error2
msg = <<~EOT
pg's C extension failed to load:
#{error1}
#{error2}
EOT
if msg =~ /GLIBC/
msg += <<~EOT
The GLIBC version of this system seems too old. Please use the source version of pg:
gem uninstall pg --all
gem install pg --platform ruby
or in your Gemfile:
gem "pg", force_ruby_platform: true
See also: https://deveiate.org/code/pg/README_md.html#label-Source+gem
EOT
end
raise error2, msg
end
end
end
# Get the PG library version.
#
# +include_buildnum+ is no longer used and any value passed will be ignored.
def self.version_string( include_buildnum=nil )
"%s %s" % [ self.name, VERSION ]
end
### Convenience alias for PG::Connection.new.
def self.connect( *args, &block )
Connection.new( *args, &block )
end
if defined?(Ractor.make_shareable)
def self.make_shareable(obj)
Ractor.make_shareable(obj)
end
else
def self.make_shareable(obj)
obj.freeze
end
end
module BinaryDecoder
%i[ TimestampUtc TimestampUtcToLocal TimestampLocal ].each do |klass|
autoload klass, 'pg/binary_decoder/timestamp'
end
autoload :Date, 'pg/binary_decoder/date'
end
module BinaryEncoder
%i[ TimestampUtc TimestampLocal ].each do |klass|
autoload klass, 'pg/binary_encoder/timestamp'
end
end
module TextDecoder
%i[ TimestampUtc TimestampUtcToLocal TimestampLocal TimestampWithoutTimeZone TimestampWithTimeZone ].each do |klass|
autoload klass, 'pg/text_decoder/timestamp'
end
autoload :Date, 'pg/text_decoder/date'
autoload :Inet, 'pg/text_decoder/inet'
autoload :JSON, 'pg/text_decoder/json'
autoload :Numeric, 'pg/text_decoder/numeric'
end
module TextEncoder
%i[ TimestampUtc TimestampWithoutTimeZone TimestampWithTimeZone ].each do |klass|
autoload klass, 'pg/text_encoder/timestamp'
end
autoload :Date, 'pg/text_encoder/date'
autoload :Inet, 'pg/text_encoder/inet'
autoload :JSON, 'pg/text_encoder/json'
autoload :Numeric, 'pg/text_encoder/numeric'
end
autoload :BasicTypeMapBasedOnResult, 'pg/basic_type_map_based_on_result'
autoload :BasicTypeMapForQueries, 'pg/basic_type_map_for_queries'
autoload :BasicTypeMapForResults, 'pg/basic_type_map_for_results'
autoload :BasicTypeRegistry, 'pg/basic_type_registry'
require 'pg/exceptions'
require 'pg/coder'
require 'pg/type_map_by_column'
require 'pg/connection'
require 'pg/cancel_connection'
require 'pg/result'
require 'pg/tuple'
autoload :VERSION, 'pg/version'
# Avoid "uninitialized constant Truffle::WarningOperations" on Truffleruby up to 22.3.1
if RUBY_ENGINE=="truffleruby" && !defined?(Truffle::WarningOperations)
module TruffleFixWarn
def warn(str, category=nil)
super(str)
end
end
Warning.extend(TruffleFixWarn)
end
# Ruby-3.4+ prints a warning, if bigdecimal is required but not in the Gemfile.
# But it's a false positive, since we enable bigdecimal depending features only if it's available.
# And most people don't need these features.
def self.require_bigdecimal_without_warning
oldverb, $VERBOSE = $VERBOSE, nil
require "bigdecimal"
ensure
$VERBOSE = oldverb
end
end # module PG
|