cipherstash-pg 1.0.0.beta.1-arm64-darwin-22 → 1.0.0.beta.4-arm64-darwin-22

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.appveyor.yml +42 -0
  3. data/.gems +6 -0
  4. data/.gemtest +0 -0
  5. data/.github/workflows/binary-gems.yml +117 -0
  6. data/.github/workflows/source-gem.yml +137 -0
  7. data/.gitignore +19 -0
  8. data/.hgsigs +34 -0
  9. data/.hgtags +41 -0
  10. data/.irbrc +23 -0
  11. data/.pryrc +23 -0
  12. data/.tm_properties +21 -0
  13. data/.travis.yml +49 -0
  14. data/Gemfile +3 -3
  15. data/Gemfile.lock +45 -0
  16. data/{History.rdoc → History.md} +168 -153
  17. data/README.ja.md +266 -0
  18. data/README.md +272 -0
  19. data/Rakefile +65 -104
  20. data/Rakefile.cross +298 -0
  21. data/certs/larskanis-2023.pem +24 -0
  22. data/cipherstash-pg.gemspec +0 -0
  23. data/lib/2.7/pg_ext.bundle +0 -0
  24. data/lib/3.0/pg_ext.bundle +0 -0
  25. data/lib/3.1/pg_ext.bundle +0 -0
  26. data/lib/3.2/pg_ext.bundle +0 -0
  27. data/lib/cipherstash-pg/basic_type_map_based_on_result.rb +11 -0
  28. data/lib/cipherstash-pg/basic_type_map_for_queries.rb +113 -0
  29. data/lib/cipherstash-pg/basic_type_map_for_results.rb +30 -0
  30. data/lib/cipherstash-pg/basic_type_registry.rb +206 -0
  31. data/lib/cipherstash-pg/binary_decoder.rb +21 -0
  32. data/lib/cipherstash-pg/coder.rb +82 -0
  33. data/lib/cipherstash-pg/connection.rb +467 -0
  34. data/lib/cipherstash-pg/constants.rb +3 -0
  35. data/lib/cipherstash-pg/exceptions.rb +19 -0
  36. data/lib/cipherstash-pg/result.rb +22 -0
  37. data/lib/cipherstash-pg/text_decoder.rb +43 -0
  38. data/lib/cipherstash-pg/text_encoder.rb +67 -0
  39. data/lib/cipherstash-pg/tuple.rb +24 -0
  40. data/lib/cipherstash-pg/type_map_by_column.rb +11 -0
  41. data/lib/cipherstash-pg/version.rb +3 -0
  42. data/lib/cipherstash-pg.rb +56 -11
  43. data/lib/libpq.5.dylib +0 -0
  44. data/misc/openssl-pg-segfault.rb +15 -25
  45. data/misc/postgres/Rakefile +13 -20
  46. data/misc/postgres/lib/postgres.rb +10 -14
  47. data/misc/ruby-pg/Rakefile +13 -20
  48. data/misc/ruby-pg/lib/ruby/pg.rb +10 -14
  49. data/rakelib/task_extension.rb +17 -31
  50. data/sample/array_insert.rb +7 -20
  51. data/sample/async_api.rb +54 -96
  52. data/sample/async_copyto.rb +20 -35
  53. data/sample/async_mixed.rb +22 -50
  54. data/sample/check_conn.rb +8 -20
  55. data/sample/copydata.rb +18 -68
  56. data/sample/copyfrom.rb +26 -78
  57. data/sample/copyto.rb +10 -16
  58. data/sample/cursor.rb +9 -19
  59. data/sample/disk_usage_report.rb +89 -174
  60. data/sample/issue-119.rb +45 -93
  61. data/sample/losample.rb +48 -66
  62. data/sample/minimal-testcase.rb +6 -17
  63. data/sample/notify_wait.rb +21 -67
  64. data/sample/pg_statistics.rb +100 -281
  65. data/sample/replication_monitor.rb +119 -218
  66. data/sample/test_binary_values.rb +14 -30
  67. data/sample/wal_shipper.rb +199 -431
  68. data/sample/warehouse_partitions.rb +157 -307
  69. data/translation/.po4a-version +7 -0
  70. data/translation/po/all.pot +875 -0
  71. data/translation/po/ja.po +868 -0
  72. data/translation/po4a.cfg +9 -0
  73. metadata +50 -28
  74. data/README.ja.rdoc +0 -13
  75. data/README.rdoc +0 -233
  76. data/lib/pg/basic_type_map_based_on_result.rb +0 -47
  77. data/lib/pg/basic_type_map_for_queries.rb +0 -193
  78. data/lib/pg/basic_type_map_for_results.rb +0 -81
  79. data/lib/pg/basic_type_registry.rb +0 -301
  80. data/lib/pg/binary_decoder.rb +0 -23
  81. data/lib/pg/coder.rb +0 -104
  82. data/lib/pg/connection.rb +0 -878
  83. data/lib/pg/constants.rb +0 -12
  84. data/lib/pg/exceptions.rb +0 -18
  85. data/lib/pg/result.rb +0 -43
  86. data/lib/pg/text_decoder.rb +0 -46
  87. data/lib/pg/text_encoder.rb +0 -59
  88. data/lib/pg/tuple.rb +0 -30
  89. data/lib/pg/type_map_by_column.rb +0 -16
  90. data/lib/pg/version.rb +0 -4
  91. data/lib/pg.rb +0 -55
data/Rakefile CHANGED
@@ -1,115 +1,76 @@
1
- # -*- rake -*-
2
-
3
- require 'rbconfig'
4
- require 'pathname'
5
- require 'tmpdir'
6
- require 'rake/extensiontask'
7
- require 'rake/clean'
8
- require 'rspec/core/rake_task'
9
- require 'bundler'
10
- require 'bundler/gem_helper'
11
-
12
- # Build directory constants
13
- BASEDIR = Pathname( __FILE__ ).dirname
14
- SPECDIR = BASEDIR + 'spec'
15
- LIBDIR = BASEDIR + 'lib'
16
- EXTDIR = BASEDIR + 'ext'
17
- PKGDIR = BASEDIR + 'pkg'
18
- TMPDIR = BASEDIR + 'tmp'
19
- TESTDIR = BASEDIR + "tmp_test_*"
20
-
21
- DLEXT = RbConfig::CONFIG['DLEXT']
22
- EXT = LIBDIR + "pg_ext.#{DLEXT}"
23
-
24
- GEMSPEC = 'cipherstash-pg.gemspec'
25
-
26
- CLEAN.include( TESTDIR.to_s )
27
- CLEAN.include( PKGDIR.to_s, TMPDIR.to_s )
28
- CLEAN.include "lib/*/libpq.dll"
29
- CLEAN.include "lib/pg_ext.*"
30
- CLEAN.include "lib/pg/postgresql_lib_path.rb"
31
-
32
- # load 'Rakefile.cross'
33
-
1
+ require("rbconfig")
2
+ require("pathname")
3
+ require("tmpdir")
4
+ require("rake/extensiontask")
5
+ require("rake/clean")
6
+ require("rspec/core/rake_task")
7
+ require("bundler")
8
+ require("bundler/gem_helper")
9
+ BASEDIR = Pathname("(string)").dirname
10
+ SPECDIR = (BASEDIR + "spec")
11
+ LIBDIR = (BASEDIR + "lib")
12
+ EXTDIR = (BASEDIR + "ext")
13
+ PKGDIR = (BASEDIR + "pkg")
14
+ TMPDIR = (BASEDIR + "tmp")
15
+ TESTDIR = (BASEDIR + "tmp_test_*")
16
+ DLEXT = RbConfig::CONFIG["DLEXT"]
17
+ EXT = (LIBDIR + "pg_ext.#{DLEXT}")
18
+ GEMSPEC = "cipherstash-pg.gemspec"
19
+ CLEAN.include(TESTDIR.to_s)
20
+ CLEAN.include(PKGDIR.to_s, TMPDIR.to_s)
21
+ CLEAN.include("lib/*/libpq.dll")
22
+ CLEAN.include("lib/pg_ext.*")
23
+ CLEAN.include("lib/pg/postgresql_lib_path.rb")
24
+ load("Rakefile.cross")
34
25
  Bundler::GemHelper.install_tasks
35
26
  $gem_spec = Bundler.load_gemspec(GEMSPEC)
36
-
37
- desc "Turn on warnings and debugging in the build."
38
- task :maint do
39
- ENV['MAINTAINER_MODE'] = 'yes'
40
- end
41
-
42
- # Rake-compiler task
27
+ desc("Turn on warnings and debugging in the build.")
28
+ task(:maint) { ENV["MAINTAINER_MODE"] = "yes" }
43
29
  Rake::ExtensionTask.new do |ext|
44
- ext.name = 'pg_ext'
45
- ext.gem_spec = $gem_spec
46
- ext.ext_dir = 'ext'
47
- ext.lib_dir = 'lib'
48
- ext.source_pattern = "*.{c,h}"
49
- ext.cross_compile = false
50
- # ext.cross_platform = CrossLibraries.map(&:for_platform)
51
-
52
- # ext.cross_config_options += CrossLibraries.map do |lib|
53
- # {
54
- # lib.for_platform => [
55
- # "--enable-windows-cross",
56
- # "--with-pg-include=#{lib.static_postgresql_incdir}",
57
- # "--with-pg-lib=#{lib.static_postgresql_libdir}",
58
- # # libpq-fe.h resides in src/interfaces/libpq/ before make install
59
- # "--with-opt-include=#{lib.static_postgresql_libdir}",
60
- # ]
61
- # }
62
- # end
63
-
64
- # Add libpq.dll to windows binary gemspec
65
- # ext.cross_compiling do |spec|
66
- # spec.files << "lib/#{spec.platform}/libpq.dll"
67
- # end
30
+ ext.name = "pg_ext"
31
+ ext.gem_spec = $gem_spec
32
+ ext.ext_dir = "ext"
33
+ ext.lib_dir = "lib"
34
+ ext.source_pattern = "*.{c,h}"
35
+ ext.cross_compile = true
36
+ ext.cross_platform = CrossLibraries.map(&:for_platform)
37
+ ext.cross_config_options += CrossLibraries.map do |lib|
38
+ { lib.for_platform => (["--enable-windows-cross", "--with-pg-include=#{lib.static_postgresql_incdir}", "--with-pg-lib=#{lib.static_postgresql_libdir}", "--with-opt-include=#{lib.static_postgresql_libdir}"]) }
39
+ end
40
+ ext.cross_compiling do |spec|
41
+ (spec.files << "lib/#{spec.platform}/libpq.dll")
42
+ end
68
43
  end
69
-
70
44
  RSpec::Core::RakeTask.new(:spec).rspec_opts = "--profile -cfdoc"
71
- task :test => :spec
72
-
73
- # Use the fivefish formatter for docs generated from development checkout
74
- require 'rdoc/task'
75
-
76
- RDoc::Task.new( 'docs' ) do |rdoc|
77
- rdoc.options = $gem_spec.rdoc_options
78
- rdoc.rdoc_files = $gem_spec.extra_rdoc_files
79
- rdoc.generator = :fivefish
80
- rdoc.rdoc_dir = 'doc'
45
+ task(:test => :spec)
46
+ require("rdoc/task")
47
+ RDoc::Task.new("docs") do |rdoc|
48
+ rdoc.options = $gem_spec.rdoc_options
49
+ rdoc.rdoc_files = $gem_spec.extra_rdoc_files
50
+ rdoc.generator = :fivefish
51
+ rdoc.rdoc_dir = "doc"
81
52
  end
82
-
83
- desc "Build the source gem #{$gem_spec.full_name}.gem into the pkg directory"
84
- task :gem => :build
85
-
86
- task :clobber do
87
- puts "Stop any Postmaster instances that remain after testing."
88
- require_relative 'spec/helpers'
89
- PG::TestingHelpers.stop_existing_postmasters()
53
+ desc("Build the source gem #{$gem_spec.full_name}.gem into the pkg directory")
54
+ task(:gem => :build)
55
+ task(:clobber) do
56
+ puts("Stop any Postmaster instances that remain after testing.")
57
+ require_relative("spec/helpers")
58
+ CipherStashPG::TestingHelpers.stop_existing_postmasters
90
59
  end
91
-
92
- desc "Update list of server error codes"
93
- task :update_error_codes do
94
- URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_15_0"
95
-
96
- ERRORCODES_TXT = "ext/errorcodes.txt"
97
- sh "wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}"
98
-
99
- ruby 'ext/errorcodes.rb', 'ext/errorcodes.txt', 'ext/errorcodes.def'
60
+ desc("Update list of server error codes")
61
+ task(:update_error_codes) do
62
+ URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_15_0"
63
+ ERRORCODES_TXT = "ext/errorcodes.txt"
64
+ sh("wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}")
65
+ ruby("ext/errorcodes.rb", "ext/errorcodes.txt", "ext/errorcodes.def")
100
66
  end
101
-
102
- file 'ext/pg_errors.c' => ['ext/errorcodes.def'] do
103
- # trigger compilation of changed errorcodes.def
104
- touch 'ext/pg_errors.c'
67
+ file("ext/pg_errors.c" => (["ext/errorcodes.def"])) do
68
+ touch("ext/pg_errors.c")
105
69
  end
106
-
107
- desc "Translate readme"
108
- task :translate do
109
- cd "translation" do
110
- # po4a's lexer might change, so record its version for reference
111
- sh "LANG=C po4a --version > .po4a-version"
112
-
113
- sh "po4a po4a.cfg"
70
+ desc("Translate readme")
71
+ task(:translate) do
72
+ cd("translation") do
73
+ sh("LANG=C po4a --version > .po4a-version")
74
+ sh("po4a po4a.cfg")
114
75
  end
115
76
  end
data/Rakefile.cross ADDED
@@ -0,0 +1,298 @@
1
+ # -*- rake -*-
2
+
3
+ require 'uri'
4
+ require 'tempfile'
5
+ require 'rbconfig'
6
+ require 'rake/clean'
7
+ require 'rake/extensiontask'
8
+ require 'rake/extensioncompiler'
9
+ require 'ostruct'
10
+ require_relative 'rakelib/task_extension'
11
+
12
+ MISCDIR = BASEDIR + 'misc'
13
+
14
+ NUM_CPUS = if File.exist?('/proc/cpuinfo')
15
+ File.read('/proc/cpuinfo').scan('processor').length
16
+ elsif RUBY_PLATFORM.include?( 'darwin' )
17
+ `system_profiler SPHardwareDataType | grep 'Cores' | awk '{print $5}'`.chomp
18
+ else
19
+ 1
20
+ end
21
+
22
+ class CrossLibrary < OpenStruct
23
+ include Rake::DSL
24
+ prepend TaskExtension
25
+
26
+ def initialize(for_platform, openssl_config, toolchain)
27
+ super()
28
+
29
+ self.for_platform = for_platform
30
+ self.openssl_config = openssl_config
31
+ self.host_platform = toolchain
32
+
33
+ # Cross-compilation constants
34
+ self.openssl_version = ENV['OPENSSL_VERSION'] || '3.0.8'
35
+ self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '15.2'
36
+
37
+ # Check if symlinks work in the current working directory.
38
+ # This fails, if rake-compiler-dock is running on a Windows box.
39
+ begin
40
+ FileUtils.rm_f '.test_symlink'
41
+ FileUtils.ln_s '/', '.test_symlink'
42
+ rescue NotImplementedError, SystemCallError
43
+ # Symlinks don't work -> use home directory instead
44
+ self.compile_home = Pathname( "~/.ruby-pg-build" ).expand_path
45
+ else
46
+ self.compile_home = Pathname( "./build" ).expand_path
47
+ end
48
+ self.static_sourcesdir = compile_home + 'sources'
49
+ self.static_builddir = compile_home + 'builds' + for_platform
50
+ CLOBBER.include( static_sourcesdir )
51
+ CLEAN.include( static_builddir )
52
+
53
+ # Static OpenSSL build vars
54
+ self.static_openssl_builddir = static_builddir + "openssl-#{openssl_version}"
55
+
56
+ self.openssl_source_uri =
57
+ URI( "http://www.openssl.org/source/openssl-#{openssl_version}.tar.gz" )
58
+ self.openssl_tarball = static_sourcesdir + File.basename( openssl_source_uri.path )
59
+ self.openssl_makefile = static_openssl_builddir + 'Makefile'
60
+
61
+ self.libssl = static_openssl_builddir + 'libssl.a'
62
+ self.libcrypto = static_openssl_builddir + 'libcrypto.a'
63
+
64
+ self.openssl_patches = Rake::FileList[ (MISCDIR + "openssl-#{openssl_version}.*.patch").to_s ]
65
+
66
+ # Static PostgreSQL build vars
67
+ self.static_postgresql_builddir = static_builddir + "postgresql-#{postgresql_version}"
68
+ self.postgresql_source_uri = begin
69
+ uristring = "http://ftp.postgresql.org/pub/source/v%s/postgresql-%s.tar.bz2" %
70
+ [ postgresql_version, postgresql_version ]
71
+ URI( uristring )
72
+ end
73
+ self.postgresql_tarball = static_sourcesdir + File.basename( postgresql_source_uri.path )
74
+
75
+ self.static_postgresql_srcdir = static_postgresql_builddir + 'src'
76
+ self.static_postgresql_libdir = static_postgresql_srcdir + 'interfaces/libpq'
77
+ self.static_postgresql_incdir = static_postgresql_srcdir + 'include'
78
+
79
+ self.postgresql_global_makefile = static_postgresql_srcdir + 'Makefile.global'
80
+ self.postgresql_shlib_makefile = static_postgresql_srcdir + 'Makefile.shlib'
81
+ self.postgresql_shlib_mf_orig = static_postgresql_srcdir + 'Makefile.shlib.orig'
82
+ self.postgresql_lib = static_postgresql_libdir + 'libpq.dll'
83
+ self.postgresql_patches = Rake::FileList[ (MISCDIR + "postgresql-#{postgresql_version}.*.patch").to_s ]
84
+
85
+ # clean intermediate files and folders
86
+ CLEAN.include( static_builddir.to_s )
87
+
88
+ #####################################################################
89
+ ### C R O S S - C O M P I L A T I O N - T A S K S
90
+ #####################################################################
91
+
92
+
93
+ directory static_sourcesdir.to_s
94
+
95
+ #
96
+ # Static OpenSSL build tasks
97
+ #
98
+ directory static_openssl_builddir.to_s
99
+
100
+ # openssl source file should be stored there
101
+ file openssl_tarball => static_sourcesdir do |t|
102
+ download( openssl_source_uri, t.name )
103
+ end
104
+
105
+ # Extract the openssl builds
106
+ file static_openssl_builddir => openssl_tarball do |t|
107
+ puts "extracting %s to %s" % [ openssl_tarball, static_openssl_builddir.parent ]
108
+ static_openssl_builddir.mkpath
109
+ run 'tar', '-xzf', openssl_tarball.to_s, '-C', static_openssl_builddir.parent.to_s
110
+ openssl_makefile.unlink if openssl_makefile.exist?
111
+
112
+ openssl_patches.each do |patchfile|
113
+ puts " applying patch #{patchfile}..."
114
+ run 'patch', '-Np1', '-d', static_openssl_builddir.to_s,
115
+ '-i', File.expand_path( patchfile, BASEDIR )
116
+ end
117
+ end
118
+
119
+ self.cmd_prelude = [
120
+ "env",
121
+ "CROSS_COMPILE=#{host_platform}-",
122
+ "CFLAGS=-DDSO_WIN32",
123
+ ]
124
+
125
+
126
+ # generate the makefile in a clean build location
127
+ file openssl_makefile => static_openssl_builddir do |t|
128
+ chdir( static_openssl_builddir ) do
129
+ cmd = cmd_prelude.dup
130
+ cmd << "./Configure" << "-static" << openssl_config
131
+
132
+ run( *cmd )
133
+ end
134
+ end
135
+
136
+ desc "compile static openssl libraries"
137
+ task "openssl_libs:#{for_platform}" => [ libssl, libcrypto ]
138
+
139
+ task "compile_static_openssl:#{for_platform}" => openssl_makefile do |t|
140
+ chdir( static_openssl_builddir ) do
141
+ cmd = cmd_prelude.dup
142
+ cmd << 'make' << "-j#{NUM_CPUS}" << 'build_libs'
143
+
144
+ run( *cmd )
145
+ end
146
+ end
147
+
148
+ desc "compile static #{libssl}"
149
+ file libssl => "compile_static_openssl:#{for_platform}"
150
+
151
+ desc "compile static #{libcrypto}"
152
+ file libcrypto => "compile_static_openssl:#{for_platform}"
153
+
154
+
155
+
156
+ #
157
+ # Static PostgreSQL build tasks
158
+ #
159
+ directory static_postgresql_builddir.to_s
160
+
161
+
162
+ # postgresql source file should be stored there
163
+ file postgresql_tarball => static_sourcesdir do |t|
164
+ download( postgresql_source_uri, t.name )
165
+ end
166
+
167
+ # Extract the postgresql sources
168
+ file static_postgresql_builddir => postgresql_tarball do |t|
169
+ puts "extracting %s to %s" % [ postgresql_tarball, static_postgresql_builddir.parent ]
170
+ static_postgresql_builddir.mkpath
171
+ run 'tar', '-xjf', postgresql_tarball.to_s, '-C', static_postgresql_builddir.parent.to_s
172
+
173
+ postgresql_patches.each do |patchfile|
174
+ puts " applying patch #{patchfile}..."
175
+ run 'patch', '-Np1', '-d', static_postgresql_builddir.to_s,
176
+ '-i', File.expand_path( patchfile, BASEDIR )
177
+ end
178
+ end
179
+
180
+ # generate the makefile in a clean build location
181
+ file postgresql_global_makefile => [ static_postgresql_builddir, "openssl_libs:#{for_platform}" ] do |t|
182
+ options = [
183
+ "--target=#{host_platform}",
184
+ "--host=#{host_platform}",
185
+ '--with-openssl',
186
+ '--without-zlib',
187
+ ]
188
+
189
+ chdir( static_postgresql_builddir ) do
190
+ configure_path = static_postgresql_builddir + 'configure'
191
+ cmd = [ configure_path.to_s, *options ]
192
+ cmd << "CFLAGS=-L#{static_openssl_builddir}"
193
+ cmd << "LDFLAGS=-L#{static_openssl_builddir}"
194
+ cmd << "LDFLAGS_SL=-L#{static_openssl_builddir}"
195
+ cmd << "LIBS=-lwsock32 -lgdi32 -lws2_32 -lcrypt32"
196
+ cmd << "CPPFLAGS=-I#{static_openssl_builddir}/include"
197
+
198
+ run( *cmd )
199
+ end
200
+ end
201
+
202
+
203
+ # make libpq.dll
204
+ task postgresql_lib => [ postgresql_global_makefile ] do |t|
205
+ # Work around missing dependency to libcommon in PostgreSQL-9.4.0
206
+ chdir( static_postgresql_srcdir + "common" ) do
207
+ sh 'make', "-j#{NUM_CPUS}"
208
+ end
209
+ chdir( static_postgresql_srcdir + "port" ) do
210
+ sh 'make', "-j#{NUM_CPUS}"
211
+ end
212
+
213
+ chdir( postgresql_lib.dirname ) do
214
+ sh 'make',
215
+ "-j#{NUM_CPUS}",
216
+ postgresql_lib.basename.to_s,
217
+ 'SHLIB_LINK=-lssl -lcrypto -lcrypt32 -lgdi32 -lsecur32 -lwsock32 -lws2_32'
218
+ end
219
+ end
220
+
221
+
222
+ #desc 'compile libpg.a'
223
+ task "native:#{for_platform}" => postgresql_lib
224
+
225
+ # copy libpq.dll to lib dir
226
+ dest_libpq = "lib/#{for_platform}/#{postgresql_lib.basename}"
227
+ directory File.dirname(dest_libpq)
228
+ file dest_libpq => [postgresql_lib, File.dirname(dest_libpq)] do
229
+ cp postgresql_lib, dest_libpq
230
+ end
231
+
232
+ stage_libpq = "tmp/#{for_platform}/stage/#{dest_libpq}"
233
+ directory File.dirname(stage_libpq)
234
+ file stage_libpq => [postgresql_lib, File.dirname(stage_libpq)] do |t|
235
+ cp postgresql_lib, stage_libpq
236
+ end
237
+ end
238
+
239
+ def download(url, save_to)
240
+ part = save_to+".part"
241
+ sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
242
+ FileUtils.mv part, save_to
243
+ end
244
+
245
+ def run(*args)
246
+ sh(*args)
247
+ end
248
+ end
249
+
250
+ CrossLibraries = [
251
+ ['x64-mingw-ucrt', 'mingw64', 'x86_64-w64-mingw32'],
252
+ ['x86-mingw32', 'mingw', 'i686-w64-mingw32'],
253
+ ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
254
+ ].map do |platform, openssl_config, toolchain|
255
+ CrossLibrary.new platform, openssl_config, toolchain
256
+ end
257
+
258
+ desc 'cross compile pg for win32'
259
+ task :cross => [ :mingw32 ]
260
+
261
+ task :mingw32 do
262
+ # Use Rake::ExtensionCompiler helpers to find the proper host
263
+ unless Rake::ExtensionCompiler.mingw_host then
264
+ warn "You need to install mingw32 cross compile functionality to be able to continue."
265
+ warn "Please refer to your distribution/package manager documentation about installation."
266
+ fail
267
+ end
268
+ end
269
+
270
+ task 'gem:windows:prepare' do
271
+ require 'io/console'
272
+ require 'rake_compiler_dock'
273
+
274
+ # Copy gem signing key and certs to be accessible from the docker container
275
+ mkdir_p 'build/gem'
276
+ sh "cp ~/.gem/gem-*.pem build/gem/ || true"
277
+ sh "bundle package"
278
+ begin
279
+ OpenSSL::PKey.read(File.read(File.expand_path("~/.gem/gem-private_key.pem")), ENV["GEM_PRIVATE_KEY_PASSPHRASE"] || "")
280
+ rescue OpenSSL::PKey::PKeyError
281
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
282
+ retry
283
+ end
284
+ end
285
+
286
+ CrossLibraries.each do |xlib|
287
+ platform = xlib.for_platform
288
+ desc "Build fat binary gem for platform #{platform}"
289
+ task "gem:windows:#{platform}" => ['gem:windows:prepare', xlib.openssl_tarball, xlib.postgresql_tarball] do
290
+ RakeCompilerDock.sh <<-EOT, platform: platform
291
+ (cp build/gem/gem-*.pem ~/.gem/ || true) &&
292
+ bundle install --local &&
293
+ rake native:#{platform} pkg/#{$gem_spec.full_name}-#{platform}.gem MAKE="make -j`nproc`" RUBY_CC_VERSION=3.2.0:3.1.0:3.0.0:2.7.0:2.6.0:2.5.0
294
+ EOT
295
+ end
296
+ desc "Build the windows binary gems"
297
+ multitask 'gem:windows' => "gem:windows:#{platform}"
298
+ end
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEBDCCAmygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
3
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMzAyMTUxNzQxMTVaFw0yNDAy
4
+ MTUxNzQxMTVaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
5
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
6
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
7
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
8
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
9
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
10
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
11
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
12
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
13
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjOTA3MAkG
14
+ A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQ4h1tIyvdUWtMI739xMzTR
15
+ 7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEAQAcuTARfiiVUVx5KURICfdTM2Kd7LhOn
16
+ qt3Vs4ANGvT226LEp3RnQ+kWGQYMRb3cw3LY2TNQRPlnZxE994mgjBscN4fbjXqO
17
+ T0JbVpeszRZa5k1goggbnWT7CO7yU7WcHh13DaSubY7HUpAJn2xz9w2stxQfN/EE
18
+ VMlnDJ1P7mUHAvpK8X9j9h7Xlc1niViT18MYwux8mboVTryrLr+clATUkkM3yBF0
19
+ RV+c34ReW5eXO9Tr6aKTxh/pFC9ggDT6jOxuJgSvG8HWJzVf4NDvMavIas4KYjiI
20
+ BU6CpWaG5NxicqL3BERi52U43HV08br+LNVpb7Rekgve/PJuSFnAR015bhSRXe5U
21
+ vBioD1qW2ZW9tXg8Ww2IfDaO5a1So5Xby51rhNlyo6ATj2NkuLWZUKPKHhAz0TKm
22
+ Dzx/gFSOrRoCt2mXNgrmcAfr386AfaMvCh7cXqdxZwmVo7ILZCYXck0pajvubsDd
23
+ NUIIFkVXvd1odFyK9LF1RFAtxn/iAmpx
24
+ -----END CERTIFICATE-----
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ require("cipherstash-pg") unless defined? CipherStashPG
2
+ class CipherStashPG::BasicTypeMapBasedOnResult < CipherStashPG::TypeMapByOid
3
+ include(CipherStashPG::BasicTypeRegistry::Checker)
4
+
5
+ def initialize(connection_or_coder_maps, registry: nil)
6
+ @coder_maps = build_coder_maps(connection_or_coder_maps, :registry => registry)
7
+ @coder_maps.each_format(:encoder).flat_map { |f| f.coders }.each do |coder|
8
+ add_coder(coder)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,113 @@
1
+ require("cipherstash-pg") unless defined? CipherStashPG
2
+ class CipherStashPG::BasicTypeMapForQueries < CipherStashPG::TypeMapByClass
3
+ class BinaryData < String
4
+ end
5
+
6
+ class UndefinedEncoder < RuntimeError
7
+ end
8
+
9
+ include(CipherStashPG::BasicTypeRegistry::Checker)
10
+
11
+ def initialize(connection_or_coder_maps, registry: nil, if_undefined: nil)
12
+ @coder_maps = build_coder_maps(connection_or_coder_maps, :registry => registry)
13
+ @array_encoders_by_klass = array_encoders_by_klass
14
+ @encode_array_as = :array
15
+ @if_undefined = (if_undefined or proc do |oid_name, format|
16
+ raise(UndefinedEncoder, "no encoder defined for type #{oid_name.inspect} format #{format}")
17
+ end)
18
+ init_encoders
19
+ end
20
+
21
+ def encode_array_as=(pg_type)
22
+ case pg_type
23
+ when :array then
24
+ # do nothing
25
+ when :json then
26
+ # do nothing
27
+ when :record then
28
+ # do nothing
29
+ when /\A_/ then
30
+ # do nothing
31
+ else
32
+ raise(ArgumentError, "invalid pg_type #{pg_type.inspect}")
33
+ end
34
+ @encode_array_as = pg_type
35
+ init_encoders
36
+ end
37
+
38
+ attr_reader(:encode_array_as)
39
+
40
+ private
41
+
42
+ def init_encoders
43
+ coders.each { |kl, c| self[kl] = nil }
44
+ populate_encoder_list
45
+ @textarray_encoder = coder_by_name(0, :encoder, "_text")
46
+ end
47
+
48
+ def coder_by_name(format, direction, name)
49
+ check_format_and_direction(format, direction)
50
+ @coder_maps.map_for(format, direction).coder_by_name(name)
51
+ end
52
+
53
+ def undefined(name, format)
54
+ @if_undefined.call(name, format)
55
+ end
56
+
57
+ def populate_encoder_list
58
+ DEFAULT_TYPE_MAP.each do |klass, selector|
59
+ if Array.===(selector) then
60
+ format, name, oid_name = selector
61
+ coder = coder_by_name(format, :encoder, name).dup
62
+ if coder then
63
+ if oid_name then
64
+ oid_coder = coder_by_name(format, :encoder, oid_name)
65
+ oid_coder ? (coder.oid = oid_coder.oid) : (undefined(oid_name, format))
66
+ else
67
+ coder.oid = 0
68
+ end
69
+ self[klass] = coder
70
+ else
71
+ undefined(name, format)
72
+ end
73
+ else
74
+ case @encode_array_as
75
+ when :array then
76
+ self[klass] = selector
77
+ when :json then
78
+ self[klass] = CipherStashPG::TextEncoder::JSON.new
79
+ when :record then
80
+ self[klass] = CipherStashPG::TextEncoder::Record.new(:type_map => (self))
81
+ when /\A_/ then
82
+ coder = coder_by_name(0, :encoder, @encode_array_as)
83
+ coder ? (self[klass] = coder) : (undefined(@encode_array_as, format))
84
+ else
85
+ raise(ArgumentError, "invalid pg_type #{@encode_array_as.inspect}")
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ def array_encoders_by_klass
92
+ DEFAULT_ARRAY_TYPE_MAP.inject({}) do |h, (klass, (format, name))|
93
+ h[klass] = coder_by_name(format, :encoder, name)
94
+ h
95
+ end
96
+ end
97
+
98
+ def get_array_type(value)
99
+ elem = value
100
+ while elem.kind_of?(Array) do
101
+ elem = elem.first
102
+ end
103
+ (@array_encoders_by_klass[elem.class] or (elem.class.ancestors.lazy.map do |ancestor|
104
+ @array_encoders_by_klass[ancestor]
105
+ end.find do |a|
106
+ a
107
+ end or @textarray_encoder))
108
+ end
109
+
110
+ DEFAULT_TYPE_MAP = { TrueClass => ([1, "bool", "bool"]), FalseClass => ([1, "bool", "bool"]), Integer => ([0, "int8"]), Float => ([0, "float8"]), BigDecimal => ([0, "numeric"]), Time => ([0, "timestamptz"]), IPAddr => ([0, "inet"]), Hash => ([0, "json"]), Array => :get_array_type, BinaryData => ([1, "bytea"]) }
111
+
112
+ DEFAULT_ARRAY_TYPE_MAP = { TrueClass => ([0, "_bool"]), FalseClass => ([0, "_bool"]), Integer => ([0, "_int8"]), String => ([0, "_text"]), Float => ([0, "_float8"]), BigDecimal => ([0, "_numeric"]), Time => ([0, "_timestamptz"]), IPAddr => ([0, "_inet"]) }
113
+ end
@@ -0,0 +1,30 @@
1
+ require("cipherstash-pg") unless defined? CipherStashPG
2
+ class CipherStashPG::BasicTypeMapForResults < CipherStashPG::TypeMapByOid
3
+ include(CipherStashPG::BasicTypeRegistry::Checker)
4
+
5
+ class WarningTypeMap < CipherStashPG::TypeMapInRuby
6
+ def initialize(typenames)
7
+ @already_warned = Hash.new { |h, k| h[k] = {} }
8
+ @typenames_by_oid = typenames
9
+ end
10
+
11
+ def typecast_result_value(result, _tuple, field)
12
+ format = result.fformat(field)
13
+ oid = result.ftype(field)
14
+ unless @already_warned[format][oid] then
15
+ warn("Warning: no type cast defined for type #{@typenames_by_oid[oid].inspect} format #{format} with oid #{oid}. Please cast this type explicitly to TEXT to be safe for future changes.")
16
+ @already_warned[format][oid] = true
17
+ end
18
+ super
19
+ end
20
+ end
21
+
22
+ def initialize(connection_or_coder_maps, registry: nil)
23
+ @coder_maps = build_coder_maps(connection_or_coder_maps, :registry => registry)
24
+ @coder_maps.each_format(:decoder).flat_map { |f| f.coders }.each do |coder|
25
+ add_coder(coder)
26
+ end
27
+ typenames = @coder_maps.typenames_by_oid
28
+ self.default_type_map = WarningTypeMap.new(typenames)
29
+ end
30
+ end