pg 1.6.1-aarch64-linux-musl

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 (126) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +3 -0
  3. data/BSDL +22 -0
  4. data/CHANGELOG.md +986 -0
  5. data/Contributors.rdoc +46 -0
  6. data/Gemfile +23 -0
  7. data/LICENSE +56 -0
  8. data/POSTGRES +23 -0
  9. data/README-OS_X.rdoc +68 -0
  10. data/README-Windows.rdoc +56 -0
  11. data/README.ja.md +300 -0
  12. data/README.md +327 -0
  13. data/Rakefile +196 -0
  14. data/certs/ged.pem +24 -0
  15. data/certs/kanis@comcard.de.pem +20 -0
  16. data/certs/larskanis-2022.pem +26 -0
  17. data/certs/larskanis-2023.pem +24 -0
  18. data/certs/larskanis-2024.pem +24 -0
  19. data/ext/errorcodes.def +1043 -0
  20. data/ext/errorcodes.rb +45 -0
  21. data/ext/errorcodes.txt +494 -0
  22. data/ext/extconf.rb +320 -0
  23. data/ext/gvl_wrappers.c +32 -0
  24. data/ext/gvl_wrappers.h +297 -0
  25. data/ext/pg.c +703 -0
  26. data/ext/pg.h +391 -0
  27. data/ext/pg_binary_decoder.c +460 -0
  28. data/ext/pg_binary_encoder.c +590 -0
  29. data/ext/pg_cancel_connection.c +360 -0
  30. data/ext/pg_coder.c +673 -0
  31. data/ext/pg_connection.c +4890 -0
  32. data/ext/pg_copy_coder.c +921 -0
  33. data/ext/pg_errors.c +95 -0
  34. data/ext/pg_record_coder.c +522 -0
  35. data/ext/pg_result.c +1764 -0
  36. data/ext/pg_text_decoder.c +1008 -0
  37. data/ext/pg_text_encoder.c +846 -0
  38. data/ext/pg_tuple.c +572 -0
  39. data/ext/pg_type_map.c +200 -0
  40. data/ext/pg_type_map_all_strings.c +130 -0
  41. data/ext/pg_type_map_by_class.c +271 -0
  42. data/ext/pg_type_map_by_column.c +356 -0
  43. data/ext/pg_type_map_by_mri_type.c +313 -0
  44. data/ext/pg_type_map_by_oid.c +390 -0
  45. data/ext/pg_type_map_in_ruby.c +333 -0
  46. data/ext/pg_util.c +149 -0
  47. data/ext/pg_util.h +65 -0
  48. data/ext/vc/pg.sln +26 -0
  49. data/ext/vc/pg_18/pg.vcproj +216 -0
  50. data/ext/vc/pg_19/pg_19.vcproj +209 -0
  51. data/lib/2.7/pg_ext.so +0 -0
  52. data/lib/3.0/pg_ext.so +0 -0
  53. data/lib/3.1/pg_ext.so +0 -0
  54. data/lib/3.2/pg_ext.so +0 -0
  55. data/lib/3.3/pg_ext.so +0 -0
  56. data/lib/3.4/pg_ext.so +0 -0
  57. data/lib/pg/basic_type_map_based_on_result.rb +67 -0
  58. data/lib/pg/basic_type_map_for_queries.rb +206 -0
  59. data/lib/pg/basic_type_map_for_results.rb +104 -0
  60. data/lib/pg/basic_type_registry.rb +311 -0
  61. data/lib/pg/binary_decoder/date.rb +9 -0
  62. data/lib/pg/binary_decoder/timestamp.rb +26 -0
  63. data/lib/pg/binary_encoder/timestamp.rb +20 -0
  64. data/lib/pg/cancel_connection.rb +53 -0
  65. data/lib/pg/coder.rb +108 -0
  66. data/lib/pg/connection.rb +1094 -0
  67. data/lib/pg/exceptions.rb +31 -0
  68. data/lib/pg/result.rb +43 -0
  69. data/lib/pg/text_decoder/date.rb +21 -0
  70. data/lib/pg/text_decoder/inet.rb +9 -0
  71. data/lib/pg/text_decoder/json.rb +17 -0
  72. data/lib/pg/text_decoder/numeric.rb +9 -0
  73. data/lib/pg/text_decoder/timestamp.rb +30 -0
  74. data/lib/pg/text_encoder/date.rb +13 -0
  75. data/lib/pg/text_encoder/inet.rb +31 -0
  76. data/lib/pg/text_encoder/json.rb +17 -0
  77. data/lib/pg/text_encoder/numeric.rb +9 -0
  78. data/lib/pg/text_encoder/timestamp.rb +24 -0
  79. data/lib/pg/tuple.rb +30 -0
  80. data/lib/pg/type_map_by_column.rb +16 -0
  81. data/lib/pg/version.rb +4 -0
  82. data/lib/pg.rb +144 -0
  83. data/misc/openssl-pg-segfault.rb +31 -0
  84. data/misc/postgres/History.txt +9 -0
  85. data/misc/postgres/Manifest.txt +5 -0
  86. data/misc/postgres/README.txt +21 -0
  87. data/misc/postgres/Rakefile +21 -0
  88. data/misc/postgres/lib/postgres.rb +16 -0
  89. data/misc/ruby-pg/History.txt +9 -0
  90. data/misc/ruby-pg/Manifest.txt +5 -0
  91. data/misc/ruby-pg/README.txt +21 -0
  92. data/misc/ruby-pg/Rakefile +21 -0
  93. data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
  94. data/misc/yugabyte/Dockerfile +9 -0
  95. data/misc/yugabyte/docker-compose.yml +28 -0
  96. data/misc/yugabyte/pg-test.rb +45 -0
  97. data/pg.gemspec +38 -0
  98. data/ports/aarch64-linux-musl/lib/libpq-ruby-pg.so.1 +0 -0
  99. data/ports/patches/krb5/1.21.3/0001-Allow-static-linking-krb5-library.patch +30 -0
  100. data/ports/patches/openssl/3.5.1/0001-aarch64-mingw.patch +21 -0
  101. data/ports/patches/postgresql/17.5/0001-Use-workaround-of-__builtin_setjmp-only-on-MINGW-on-.patch +42 -0
  102. data/ports/patches/postgresql/17.5/0001-libpq-Process-buffered-SSL-read-bytes-to-support-rec.patch +52 -0
  103. data/rakelib/pg_gem_helper.rb +64 -0
  104. data/rakelib/task_extension.rb +46 -0
  105. data/sample/array_insert.rb +20 -0
  106. data/sample/async_api.rb +102 -0
  107. data/sample/async_copyto.rb +39 -0
  108. data/sample/async_mixed.rb +56 -0
  109. data/sample/check_conn.rb +21 -0
  110. data/sample/copydata.rb +71 -0
  111. data/sample/copyfrom.rb +81 -0
  112. data/sample/copyto.rb +19 -0
  113. data/sample/cursor.rb +21 -0
  114. data/sample/disk_usage_report.rb +177 -0
  115. data/sample/issue-119.rb +94 -0
  116. data/sample/losample.rb +69 -0
  117. data/sample/minimal-testcase.rb +17 -0
  118. data/sample/notify_wait.rb +72 -0
  119. data/sample/pg_statistics.rb +285 -0
  120. data/sample/replication_monitor.rb +222 -0
  121. data/sample/test_binary_values.rb +33 -0
  122. data/sample/wal_shipper.rb +434 -0
  123. data/sample/warehouse_partitions.rb +311 -0
  124. data.tar.gz.sig +0 -0
  125. metadata +257 -0
  126. metadata.gz.sig +0 -0
data/README.md ADDED
@@ -0,0 +1,327 @@
1
+ # pg
2
+
3
+ * home :: https://github.com/ged/ruby-pg
4
+ * docs :: http://deveiate.org/code/pg (English) ,
5
+ https://deveiate.org/code/pg/README_ja_md.html (Japanese)
6
+ * clog :: link:/CHANGELOG.md
7
+
8
+ [![Join the chat at https://gitter.im/ged/ruby-pg](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ged/ruby-pg?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
9
+
10
+
11
+ ## Description
12
+
13
+ Pg is the Ruby interface to the [PostgreSQL RDBMS](http://www.postgresql.org/).
14
+ It works with [PostgreSQL 10 and later](http://www.postgresql.org/support/versioning/).
15
+
16
+ A small example usage:
17
+ ```ruby
18
+ #!/usr/bin/env ruby
19
+
20
+ require 'pg'
21
+
22
+ # Output a table of current connections to the DB
23
+ conn = PG.connect( dbname: 'sales' )
24
+ conn.exec( "SELECT * FROM pg_stat_activity" ) do |result|
25
+ puts " PID | User | Query"
26
+ result.each do |row|
27
+ puts " %7d | %-16s | %s " %
28
+ row.values_at('pid', 'usename', 'query')
29
+ end
30
+ end
31
+ ```
32
+
33
+ ## Build Status
34
+
35
+ [![Build Status Github Actions](https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml/badge.svg?branch=master)](https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml)
36
+ [![Binary gems](https://github.com/ged/ruby-pg/actions/workflows/binary-gems.yml/badge.svg?branch=master)](https://github.com/ged/ruby-pg/actions/workflows/binary-gems.yml)
37
+ [![Build Status Appveyor](https://ci.appveyor.com/api/projects/status/gjx5axouf3b1wicp?svg=true)](https://ci.appveyor.com/project/ged/ruby-pg-9j8l3)
38
+
39
+
40
+ ## Requirements
41
+
42
+ * Ruby 2.7 or newer
43
+ * PostgreSQL 10.x or later
44
+ * When installing the source gem: libpq with headers, -dev packages, etc.
45
+
46
+
47
+ ## How To Install
48
+
49
+ Install via RubyGems:
50
+
51
+ gem install pg
52
+
53
+ This installs the binary gem, specific to the running platform by default.
54
+
55
+ ### Binary gem
56
+
57
+ The binary gems don't depend on the libpq package on the running system.
58
+ They have libpq builtin.
59
+
60
+ The gems for platform `x86_64-linux` and `aarch64-linux` run on Alpine Linux, but require the package `gcompat` there as long as we don't provide a native gem for platform `x86_64-linux-musl`. Install this package like so:
61
+
62
+ apk add gcompat
63
+
64
+ There is one use case the binary gems don't support: Retrieval of connection [options from LDAP](https://www.postgresql.org/docs/current/libpq-ldap.html). To support this `libldap` would be necessary, but it has a lot of dependencies. It doesn't seem to be a widely used feature and that it's worth to support it. If it's necessary, the source gem can be forced.
65
+
66
+ ### Source gem
67
+
68
+ The source gem can be forced by:
69
+
70
+ gem install pg --platform ruby
71
+
72
+ You may need to specify the path to the 'pg_config' program installed with
73
+ Postgres:
74
+
75
+ gem install pg -- --with-pg-config=<path to pg_config>
76
+
77
+ If you're installing via Bundler, you can provide compile hints like so:
78
+
79
+ bundle config build.pg --with-pg-config=<path to pg_config>
80
+
81
+ ### Bundler
82
+
83
+ To make sure, the necessary platforms and the source gem are fetched by bundler, they can be added like so
84
+
85
+ ```
86
+ bundle lock --add-platform x86_64-linux
87
+ bundle lock --add-platform arm64-darwin
88
+ bundle lock --add-platform x64-mingw-ucrt
89
+ bundle lock --add-platform ruby
90
+ bundle package --all-platforms
91
+ ```
92
+
93
+ A re-run of `bundle package` is also necessary after `bundle update`, in order to retrieve the new specific gems of all platforms.
94
+
95
+ If the binary gems don't work for some reason, it's easy to force the usage of the source gem in the Gemfile:
96
+
97
+ ```
98
+ gem "pg", force_ruby_platform: true
99
+ ```
100
+
101
+ ### More
102
+
103
+ See README-OS_X.rdoc for more information about installing under MacOS X, and
104
+ README-Windows.rdoc for Windows build/installation instructions.
105
+
106
+ There's also [a Google+ group](http://goo.gl/TFy1U) and a
107
+ [mailing list](http://groups.google.com/group/ruby-pg) if you get stuck, or just
108
+ want to chat about something.
109
+
110
+ If you want to install as a signed gem, the public certs of the gem signers
111
+ can be found in [the `certs` directory](https://github.com/ged/ruby-pg/tree/master/certs)
112
+ of the repository.
113
+
114
+
115
+ ## Versioning
116
+
117
+ We tag and release gems according to the [Semantic Versioning](http://semver.org/) principle.
118
+
119
+ As a result of this policy, you can (and should) specify a dependency on this gem using the [Pessimistic Version Constraint](http://guides.rubygems.org/patterns/#pessimistic-version-constraint) with two digits of precision.
120
+
121
+ For example:
122
+
123
+ ```ruby
124
+ spec.add_dependency 'pg', '~> 1.0'
125
+ ```
126
+
127
+
128
+ ## Type Casts
129
+
130
+ Pg can optionally type cast result values and query parameters in Ruby or
131
+ native C code. This can speed up data transfers to and from the database,
132
+ because String allocations are reduced and conversions in (slower) Ruby code
133
+ can be omitted.
134
+
135
+ Very basic type casting can be enabled by:
136
+ ```ruby
137
+ conn.type_map_for_results = PG::BasicTypeMapForResults.new conn
138
+ # ... this works for result value mapping:
139
+ conn.exec("select 1, now(), '{2,3}'::int[]").values
140
+ # => [[1, 2014-09-21 20:51:56 +0200, [2, 3]]]
141
+
142
+ conn.type_map_for_queries = PG::BasicTypeMapForQueries.new conn
143
+ # ... and this for param value mapping:
144
+ conn.exec_params("SELECT $1::text, $2::text, $3::text", [1, 1.23, [2,3]]).values
145
+ # => [["1", "1.2300000000000000E+00", "{2,3}"]]
146
+ ```
147
+
148
+ But Pg's type casting is highly customizable. That's why it's divided into
149
+ 2 layers:
150
+
151
+ ### Encoders / Decoders (ext/pg_*coder.c, lib/pg/*coder.rb)
152
+
153
+ This is the lower layer, containing encoding classes that convert Ruby
154
+ objects for transmission to the DBMS and decoding classes to convert
155
+ received data back to Ruby objects. The classes are namespaced according
156
+ to their format and direction in PG::TextEncoder, PG::TextDecoder,
157
+ PG::BinaryEncoder and PG::BinaryDecoder.
158
+
159
+ It is possible to assign a type OID, format code (text or binary) and
160
+ optionally a name to an encoder or decoder object. It's also possible
161
+ to build composite types by assigning an element encoder/decoder.
162
+ PG::Coder objects can be used to set up a PG::TypeMap or alternatively
163
+ to convert single values to/from their string representation.
164
+
165
+ The following PostgreSQL column types are supported by ruby-pg (TE = Text Encoder, TD = Text Decoder, BE = Binary Encoder, BD = Binary Decoder):
166
+
167
+ * Integer: [TE](rdoc-ref:PG::TextEncoder::Integer), [TD](rdoc-ref:PG::TextDecoder::Integer), [BD](rdoc-ref:PG::BinaryDecoder::Integer) 💡 No links? Switch to [here](https://deveiate.org/code/pg/README_md.html#label-Type+Casts) 💡
168
+ * BE: [Int2](rdoc-ref:PG::BinaryEncoder::Int2), [Int4](rdoc-ref:PG::BinaryEncoder::Int4), [Int8](rdoc-ref:PG::BinaryEncoder::Int8)
169
+ * Float: [TE](rdoc-ref:PG::TextEncoder::Float), [TD](rdoc-ref:PG::TextDecoder::Float), [BD](rdoc-ref:PG::BinaryDecoder::Float)
170
+ * BE: [Float4](rdoc-ref:PG::BinaryEncoder::Float4), [Float8](rdoc-ref:PG::BinaryEncoder::Float8)
171
+ * Numeric: [TE](rdoc-ref:PG::TextEncoder::Numeric), [TD](rdoc-ref:PG::TextDecoder::Numeric)
172
+ * Boolean: [TE](rdoc-ref:PG::TextEncoder::Boolean), [TD](rdoc-ref:PG::TextDecoder::Boolean), [BE](rdoc-ref:PG::BinaryEncoder::Boolean), [BD](rdoc-ref:PG::BinaryDecoder::Boolean)
173
+ * String: [TE](rdoc-ref:PG::TextEncoder::String), [TD](rdoc-ref:PG::TextDecoder::String), [BE](rdoc-ref:PG::BinaryEncoder::String), [BD](rdoc-ref:PG::BinaryDecoder::String)
174
+ * Bytea: [TE](rdoc-ref:PG::TextEncoder::Bytea), [TD](rdoc-ref:PG::TextDecoder::Bytea), [BE](rdoc-ref:PG::BinaryEncoder::Bytea), [BD](rdoc-ref:PG::BinaryDecoder::Bytea)
175
+ * Base64: [TE](rdoc-ref:PG::TextEncoder::ToBase64), [TD](rdoc-ref:PG::TextDecoder::FromBase64), [BE](rdoc-ref:PG::BinaryEncoder::FromBase64), [BD](rdoc-ref:PG::BinaryDecoder::ToBase64)
176
+ * Timestamp:
177
+ * TE: [local](rdoc-ref:PG::TextEncoder::TimestampWithoutTimeZone), [UTC](rdoc-ref:PG::TextEncoder::TimestampUtc), [with-TZ](rdoc-ref:PG::TextEncoder::TimestampWithTimeZone)
178
+ * TD: [local](rdoc-ref:PG::TextDecoder::TimestampLocal), [UTC](rdoc-ref:PG::TextDecoder::TimestampUtc), [UTC-to-local](rdoc-ref:PG::TextDecoder::TimestampUtcToLocal)
179
+ * BE: [local](rdoc-ref:PG::BinaryEncoder::TimestampLocal), [UTC](rdoc-ref:PG::BinaryEncoder::TimestampUtc)
180
+ * BD: [local](rdoc-ref:PG::BinaryDecoder::TimestampLocal), [UTC](rdoc-ref:PG::BinaryDecoder::TimestampUtc), [UTC-to-local](rdoc-ref:PG::BinaryDecoder::TimestampUtcToLocal)
181
+ * Date: [TE](rdoc-ref:PG::TextEncoder::Date), [TD](rdoc-ref:PG::TextDecoder::Date), [BE](rdoc-ref:PG::BinaryEncoder::Date), [BD](rdoc-ref:PG::BinaryDecoder::Date)
182
+ * JSON and JSONB: [TE](rdoc-ref:PG::TextEncoder::JSON), [TD](rdoc-ref:PG::TextDecoder::JSON)
183
+ * Inet: [TE](rdoc-ref:PG::TextEncoder::Inet), [TD](rdoc-ref:PG::TextDecoder::Inet)
184
+ * Array: [TE](rdoc-ref:PG::TextEncoder::Array), [TD](rdoc-ref:PG::TextDecoder::Array), [BE](rdoc-ref:PG::BinaryEncoder::Array), [BD](rdoc-ref:PG::BinaryDecoder::Array)
185
+ * Composite Type (also called "Row" or "Record"): [TE](rdoc-ref:PG::TextEncoder::Record), [TD](rdoc-ref:PG::TextDecoder::Record)
186
+
187
+ The following text and binary formats can also be encoded although they are not used as column type:
188
+
189
+ * COPY input and output data: [TE](rdoc-ref:PG::TextEncoder::CopyRow), [TD](rdoc-ref:PG::TextDecoder::CopyRow), [BE](rdoc-ref:PG::BinaryEncoder::CopyRow), [BD](rdoc-ref:PG::BinaryDecoder::CopyRow)
190
+ * Literal for insertion into SQL string: [TE](rdoc-ref:PG::TextEncoder::QuotedLiteral)
191
+ * SQL-Identifier: [TE](rdoc-ref:PG::TextEncoder::Identifier), [TD](rdoc-ref:PG::TextDecoder::Identifier)
192
+
193
+ ### PG::TypeMap and derivations (ext/pg_type_map*.c, lib/pg/type_map*.rb)
194
+
195
+ A TypeMap defines which value will be converted by which encoder/decoder.
196
+ There are different type map strategies, implemented by several derivations
197
+ of this class. They can be chosen and configured according to the particular
198
+ needs for type casting. The default type map is PG::TypeMapAllStrings.
199
+
200
+ A type map can be assigned per connection or per query respectively per
201
+ result set. Type maps can also be used for COPY in and out data streaming.
202
+ See PG::Connection#copy_data .
203
+
204
+ The following base type maps are available:
205
+
206
+ * PG::TypeMapAllStrings - encodes and decodes all values to and from strings (default)
207
+ * PG::TypeMapByClass - selects encoder based on the class of the value to be sent
208
+ * PG::TypeMapByColumn - selects encoder and decoder by column order
209
+ * PG::TypeMapByOid - selects decoder by PostgreSQL type OID
210
+ * PG::TypeMapInRuby - define a custom type map in ruby
211
+
212
+ The following type maps are prefilled with type mappings from the PG::BasicTypeRegistry :
213
+
214
+ * PG::BasicTypeMapForResults - a PG::TypeMapByOid prefilled with decoders for common PostgreSQL column types
215
+ * PG::BasicTypeMapBasedOnResult - a PG::TypeMapByOid prefilled with encoders for common PostgreSQL column types
216
+ * PG::BasicTypeMapForQueries - a PG::TypeMapByClass prefilled with encoders for common Ruby value classes
217
+
218
+ Several type maps can be chained by setting PG::TypeMap::DefaultTypeMappable#default_type_map .
219
+
220
+ ## Thread support
221
+
222
+ PG is thread safe in such a way that different threads can use different PG::Connection objects concurrently.
223
+ However it is not safe to access any Pg objects simultaneously from more than one thread.
224
+ So make sure to open a new database server connection for every new thread or use a wrapper library like ActiveRecord that manages connections in a thread safe way.
225
+
226
+ If messages like the following are printed to stderr, you're probably using one connection from several threads:
227
+
228
+ message type 0x31 arrived from server while idle
229
+ message type 0x32 arrived from server while idle
230
+ message type 0x54 arrived from server while idle
231
+ message type 0x43 arrived from server while idle
232
+ message type 0x5a arrived from server while idle
233
+
234
+
235
+ ## Fiber IO scheduler support
236
+
237
+ Pg is fully compatible with `Fiber.scheduler` introduced in Ruby-3.0 since pg-1.3.0.
238
+ On Windows support for `Fiber.scheduler` is available on Ruby-3.1 or newer.
239
+ All possibly blocking IO operations are routed through the `Fiber.scheduler` if one is registered for the running thread.
240
+ That is why pg internally uses the asynchronous libpq interface even for synchronous/blocking method calls.
241
+ It also uses Ruby's DNS resolution instead of libpq's builtin functions.
242
+
243
+ Internally Pg always uses the nonblocking connection mode of libpq.
244
+ It then behaves like running in blocking mode but ensures, that all blocking IO is handled in Ruby through a possibly registered `Fiber.scheduler`.
245
+ When `PG::Connection.setnonblocking(true)` is called then the nonblocking state stays enabled, but the additional handling of blocking states is disabled, so that the calling program has to handle blocking states on its own.
246
+
247
+ An exception to this rule are the methods for large objects like `PG::Connection#lo_create` and authentication methods using external libraries (like GSSAPI authentication).
248
+ They are not compatible with `Fiber.scheduler`, so that blocking states are not passed to the registered IO scheduler.
249
+ That means the operation will work properly, but IO waiting states can not be used to switch to another Fiber doing IO.
250
+
251
+
252
+ ## Ractor support
253
+
254
+ Pg is fully compatible with Ractor introduced in Ruby-3.0 since pg-1.5.0.
255
+ All type en/decoders and type maps are shareable between ractors if they are made frozen by `Ractor.make_shareable`.
256
+ Also frozen PG::Result and PG::Tuple objects can be shared.
257
+ All frozen objects (except PG::Connection) can still be used to do communication with the PostgreSQL server or to read retrieved data.
258
+
259
+ PG::Connection is not shareable and must be created within each Ractor to establish a dedicated connection.
260
+
261
+
262
+ ## Contributing
263
+
264
+ To report bugs, suggest features, or check out the source with Git,
265
+ [check out the project page](https://github.com/ged/ruby-pg).
266
+
267
+ After checking out the source, install all dependencies:
268
+
269
+ $ bundle install
270
+
271
+ Cleanup extension files, packaging files, test databases.
272
+ Run this to change between PostgreSQL versions:
273
+
274
+ $ rake clean
275
+
276
+ Compile extension:
277
+
278
+ $ rake compile
279
+
280
+ Run tests/specs on the PostgreSQL version that `pg_config --bindir` points to:
281
+
282
+ $ rake test
283
+
284
+ Or run a specific test per file and line number on a specific PostgreSQL version:
285
+
286
+ $ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
287
+
288
+ Generate the API documentation:
289
+
290
+ $ rake docs
291
+
292
+ Make sure, that all bugs and new features are verified by tests.
293
+
294
+ The current maintainers are Michael Granger <ged@FaerieMUD.org> and
295
+ Lars Kanis <lars@greiz-reinsdorf.de>.
296
+
297
+
298
+ ## Copying
299
+
300
+ Copyright (c) 1997-2022 by the authors.
301
+
302
+ * Jeff Davis <ruby-pg@j-davis.com>
303
+ * Guy Decoux (ts) <decoux@moulon.inra.fr>
304
+ * Michael Granger <ged@FaerieMUD.org>
305
+ * Lars Kanis <lars@greiz-reinsdorf.de>
306
+ * Dave Lee
307
+ * Eiji Matsumoto <usagi@ruby.club.or.jp>
308
+ * Yukihiro Matsumoto <matz@ruby-lang.org>
309
+ * Noboru Saitou <noborus@netlab.jp>
310
+
311
+ You may redistribute this software under the same terms as Ruby itself; see
312
+ https://www.ruby-lang.org/en/about/license.txt or the BSDL file in the source
313
+ for details.
314
+
315
+ Portions of the code are from the PostgreSQL project, and are distributed
316
+ under the terms of the PostgreSQL license, included in the file POSTGRES.
317
+
318
+ Portions copyright LAIKA, Inc.
319
+
320
+
321
+ ## Acknowledgments
322
+
323
+ See Contributors.rdoc for the many additional fine people that have contributed
324
+ to this library over the years.
325
+
326
+ We are thankful to the people at the ruby-list and ruby-dev mailing lists.
327
+ And to the people who developed PostgreSQL.
data/Rakefile ADDED
@@ -0,0 +1,196 @@
1
+ # -*- rake -*-
2
+
3
+ # Enable english error messages, as some specs depend on them
4
+ ENV["LANG"] = "C"
5
+
6
+ require 'rbconfig'
7
+ require 'pathname'
8
+ require 'tmpdir'
9
+ require 'rake/extensiontask'
10
+ require 'rake/clean'
11
+ require 'rspec/core/rake_task'
12
+ require 'bundler'
13
+ require 'bundler/gem_helper'
14
+ require_relative "rakelib/pg_gem_helper"
15
+
16
+ # Build directory constants
17
+ BASEDIR = Pathname( __FILE__ ).dirname
18
+ SPECDIR = BASEDIR + 'spec'
19
+ LIBDIR = BASEDIR + 'lib'
20
+ EXTDIR = BASEDIR + 'ext'
21
+ PKGDIR = BASEDIR + 'pkg'
22
+ TMPDIR = BASEDIR + 'tmp'
23
+ TESTDIR = BASEDIR + "tmp_test_*"
24
+
25
+ DLEXT = RbConfig::CONFIG['DLEXT']
26
+ EXT = LIBDIR + "pg_ext.#{DLEXT}"
27
+
28
+ GEMSPEC = 'pg.gemspec'
29
+
30
+ CLEAN.include( TESTDIR.to_s )
31
+ CLEAN.include( PKGDIR.to_s, TMPDIR.to_s )
32
+ CLEAN.include "lib/*/libpq.dll"
33
+ CLEAN.include "lib/pg_ext.*"
34
+ CLEAN.include "lib/pg/postgresql_lib_path.rb"
35
+ CLEAN.include "ports/*.installed"
36
+ CLEAN.include "ports/*mingw*", "ports/*linux*", "ports/*darwin*"
37
+
38
+ PgGemHelper.install_tasks
39
+ $gem_spec = Bundler.load_gemspec(GEMSPEC)
40
+
41
+ desc "Turn on warnings and debugging in the build."
42
+ task :maint do
43
+ ENV['MAINTAINER_MODE'] = 'yes'
44
+ end
45
+
46
+ CrossLibrary = Struct.new :platform, :openssl_config, :toolchain
47
+ CrossLibraries = [
48
+ ['aarch64-mingw-ucrt', 'mingwarm64', 'aarch64-w64-mingw32'],
49
+ ['x64-mingw-ucrt', 'mingw64', 'x86_64-w64-mingw32'],
50
+ ['x86-mingw32', 'mingw', 'i686-w64-mingw32'],
51
+ ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
52
+ ['x86_64-linux', 'linux-x86_64', 'x86_64-linux-gnu'],
53
+ ['x86_64-linux-musl', 'linux-x86_64', 'x86_64-unknown-linux-musl'],
54
+ ['aarch64-linux', 'linux-aarch64', 'aarch64-linux-gnu'],
55
+ ['aarch64-linux-musl', 'linux-aarch64', 'aarch64-linux-musl'],
56
+ ['x86_64-darwin', 'darwin64-x86_64', 'x86_64-apple-darwin'],
57
+ ['arm64-darwin', 'darwin64-arm64', 'arm64-apple-darwin'],
58
+ ].map do |platform, openssl_config, toolchain|
59
+ CrossLibrary.new platform, openssl_config, toolchain
60
+ end
61
+
62
+ # Register binary gems to be pushed to rubygems.org
63
+ Bundler::GemHelper.instance.cross_platforms = CrossLibraries.map(&:platform)
64
+
65
+ # Rake-compiler task
66
+ Rake::ExtensionTask.new do |ext|
67
+ ext.name = 'pg_ext'
68
+ ext.gem_spec = $gem_spec
69
+ ext.ext_dir = 'ext'
70
+ ext.lib_dir = 'lib'
71
+ ext.source_pattern = "*.{c,h}"
72
+ ext.cross_compile = true
73
+
74
+ # Activate current cross compiled platform only.
75
+ # This is to work around the issue that `linux` platform is selected in `linux-musl` image.
76
+ ext.cross_platform = CrossLibraries.map(&:platform).select do |pl|
77
+ m = ENV["RCD_IMAGE"]&.match(/:(?<ruby_ver>[\d\.]+)-mri-(?<platform>[-\w]+)$/)
78
+ m && m[:platform] == pl
79
+ end
80
+
81
+ ext.cross_config_options += CrossLibraries.map do |xlib|
82
+ {
83
+ xlib.platform => [
84
+ "--with-cross-build=#{xlib.platform}",
85
+ "--with-openssl-platform=#{xlib.openssl_config}",
86
+ "--with-toolchain=#{xlib.toolchain}",
87
+ ]
88
+ }
89
+ end
90
+
91
+ # Add libpq.dll/.so to fat binary gemspecs
92
+ ext.cross_compiling do |spec|
93
+ spec.files << "ports/#{spec.platform.to_s}/lib/libpq-ruby-pg.so.1" if spec.platform.to_s =~ /linux/
94
+ spec.files << "ports/#{spec.platform.to_s}/lib/libpq-ruby-pg.1.dylib" if spec.platform.to_s =~ /darwin/
95
+ spec.files << "ports/#{spec.platform.to_s}/lib/libpq.dll" if spec.platform.to_s =~ /mingw|mswin/
96
+
97
+ # Binary gems don't postgresql header+lib files
98
+ spec.metadata.delete("msys2_mingw_dependencies")
99
+ end
100
+ end
101
+
102
+ task 'gem:native:prepare' do
103
+ require 'io/console'
104
+ require 'rake_compiler_dock'
105
+
106
+ # Copy gem signing key and certs to be accessible from the docker container
107
+ mkdir_p 'build/gem'
108
+ sh "cp ~/.gem/gem-*.pem build/gem/ || true"
109
+ sh "bundle package"
110
+ begin
111
+ OpenSSL::PKey.read(File.read(File.expand_path("~/.gem/gem-private_key.pem")), ENV["GEM_PRIVATE_KEY_PASSPHRASE"] || "")
112
+ rescue OpenSSL::PKey::PKeyError
113
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
114
+ retry
115
+ end
116
+ end
117
+
118
+ task 'install_darwin_mig', [:arch] do |t, args|
119
+ sh <<~EOT
120
+ rm -rf bootstrap_cmds &&
121
+ git clone --branch=cross_platform https://github.com/markmentovai/bootstrap_cmds &&
122
+ cd bootstrap_cmds &&
123
+ autoreconf --install &&
124
+ sh configure &&
125
+ make &&
126
+ sed -E -i 's/^cppflags=(.*)/cppflags=(\\1 "-D#{args[:arch]}" "-I\\/opt\\/osxcross\\/target\\/SDK\\/MacOSX11.1.sdk\\/usr\\/include")/' migcom.tproj/mig.sh &&
127
+ sudo make install
128
+ EOT
129
+ end
130
+
131
+ CrossLibraries.each do |xlib|
132
+ platform = xlib.platform
133
+ desc "Build fat binary gem for platform #{platform}"
134
+ task "gem:native:#{platform}" => ['gem:native:prepare'] do
135
+ RakeCompilerDock.sh <<-EOT, platform: platform
136
+ #{ "sudo apt-get update && sudo apt-get install -y bison flex &&" if platform =~ /darwin/ }
137
+ #{ # remove nm on Linux to suppress PostgreSQL's check for exit which raises thread_exit as a false positive:
138
+ "sudo mv `which nm` `which nm`.bak &&" if platform =~ /linux/ }
139
+ sudo apt-get update && sudo apt-get install -y bison flex &&
140
+ (cp build/gem/gem-*.pem ~/.gem/ || true) &&
141
+ bundle install --local &&
142
+ #{ "rake install_darwin_mig[__arm64__]" if platform =~ /arm64-darwin/ }
143
+ #{ "rake install_darwin_mig[__x86_64__]" if platform =~ /x86_64-darwin/ }
144
+ rake native:#{platform} pkg/#{$gem_spec.full_name}-#{platform}.gem MAKEOPTS=-j`nproc` RUBY_CC_VERSION=#{RakeCompilerDock.ruby_cc_version("~>2.7", "~>3.0")}
145
+ EOT
146
+ end
147
+ desc "Build the native binary gems"
148
+ multitask 'gem:native' => "gem:native:#{platform}"
149
+ end
150
+
151
+ RSpec::Core::RakeTask.new(:spec).rspec_opts = "--profile -cfdoc"
152
+ task :test => :spec
153
+
154
+ # Use the fivefish formatter for docs generated from development checkout
155
+ require 'rdoc/task'
156
+
157
+ RDoc::Task.new( 'docs' ) do |rdoc|
158
+ rdoc.options = $gem_spec.rdoc_options
159
+ rdoc.rdoc_files = $gem_spec.extra_rdoc_files
160
+ rdoc.generator = :fivefish
161
+ rdoc.rdoc_dir = 'doc'
162
+ end
163
+
164
+ desc "Build the source gem #{$gem_spec.full_name}.gem into the pkg directory"
165
+ task :gem => :build
166
+
167
+ task :clobber do
168
+ puts "Stop any Postmaster instances that remain after testing."
169
+ require_relative 'spec/helpers'
170
+ PG::TestingHelpers.stop_existing_postmasters()
171
+ end
172
+
173
+ desc "Update list of server error codes"
174
+ task :update_error_codes do
175
+ URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_17_0"
176
+
177
+ ERRORCODES_TXT = "ext/errorcodes.txt"
178
+ sh "wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}"
179
+
180
+ ruby 'ext/errorcodes.rb', 'ext/errorcodes.txt', 'ext/errorcodes.def'
181
+ end
182
+
183
+ file 'ext/pg_errors.c' => ['ext/errorcodes.def'] do
184
+ # trigger compilation of changed errorcodes.def
185
+ touch 'ext/pg_errors.c'
186
+ end
187
+
188
+ desc "Translate readme"
189
+ task :translate do
190
+ cd "translation" do
191
+ # po4a's lexer might change, so record its version for reference
192
+ sh "LANG=C po4a --version > .po4a-version"
193
+
194
+ sh "po4a po4a.cfg"
195
+ end
196
+ end
data/certs/ged.pem ADDED
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID+DCCAmCgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
3
+ REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMjAxMDcyMzU4MTRaFw0yMzAxMDcyMzU4
4
+ MTRaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
5
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
6
+ L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
7
+ M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
8
+ 5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
9
+ Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
10
+ vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
11
+ dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
12
+ ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
13
+ N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
14
+ VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
15
+ 9w0BAQsFAAOCAYEASrm1AbEoxACZ9WXJH3R5axV3U0CA4xaETlL2YT+2nOfVBMQ9
16
+ 0ZlkPx6j4ghKJgAIi1TMfDM2JyPJsppQh8tiNccDjWc62UZRY/dq26cMqf/lcI+a
17
+ 6YBuEYvzZfearwVs8tHnXtwYV3WSCoCOQaB+nq2lA1O+nkKNl41WOsVbNama5jx3
18
+ 8cQtVSEEmZy6jIDJ8c5TmBJ7BQUDEUEWA/A3V42Xyctoj7DvUXWE0lP+X6ypAVSr
19
+ lFh3TS64D7NTvxkmg7natUoCvobl6kGl4yMaqE4YRTlfuzhpf91TSOntClqrAOsS
20
+ K1s56WndQj3IoBocdY9mQhDZLtLHofSkymoP8btBlj5SsN24TiF0VMSZlctSCYZg
21
+ GKyHim/MMlIfGOWsgfioq5jzwmql7W4CDubbb8Lkg70v+hN2E/MnNVAcNE3gyaGc
22
+ P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
23
+ btEP+7EplFuoiMfd
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLjCCAhagAwIBAgIBCzANBgkqhkiG9w0BAQsFADA9MQ4wDAYDVQQDDAVrYW5p
3
+ czEXMBUGCgmSJomT8ixkARkWB2NvbWNhcmQxEjAQBgoJkiaJk/IsZAEZFgJkZTAe
4
+ Fw0yMzA0MjgwOTI0NDhaFw0yNDA0MjcwOTI0NDhaMD0xDjAMBgNVBAMMBWthbmlz
5
+ MRcwFQYKCZImiZPyLGQBGRYHY29tY2FyZDESMBAGCgmSJomT8ixkARkWAmRlMIIB
6
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApop+rNmg35bzRugZ21VMGqI6
7
+ HGzPLO4VHYncWn/xmgPU/ZMcZdfj6MzIaZJ/czXyt4eHpBk1r8QOV3gBXnRXEjVW
8
+ 9xi+EdVOkTV2/AVFKThcbTAQGiF/bT1n2M+B1GTybRzMg6hyhOJeGPqIhLfJEpxn
9
+ lJi4+ENAVT4MpqHEAGB8yFoPC0GqiOHQsdHxQV3P3c2OZqG+yJey74QtwA2tLcLn
10
+ Q53c63+VLGsOjODl1yPn/2ejyq8qWu6ahfTxiIlSar2UbwtaQGBDFdb2CXgEufXT
11
+ L7oaPxlmj+Q2oLOfOnInd2Oxop59HoJCQPsg8f921J43NCQGA8VHK6paxIRDLQID
12
+ AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUvgTdT7fe
13
+ x17ugO3IOsjEJwW7KP4wDQYJKoZIhvcNAQELBQADggEBACAxNXwfMGG7paZjnG/c
14
+ smdi/ocW2GmCNtILaSzDZqlD5LoA68MiO7u5vwWyBaDJ6giUB330VJoGRbWMxvxN
15
+ JU6Bnwa4yYp9YtF91wYIi7FXwIrCPKd9bk3bf4M5wECdsv+zvVceq2zRXqD7fci8
16
+ 1LRG8ort/f4TgaT7B4aNwOaabA2UT6u0FGeglqxLkhir86MY3QQyBfJZUoTKWGkz
17
+ S9a7GXsYpe+8HMOaE4+SZp8SORKPgATND5m/4VdzuO59VXjE5UP7QpXigbxAt7H7
18
+ ciK5Du2ZDhowmWzZwNzR7VvVmfAK6RQJlRB03VkkQRWGld5yApOrYDne6WbD8kE0
19
+ uM8=
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
3
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMjAyMTQxMzMwNTZaFw0yMzAy
4
+ MTQxMzMwNTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
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
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjgYEwfzAJ
14
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOIdbSMr3VFrTCO9/cTM0
15
+ 0exHzBcwIgYDVR0RBBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwIgYDVR0S
16
+ BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
17
+ AFWP7F/y3Oq3NgrqUOnjKOeDaBa7AqNhHS+PZg+C90lnJzMgOs4KKgZYxqSQVSab
18
+ SCEmzIO/StkXY4NpJ4fYLrHemf/fJy1wPyu+fNdp5SEEUwEo+2toRFlzTe4u4LdS
19
+ QC636nPPTMt8H3xz2wf/lUIUeo2Qc95Qt2BQM465ibbG9kmA3c7Sopx6yOabYOAl
20
+ KPRbOSEPiWYcF9Suuz8Gdf8jxEtPlnZiwRvnYJ+IHMq3XQCJWPpMzdDMbtlgHbXE
21
+ vq1zOTLMSYAS0UB3uionR4yo1hLz60odwkCm7qf0o2Ci/5OjtB0a89VuyqRU2vUJ
22
+ QH95WBjDJ6lCCW7J0mrMPnJQSUFTmufsU6jOChvPaCeAzW1YwrsP/YKnvwueG7ip
23
+ VOdW6RitjtFxhS7evRL0201+KUvLz12zZWWjOcujlQs64QprxOtiv/MiisKb1Ng+
24
+ oL1mUdzB8KrZL4/WbG5YNX6UTtJbIOu9qEFbBAy4/jtIkJX+dlNoFwd4GXQW1YNO
25
+ nA==
26
+ -----END CERTIFICATE-----
@@ -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-----
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEBDCCAmygAwIBAgIBAzANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
3
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yNDAyMjgxOTMxNDdaFw0yNTAy
4
+ MjcxOTMxNDdaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
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
+ 7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEArBmHSfnUyNWf3R1Fx0mMHloWGdcKn2D2
16
+ BsqTApXU2nADiyppIqRq4b9e7hw342uzadSLkoQcEFOxThLRhAcijoWfQVBcsbV/
17
+ ZsCY1qlUTIJuSWxaSyS4efUX+N4eMNyPM9oW/sphlWFo0DgI34Y9WB6HDzH+O71y
18
+ R7PARke3f4kYnRJf5yRQLPDrH9UYt9KlBQm6l7XMtr5EMnQt0EfcmZEi9H4t/vS2
19
+ haxvpFMdAKo4H46GBYNO96r6b74t++vgQSBTg/AFVwvRZwNSrPPcBfb4xxeEAhRR
20
+ x+LU7feIH7lZ//3buiyD03gLAEtHXai0Y+/VfuWIpwYJAl2BO/tU7FS/dtbJq9oc
21
+ dI36Yyzy+BrCM0WT4oCsagePNb97FaNhl4F6sM5JEPT0ZPxRx0i3G4TNNIYziVos
22
+ 5wFER6XhvvLDFAMh/jMg+s7Wd5SbSHgHNSUaUGVtdWkVPOer6oF0aLdZUR3CETkn
23
+ 5nWXZma/BUd3YgYA/Xumc6QQqIS4p7mr
24
+ -----END CERTIFICATE-----