postgresql-lambda 1.3.4.1

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.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/BSDL +22 -0
  3. data/BUILD +1 -0
  4. data/CHANGELOG.md +10 -0
  5. data/Contributors.rdoc +46 -0
  6. data/Gemfile +14 -0
  7. data/History.rdoc +705 -0
  8. data/LICENSE +56 -0
  9. data/Manifest.txt +72 -0
  10. data/POSTGRES +23 -0
  11. data/README-OS_X.rdoc +68 -0
  12. data/README-Windows.rdoc +56 -0
  13. data/README.ja.rdoc +13 -0
  14. data/README.md +65 -0
  15. data/README.rdoc +214 -0
  16. data/Rakefile +106 -0
  17. data/Rakefile.cross +302 -0
  18. data/VERSION +1 -0
  19. data/certs/ged.pem +24 -0
  20. data/certs/larskanis-2022.pem +26 -0
  21. data/lib/pg/basic_type_map_based_on_result.rb +47 -0
  22. data/lib/pg/basic_type_map_for_queries.rb +193 -0
  23. data/lib/pg/basic_type_map_for_results.rb +81 -0
  24. data/lib/pg/basic_type_registry.rb +296 -0
  25. data/lib/pg/binary_decoder.rb +23 -0
  26. data/lib/pg/coder.rb +104 -0
  27. data/lib/pg/connection.rb +822 -0
  28. data/lib/pg/constants.rb +12 -0
  29. data/lib/pg/exceptions.rb +12 -0
  30. data/lib/pg/postgresql_lib_path.rb +3 -0
  31. data/lib/pg/result.rb +43 -0
  32. data/lib/pg/text_decoder.rb +46 -0
  33. data/lib/pg/text_encoder.rb +59 -0
  34. data/lib/pg/tuple.rb +30 -0
  35. data/lib/pg/type_map_by_column.rb +16 -0
  36. data/lib/pg/version.rb +4 -0
  37. data/lib/pg.rb +89 -0
  38. data/lib/pg_ext.so +0 -0
  39. data/lib/postgresql-lambda.rb +16 -0
  40. data/misc/openssl-pg-segfault.rb +31 -0
  41. data/misc/postgres/History.txt +9 -0
  42. data/misc/postgres/Manifest.txt +5 -0
  43. data/misc/postgres/README.txt +21 -0
  44. data/misc/postgres/Rakefile +21 -0
  45. data/misc/postgres/lib/postgres.rb +16 -0
  46. data/misc/ruby-pg/History.txt +9 -0
  47. data/misc/ruby-pg/Manifest.txt +5 -0
  48. data/misc/ruby-pg/README.txt +21 -0
  49. data/misc/ruby-pg/Rakefile +21 -0
  50. data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
  51. data/pg.gemspec +32 -0
  52. data/postgresql-lambda.gemspec +18 -0
  53. data/rakelib/task_extension.rb +46 -0
  54. data/sample/array_insert.rb +20 -0
  55. data/sample/async_api.rb +102 -0
  56. data/sample/async_copyto.rb +39 -0
  57. data/sample/async_mixed.rb +56 -0
  58. data/sample/check_conn.rb +21 -0
  59. data/sample/copydata.rb +71 -0
  60. data/sample/copyfrom.rb +81 -0
  61. data/sample/copyto.rb +19 -0
  62. data/sample/cursor.rb +21 -0
  63. data/sample/disk_usage_report.rb +177 -0
  64. data/sample/issue-119.rb +94 -0
  65. data/sample/losample.rb +69 -0
  66. data/sample/minimal-testcase.rb +17 -0
  67. data/sample/notify_wait.rb +72 -0
  68. data/sample/pg_statistics.rb +285 -0
  69. data/sample/replication_monitor.rb +222 -0
  70. data/sample/test_binary_values.rb +33 -0
  71. data/sample/wal_shipper.rb +434 -0
  72. data/sample/warehouse_partitions.rb +311 -0
  73. metadata +119 -0
@@ -0,0 +1,12 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'pg' unless defined?( PG )
5
+
6
+
7
+ module PG::Constants
8
+
9
+ # Most of these are defined in the extension.
10
+
11
+ end # module PG::Constants
12
+
@@ -0,0 +1,12 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'pg' unless defined?( PG )
5
+
6
+
7
+ module PG
8
+
9
+ class Error < StandardError; end
10
+
11
+ end # module PG
12
+
@@ -0,0 +1,3 @@
1
+ module PG
2
+ POSTGRESQL_LIB_PATH = "/usr/lib64"
3
+ end
data/lib/pg/result.rb ADDED
@@ -0,0 +1,43 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'pg' unless defined?( PG )
5
+
6
+
7
+ class PG::Result
8
+
9
+ # Apply a type map for all value retrieving methods.
10
+ #
11
+ # +type_map+: a PG::TypeMap instance.
12
+ #
13
+ # This method is equal to #type_map= , but returns self, so that calls can be chained.
14
+ #
15
+ # See also PG::BasicTypeMapForResults
16
+ def map_types!(type_map)
17
+ self.type_map = type_map
18
+ return self
19
+ end
20
+
21
+ # Set the data type for all field name returning methods.
22
+ #
23
+ # +type+: a Symbol defining the field name type.
24
+ #
25
+ # This method is equal to #field_name_type= , but returns self, so that calls can be chained.
26
+ def field_names_as(type)
27
+ self.field_name_type = type
28
+ return self
29
+ end
30
+
31
+ ### Return a String representation of the object suitable for debugging.
32
+ def inspect
33
+ str = self.to_s
34
+ str[-1,0] = if cleared?
35
+ " cleared"
36
+ else
37
+ " status=#{res_status(result_status)} ntuples=#{ntuples} nfields=#{nfields} cmd_tuples=#{cmd_tuples}"
38
+ end
39
+ return str
40
+ end
41
+
42
+ end # class PG::Result
43
+
@@ -0,0 +1,46 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'date'
5
+ require 'json'
6
+
7
+ module PG
8
+ module TextDecoder
9
+ class Date < SimpleDecoder
10
+ def decode(string, tuple=nil, field=nil)
11
+ if string =~ /\A(\d{4})-(\d\d)-(\d\d)\z/
12
+ ::Date.new $1.to_i, $2.to_i, $3.to_i
13
+ else
14
+ string
15
+ end
16
+ end
17
+ end
18
+
19
+ class JSON < SimpleDecoder
20
+ def decode(string, tuple=nil, field=nil)
21
+ ::JSON.parse(string, quirks_mode: true)
22
+ end
23
+ end
24
+
25
+ # Convenience classes for timezone options
26
+ class TimestampUtc < Timestamp
27
+ def initialize(params={})
28
+ super(params.merge(flags: PG::Coder::TIMESTAMP_DB_UTC | PG::Coder::TIMESTAMP_APP_UTC))
29
+ end
30
+ end
31
+ class TimestampUtcToLocal < Timestamp
32
+ def initialize(params={})
33
+ super(params.merge(flags: PG::Coder::TIMESTAMP_DB_UTC | PG::Coder::TIMESTAMP_APP_LOCAL))
34
+ end
35
+ end
36
+ class TimestampLocal < Timestamp
37
+ def initialize(params={})
38
+ super(params.merge(flags: PG::Coder::TIMESTAMP_DB_LOCAL | PG::Coder::TIMESTAMP_APP_LOCAL))
39
+ end
40
+ end
41
+
42
+ # For backward compatibility:
43
+ TimestampWithoutTimeZone = TimestampLocal
44
+ TimestampWithTimeZone = Timestamp
45
+ end
46
+ end # module PG
@@ -0,0 +1,59 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'json'
5
+ require 'ipaddr'
6
+
7
+ module PG
8
+ module TextEncoder
9
+ class Date < SimpleEncoder
10
+ def encode(value)
11
+ value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d") : value
12
+ end
13
+ end
14
+
15
+ class TimestampWithoutTimeZone < SimpleEncoder
16
+ def encode(value)
17
+ value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d %H:%M:%S.%N") : value
18
+ end
19
+ end
20
+
21
+ class TimestampUtc < SimpleEncoder
22
+ def encode(value)
23
+ value.respond_to?(:utc) ? value.utc.strftime("%Y-%m-%d %H:%M:%S.%N") : value
24
+ end
25
+ end
26
+
27
+ class TimestampWithTimeZone < SimpleEncoder
28
+ def encode(value)
29
+ value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d %H:%M:%S.%N %:z") : value
30
+ end
31
+ end
32
+
33
+ class JSON < SimpleEncoder
34
+ def encode(value)
35
+ ::JSON.generate(value, quirks_mode: true)
36
+ end
37
+ end
38
+
39
+ class Inet < SimpleEncoder
40
+ def encode(value)
41
+ case value
42
+ when IPAddr
43
+ default_prefix = (value.family == Socket::AF_INET ? 32 : 128)
44
+ s = value.to_s
45
+ if value.respond_to?(:prefix)
46
+ prefix = value.prefix
47
+ else
48
+ range = value.to_range
49
+ prefix = default_prefix - Math.log(((range.end.to_i - range.begin.to_i) + 1), 2).to_i
50
+ end
51
+ s << "/" << prefix.to_s if prefix != default_prefix
52
+ s
53
+ else
54
+ value
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end # module PG
data/lib/pg/tuple.rb ADDED
@@ -0,0 +1,30 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'pg' unless defined?( PG )
5
+
6
+
7
+ class PG::Tuple
8
+
9
+ ### Return a String representation of the object suitable for debugging.
10
+ def inspect
11
+ "#<#{self.class} #{self.map{|k,v| "#{k}: #{v.inspect}" }.join(", ") }>"
12
+ end
13
+
14
+ def has_key?(key)
15
+ field_map.has_key?(key)
16
+ end
17
+ alias key? has_key?
18
+
19
+ def keys
20
+ field_names || field_map.keys.freeze
21
+ end
22
+
23
+ def each_key(&block)
24
+ if fn=field_names
25
+ fn.each(&block)
26
+ else
27
+ field_map.each_key(&block)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'pg' unless defined?( PG )
5
+
6
+ class PG::TypeMapByColumn
7
+ # Returns the type oids of the assigned coders.
8
+ def oids
9
+ coders.map{|c| c.oid if c }
10
+ end
11
+
12
+ def inspect
13
+ type_strings = coders.map{|c| c ? c.inspect_short : 'nil' }
14
+ "#<#{self.class} #{type_strings.join(' ')}>"
15
+ end
16
+ end
data/lib/pg/version.rb ADDED
@@ -0,0 +1,4 @@
1
+ module PG
2
+ # Library version
3
+ VERSION = '1.3.4'
4
+ end
data/lib/pg.rb ADDED
@@ -0,0 +1,89 @@
1
+
2
+ # -*- ruby -*-
3
+ # frozen_string_literal: true
4
+
5
+ # The top-level PG namespace.
6
+ module PG
7
+
8
+ # Is this file part of a fat binary gem with bundled libpq?
9
+ bundled_libpq_path = File.join(__dir__, RUBY_PLATFORM.gsub(/^i386-/, "x86-"))
10
+ if File.exist?(bundled_libpq_path)
11
+ POSTGRESQL_LIB_PATH = bundled_libpq_path
12
+ else
13
+ bundled_libpq_path = nil
14
+ # Try to load libpq path as found by extconf.rb
15
+ begin
16
+ require "pg/postgresql_lib_path"
17
+ rescue LoadError
18
+ # rake-compiler doesn't use regular "make install", but uses it's own install tasks.
19
+ # It therefore doesn't copy pg/postgresql_lib_path.rb in case of "rake compile".
20
+ POSTGRESQL_LIB_PATH = false
21
+ end
22
+ end
23
+
24
+ add_dll_path = proc do |path, &block|
25
+ if RUBY_PLATFORM =~/(mswin|mingw)/i && path && File.exist?(path)
26
+ begin
27
+ require 'ruby_installer/runtime'
28
+ RubyInstaller::Runtime.add_dll_directory(path, &block)
29
+ rescue LoadError
30
+ old_path = ENV['PATH']
31
+ ENV['PATH'] = "#{path};#{old_path}"
32
+ block.call
33
+ ENV['PATH'] = old_path
34
+ end
35
+ else
36
+ # No need to set a load path manually - it's set as library rpath.
37
+ block.call
38
+ end
39
+ end
40
+
41
+ # Add a load path to the one retrieved from pg_config
42
+ add_dll_path.call(POSTGRESQL_LIB_PATH) do
43
+ if bundled_libpq_path
44
+ # It's a Windows binary gem, try the <major>.<minor> subdirectory
45
+ major_minor = RUBY_VERSION[ /^(\d+\.\d+)/ ] or
46
+ raise "Oops, can't extract the major/minor version from #{RUBY_VERSION.dump}"
47
+ require "#{major_minor}/pg_ext"
48
+ else
49
+ require 'pg_ext'
50
+ end
51
+ end
52
+
53
+
54
+ class NotAllCopyDataRetrieved < PG::Error
55
+ end
56
+ class NotInBlockingMode < PG::Error
57
+ end
58
+
59
+ # Get the PG library version.
60
+ #
61
+ # +include_buildnum+ is no longer used and any value passed will be ignored.
62
+ def self::version_string( include_buildnum=nil )
63
+ return "%s %s" % [ self.name, VERSION ]
64
+ end
65
+
66
+
67
+ ### Convenience alias for PG::Connection.new.
68
+ def self::connect( *args, **kwargs )
69
+ return PG::Connection.new( *args, **kwargs )
70
+ end
71
+
72
+
73
+ require 'pg/exceptions'
74
+ require 'pg/constants'
75
+ require 'pg/coder'
76
+ require 'pg/binary_decoder'
77
+ require 'pg/text_encoder'
78
+ require 'pg/text_decoder'
79
+ require 'pg/basic_type_registry'
80
+ require 'pg/basic_type_map_based_on_result'
81
+ require 'pg/basic_type_map_for_queries'
82
+ require 'pg/basic_type_map_for_results'
83
+ require 'pg/type_map_by_column'
84
+ require 'pg/connection'
85
+ require 'pg/result'
86
+ require 'pg/tuple'
87
+ require 'pg/version'
88
+
89
+ end # module PG
data/lib/pg_ext.so ADDED
Binary file
@@ -0,0 +1,16 @@
1
+ # Not perfect. Simple `gem` hack to avoid the
2
+ # Mysql2Adapter in ActiveREcord from using rubygems.
3
+ #
4
+ if defined?(Rails)
5
+ $ORIG_GEM_METHOD = method(:gem)
6
+ kernel = (class << ::Kernel; self; end)
7
+ [kernel, ::Kernel].each do |k|
8
+ k.send :remove_method, :gem
9
+ k.send :define_method, :gem do |dep, *reqs|
10
+ unless ['postgresql'].include?(dep)
11
+ $ORIG_GEM_METHOD.call(dep, *reqs)
12
+ end
13
+ end
14
+ k.send :public, :gem
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ # -*- ruby -*-
2
+
3
+ PGHOST = 'localhost'
4
+ PGDB = 'test'
5
+ #SOCKHOST = 'github.com'
6
+ SOCKHOST = 'it-trac.laika.com'
7
+
8
+ # Load pg first, so the libssl.so that libpq is linked against is loaded.
9
+ require 'pg'
10
+ $stderr.puts "connecting to postgres://#{PGHOST}/#{PGDB}"
11
+ conn = PG.connect( PGHOST, :dbname => PGDB )
12
+
13
+ # Now load OpenSSL, which might be linked against a different libssl.
14
+ require 'socket'
15
+ require 'openssl'
16
+ $stderr.puts "Connecting to #{SOCKHOST}"
17
+ sock = TCPSocket.open( SOCKHOST, 443 )
18
+ ctx = OpenSSL::SSL::SSLContext.new
19
+ sock = OpenSSL::SSL::SSLSocket.new( sock, ctx )
20
+ sock.sync_close = true
21
+
22
+ # The moment of truth...
23
+ $stderr.puts "Attempting to connect..."
24
+ begin
25
+ sock.connect
26
+ rescue Errno
27
+ $stderr.puts "Got an error connecting, but no segfault."
28
+ else
29
+ $stderr.puts "Nope, no segfault!"
30
+ end
31
+
@@ -0,0 +1,9 @@
1
+ == v0.8.0 [2012-02-09] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ This placeholder version.
4
+
5
+
6
+ == v0.7.9.2008.01.28 [2008-01-28] Jeff Davis <<ruby-pg@j-davis.com>>
7
+
8
+ The last actual version.
9
+
@@ -0,0 +1,5 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/postgres.rb
@@ -0,0 +1,21 @@
1
+ = postgres
2
+
3
+ * https://github.com/ged/ruby-pg
4
+
5
+ == Description
6
+
7
+ This is an old, deprecated version of the Ruby PostgreSQL driver that hasn't
8
+ been maintained or supported since early 2008.
9
+
10
+ You should install/require 'pg' instead.
11
+
12
+ If you need the 'postgres' gem for legacy code that can't be converted, you can
13
+ still install it using an explicit version, like so:
14
+
15
+ gem install postgres -v '0.7.9.2008.01.28'
16
+ gem uninstall postgres -v '>0.7.9.2008.01.28'
17
+
18
+ If you have any questions, the nice folks in the Google group can help:
19
+
20
+ http://goo.gl/OjOPP / ruby-pg@googlegroups.com
21
+
@@ -0,0 +1,21 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'date'
4
+ require 'rubygems'
5
+ require 'hoe'
6
+ require 'pp'
7
+
8
+ Hoe.spec 'postgres' do
9
+ self.developer 'Michael Granger', 'ged@FaerieMUD.org'
10
+ self.dependency 'pg', '~> 0'
11
+ self.spec_extras[:date] = Date.parse( '2008/01/30' )
12
+
13
+ line = '-' * 75
14
+ msg = paragraphs_of( 'README.txt', 3..-1 )
15
+ msg.unshift( line )
16
+ msg.push( line )
17
+
18
+ self.spec_extras[:post_install_message] = msg.join( "\n\n" ) + "\n"
19
+ end
20
+
21
+ # vim: syntax=ruby
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'pathname'
4
+
5
+ module Postgres
6
+
7
+ VERSION = '0.8.1'
8
+
9
+ gemdir = Pathname( __FILE__ ).dirname.parent
10
+ readme = gemdir + 'README.txt'
11
+
12
+ header, message = readme.read.split( /^== Description/m )
13
+ abort( message.strip )
14
+
15
+ end
16
+
@@ -0,0 +1,9 @@
1
+ == v0.8.0 [2012-02-09] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ This placeholder version.
4
+
5
+
6
+ == v0.7.9.2008.01.28 [2008-01-28] Jeff Davis <<ruby-pg@j-davis.com>>
7
+
8
+ The last actual version.
9
+
@@ -0,0 +1,5 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/ruby/pg.rb
@@ -0,0 +1,21 @@
1
+ = ruby-pg
2
+
3
+ * https://github.com/ged/ruby-pg
4
+
5
+ == Description
6
+
7
+ This is an old, deprecated version of the 'pg' gem that hasn't been
8
+ maintained or supported since early 2008.
9
+
10
+ You should install/require 'pg' instead.
11
+
12
+ If you need ruby-pg for legacy code that can't be converted, you can still
13
+ install it using an explicit version, like so:
14
+
15
+ gem install ruby-pg -v '0.7.9.2008.01.28'
16
+ gem uninstall ruby-pg -v '>0.7.9.2008.01.28'
17
+
18
+ If you have any questions, the nice folks in the Google group can help:
19
+
20
+ http://goo.gl/OjOPP / ruby-pg@googlegroups.com
21
+
@@ -0,0 +1,21 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'date'
4
+ require 'rubygems'
5
+ require 'hoe'
6
+ require 'pp'
7
+
8
+ Hoe.spec 'ruby-pg' do
9
+ self.developer 'Michael Granger', 'ged@FaerieMUD.org'
10
+ self.dependency 'pg', '~> 0'
11
+ self.spec_extras[:date] = Date.parse( '2008/01/30' )
12
+
13
+ line = '-' * 75
14
+ msg = paragraphs_of( 'README.txt', 3..-1 )
15
+ msg.unshift( line )
16
+ msg.push( line )
17
+
18
+ self.spec_extras[:post_install_message] = msg.join( "\n\n" ) + "\n"
19
+ end
20
+
21
+ # vim: syntax=ruby
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'pathname'
4
+
5
+ module Pg
6
+
7
+ VERSION = '0.8.0'
8
+
9
+ gemdir = Pathname( __FILE__ ).dirname.parent.parent
10
+ readme = gemdir + 'README.txt'
11
+
12
+ header, message = readme.read.split( /^== Description/m )
13
+ abort( message.strip )
14
+
15
+ end
16
+
data/pg.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require_relative 'lib/pg/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pg"
8
+ spec.version = PG::VERSION
9
+ spec.authors = ["Michael Granger", "Lars Kanis"]
10
+ spec.email = ["ged@FaerieMUD.org", "lars@greiz-reinsdorf.de"]
11
+
12
+ spec.summary = "Pg is the Ruby interface to the PostgreSQL RDBMS"
13
+ spec.description = "Pg is the Ruby interface to the PostgreSQL RDBMS. It works with PostgreSQL 9.3 and later."
14
+ spec.homepage = "https://github.com/ged/ruby-pg"
15
+ spec.license = "BSD-2-Clause"
16
+ spec.required_ruby_version = ">= 2.5"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/ged/ruby-pg"
20
+ spec.metadata["changelog_uri"] = "https://github.com/ged/ruby-pg/blob/master/History.rdoc"
21
+ spec.metadata["documentation_uri"] = "http://deveiate.org/code/pg"
22
+
23
+ # Specify which files should be added to the gem when it is released.
24
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
+ end
28
+ spec.extensions = ["ext/extconf.rb"]
29
+ spec.require_paths = ["lib"]
30
+ spec.cert_chain = ["certs/ged.pem"]
31
+ spec.rdoc_options = ["--main", "README.rdoc"]
32
+ end
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'postgresql-lambda'
3
+ s.version = "#{File.read('VERSION').strip}.#{File.read('BUILD').strip}"
4
+ s.authors = ['Ryan Grush']
5
+ s.license = "MIT"
6
+ s.email = ['ryan.grush@dadesystems.com']
7
+ s.homepage = 'https://github.com/ryangrush/postgresql-lambda'
8
+ s.rdoc_options = ['--charset=UTF-8']
9
+ s.summary = 'Precompiled POSTGRESQL gem for AWS Lambda.'
10
+ s.metadata = {
11
+ 'bug_tracker_uri' => "#{s.homepage}/issues",
12
+ 'changelog_uri' => "#{s.homepage}/releases/tag/#{s.version}",
13
+ 'homepage_uri' => s.homepage,
14
+ 'source_code_uri' => "#{s.homepage}/tree/#{s.version}",
15
+ }
16
+ s.required_ruby_version = '>= 2.7.2'
17
+ s.files = Dir.glob('./**/*')
18
+ end
@@ -0,0 +1,46 @@
1
+ # This source code is borrowed from:
2
+ # https://github.com/oneclick/rubyinstaller2/blob/b3dcbf69f131e44c78ea3a1c5e0041c223f266ce/lib/ruby_installer/build/utils.rb#L104-L144
3
+
4
+ module TaskExtension
5
+ # Extend rake's file task to be defined only once and to check the expected file is indeed generated
6
+ #
7
+ # The same as #task, but for #file.
8
+ # In addition this file task raises an error, if the file that is expected to be generated is not present after the block was executed.
9
+ def file(name, *args, &block)
10
+ task_once(name, block) do
11
+ super(name, *args) do |ta|
12
+ block.call(ta).tap do
13
+ raise "file #{ta.name} is missing after task executed" unless File.exist?(ta.name)
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # Extend rake's task definition to be defined only once, even if called several times
20
+ #
21
+ # This allows to define common tasks next to specific tasks.
22
+ # It is expected that any variation of the task's block is reflected in the task name or namespace.
23
+ # If the task name is identical, the task block is executed only once, even if the file task definition is executed twice.
24
+ def task(name, *args, &block)
25
+ task_once(name, block) do
26
+ super
27
+ end
28
+ end
29
+
30
+ private def task_once(name, block)
31
+ name = name.keys.first if name.is_a?(Hash)
32
+ if block &&
33
+ Rake::Task.task_defined?(name) &&
34
+ Rake::Task[name].instance_variable_get('@task_block_location') == block.source_location
35
+ # task is already defined for this target and the same block
36
+ # So skip double definition of the same action
37
+ Rake::Task[name]
38
+ elsif block
39
+ yield.tap do
40
+ Rake::Task[name].instance_variable_set('@task_block_location', block.source_location)
41
+ end
42
+ else
43
+ yield
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,20 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'pg'
4
+
5
+ c = PG.connect( dbname: 'test' )
6
+
7
+ # this one works:
8
+ c.exec( "DROP TABLE IF EXISTS foo" )
9
+ c.exec( "CREATE TABLE foo (strings character varying[]);" )
10
+
11
+ # But using a prepared statement works:
12
+ c.set_error_verbosity( PG::PQERRORS_VERBOSE )
13
+ c.prepare( 'stmt', "INSERT INTO foo VALUES ($1);" )
14
+
15
+ # This won't work
16
+ #c.exec_prepared( 'stmt', ["ARRAY['this','that']"] )
17
+
18
+ # but this will:
19
+ c.exec_prepared( 'stmt', ["{'this','that'}"] )
20
+