cipherstash-pg 1.0.0.beta.1-aarch64-linux → 1.0.0.beta.4-aarch64-linux

Sign up to get free protection for your applications and to get access to all the features.
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.so +0 -0
  24. data/lib/3.0/pg_ext.so +0 -0
  25. data/lib/3.1/pg_ext.so +0 -0
  26. data/lib/3.2/pg_ext.so +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.so.5 +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
@@ -0,0 +1,9 @@
1
+ [po_directory] po
2
+
3
+ [options] --master-charset UTF-8 \
4
+ --localized-charset UTF-8 \
5
+ --master-language en \
6
+ --option markdown \
7
+ --keep 0
8
+
9
+ [type:text] ../README.md ja:../README.ja.md
metadata CHANGED
@@ -1,60 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cipherstash-pg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.1
4
+ version: 1.0.0.beta.4
5
5
  platform: aarch64-linux
6
6
  authors:
7
- - CipherStash
7
+ - CipherStash Engineers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-06 00:00:00.000000000 Z
11
+ date: 2023-05-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: CipherStash PG is a drop in replacement of PG that provides transparent
14
- data encryption, with a PG-compatible API
13
+ description: CipherStashPG is the Ruby interface to CipherStash-enhanced PostgresQL,
14
+ based on PG. Known to work on Postgres 14+ (might work on older version)
15
15
  email:
16
16
  - engineers@cipherstash.com
17
17
  executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
+ - "./.appveyor.yml"
22
+ - "./.gems"
23
+ - "./.gemtest"
24
+ - "./.github/workflows/binary-gems.yml"
25
+ - "./.github/workflows/source-gem.yml"
26
+ - "./.gitignore"
27
+ - "./.hgsigs"
28
+ - "./.hgtags"
29
+ - "./.irbrc"
30
+ - "./.pryrc"
31
+ - "./.tm_properties"
32
+ - "./.travis.yml"
21
33
  - "./BSDL"
22
34
  - "./Contributors.rdoc"
23
35
  - "./Gemfile"
24
- - "./History.rdoc"
36
+ - "./Gemfile.lock"
37
+ - "./History.md"
25
38
  - "./LICENSE"
26
39
  - "./Manifest.txt"
27
40
  - "./POSTGRES"
28
41
  - "./README-OS_X.rdoc"
29
42
  - "./README-Windows.rdoc"
30
- - "./README.ja.rdoc"
31
- - "./README.rdoc"
43
+ - "./README.ja.md"
44
+ - "./README.md"
32
45
  - "./Rakefile"
46
+ - "./Rakefile.cross"
33
47
  - "./certs/ged.pem"
34
48
  - "./certs/larskanis-2022.pem"
49
+ - "./certs/larskanis-2023.pem"
35
50
  - "./cipherstash-pg.gemspec"
36
51
  - "./lib/2.7/pg_ext.so"
37
52
  - "./lib/3.0/pg_ext.so"
38
53
  - "./lib/3.1/pg_ext.so"
39
54
  - "./lib/3.2/pg_ext.so"
40
55
  - "./lib/cipherstash-pg.rb"
56
+ - "./lib/cipherstash-pg/basic_type_map_based_on_result.rb"
57
+ - "./lib/cipherstash-pg/basic_type_map_for_queries.rb"
58
+ - "./lib/cipherstash-pg/basic_type_map_for_results.rb"
59
+ - "./lib/cipherstash-pg/basic_type_registry.rb"
60
+ - "./lib/cipherstash-pg/binary_decoder.rb"
61
+ - "./lib/cipherstash-pg/coder.rb"
62
+ - "./lib/cipherstash-pg/connection.rb"
63
+ - "./lib/cipherstash-pg/constants.rb"
64
+ - "./lib/cipherstash-pg/exceptions.rb"
65
+ - "./lib/cipherstash-pg/result.rb"
66
+ - "./lib/cipherstash-pg/text_decoder.rb"
67
+ - "./lib/cipherstash-pg/text_encoder.rb"
68
+ - "./lib/cipherstash-pg/tuple.rb"
69
+ - "./lib/cipherstash-pg/type_map_by_column.rb"
70
+ - "./lib/cipherstash-pg/version.rb"
41
71
  - "./lib/libpq.so.5"
42
- - "./lib/pg.rb"
43
- - "./lib/pg/basic_type_map_based_on_result.rb"
44
- - "./lib/pg/basic_type_map_for_queries.rb"
45
- - "./lib/pg/basic_type_map_for_results.rb"
46
- - "./lib/pg/basic_type_registry.rb"
47
- - "./lib/pg/binary_decoder.rb"
48
- - "./lib/pg/coder.rb"
49
- - "./lib/pg/connection.rb"
50
- - "./lib/pg/constants.rb"
51
- - "./lib/pg/exceptions.rb"
52
- - "./lib/pg/result.rb"
53
- - "./lib/pg/text_decoder.rb"
54
- - "./lib/pg/text_encoder.rb"
55
- - "./lib/pg/tuple.rb"
56
- - "./lib/pg/type_map_by_column.rb"
57
- - "./lib/pg/version.rb"
58
72
  - "./misc/openssl-pg-segfault.rb"
59
73
  - "./misc/postgres/History.txt"
60
74
  - "./misc/postgres/Manifest.txt"
@@ -86,6 +100,10 @@ files:
86
100
  - "./sample/test_binary_values.rb"
87
101
  - "./sample/wal_shipper.rb"
88
102
  - "./sample/warehouse_partitions.rb"
103
+ - "./translation/.po4a-version"
104
+ - "./translation/po/all.pot"
105
+ - "./translation/po/ja.po"
106
+ - "./translation/po4a.cfg"
89
107
  - "./vendor/database-extensions/install.sql"
90
108
  - "./vendor/database-extensions/uninstall.sql"
91
109
  homepage: https://github.com/cipherstash/cipherstash-pg
@@ -94,9 +112,13 @@ licenses:
94
112
  metadata:
95
113
  homepage_uri: https://github.com/cipherstash/cipherstash-pg
96
114
  source_code_uri: https://github.com/cipherstash/cipherstash-pg
97
- documentation_uri: http://deveiate.org/code/pg
115
+ derived_from_pg_gem_version: 1.4.6
98
116
  post_install_message:
99
- rdoc_options: []
117
+ rdoc_options:
118
+ - "--main"
119
+ - README.md
120
+ - "--title"
121
+ - 'CipherStashPG: The Ruby PostgreSQL Driver for CipherStash-enhanced PostgreSQL'
100
122
  require_paths:
101
123
  - lib
102
124
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -113,6 +135,6 @@ requirements: []
113
135
  rubygems_version: 3.4.6
114
136
  signing_key:
115
137
  specification_version: 4
116
- summary: CipherStash PG is a drop in replacement of PG that provides transparent data
117
- encryption
138
+ summary: CipherStashPG is the Ruby interface to CipherStash-enhanced PostgresQL, based
139
+ on PG
118
140
  test_files: []
data/README.ja.rdoc DELETED
@@ -1,13 +0,0 @@
1
- = pg
2
-
3
- home :: https://github.com/ged/ruby-pg
4
- docs :: http://deveiate.org/code/pg
5
-
6
-
7
- == Description
8
-
9
- This file needs a translation of the English README. Pull requests, patches, or
10
- volunteers gladly accepted.
11
-
12
- Until such time, please accept my sincere apologies for not knowing Japanese.
13
-
data/README.rdoc DELETED
@@ -1,233 +0,0 @@
1
- = pg
2
-
3
- home :: https://github.com/ged/ruby-pg
4
- docs :: http://deveiate.org/code/pg
5
- clog :: link:/History.rdoc
6
-
7
- {<img src="https://badges.gitter.im/Join%20Chat.svg" alt="Join the chat at https://gitter.im/ged/ruby-pg">}[https://gitter.im/ged/ruby-pg?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge]
8
-
9
-
10
- == Description
11
-
12
- Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/].
13
-
14
- It works with {PostgreSQL 9.3 and later}[http://www.postgresql.org/support/versioning/].
15
-
16
- A small example usage:
17
-
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
- == Build Status
33
-
34
- {<img src="https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml/badge.svg?branch=master" alt="Build Status Github Actions" />}[https://github.com/ged/ruby-pg/actions/workflows/source-gem.yml]
35
- {<img src="https://ci.appveyor.com/api/projects/status/gjx5axouf3b1wicp?svg=true" alt="Build Status Appveyor" />}[https://ci.appveyor.com/project/ged/ruby-pg-9j8l3]
36
- {<img src="https://app.travis-ci.com/larskanis/ruby-pg.svg?branch=master" alt="Build Status" />}[https://app.travis-ci.com/larskanis/ruby-pg]
37
-
38
- == Requirements
39
-
40
- * Ruby 2.4 or newer
41
- * PostgreSQL 9.3.x or later (with headers, -dev packages, etc).
42
-
43
- It usually works with earlier versions of Ruby/PostgreSQL as well, but those are
44
- not regularly tested.
45
-
46
-
47
- == Versioning
48
-
49
- We tag and release gems according to the {Semantic Versioning}[http://semver.org/] principle.
50
-
51
- 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.
52
-
53
- For example:
54
-
55
- spec.add_dependency 'pg', '~> 1.0'
56
-
57
-
58
- == How To Install
59
-
60
- Install via RubyGems:
61
-
62
- gem install pg
63
-
64
- You may need to specify the path to the 'pg_config' program installed with
65
- Postgres:
66
-
67
- gem install pg -- --with-pg-config=<path to pg_config>
68
-
69
- If you're installing via Bundler, you can provide compile hints like so:
70
-
71
- bundle config build.pg --with-pg-config=<path to pg_config>
72
-
73
- See README-OS_X.rdoc for more information about installing under MacOS X, and
74
- README-Windows.rdoc for Windows build/installation instructions.
75
-
76
- There's also {a Google+ group}[http://goo.gl/TFy1U] and a
77
- {mailing list}[http://groups.google.com/group/ruby-pg] if you get stuck, or just
78
- want to chat about something.
79
-
80
- If you want to install as a signed gem, the public certs of the gem signers
81
- can be found in {the `certs` directory}[https://github.com/ged/ruby-pg/tree/master/certs]
82
- of the repository.
83
-
84
-
85
- == Type Casts
86
-
87
- Pg can optionally type cast result values and query parameters in Ruby or
88
- native C code. This can speed up data transfers to and from the database,
89
- because String allocations are reduced and conversions in (slower) Ruby code
90
- can be omitted.
91
-
92
- Very basic type casting can be enabled by:
93
-
94
- conn.type_map_for_results = PG::BasicTypeMapForResults.new conn
95
- # ... this works for result value mapping:
96
- conn.exec("select 1, now(), '{2,3}'::int[]").values
97
- # => [[1, 2014-09-21 20:51:56 +0200, [2, 3]]]
98
-
99
- conn.type_map_for_queries = PG::BasicTypeMapForQueries.new conn
100
- # ... and this for param value mapping:
101
- conn.exec_params("SELECT $1::text, $2::text, $3::text", [1, 1.23, [2,3]]).values
102
- # => [["1", "1.2300000000000000E+00", "{2,3}"]]
103
-
104
- But Pg's type casting is highly customizable. That's why it's divided into
105
- 2 layers:
106
-
107
- === Encoders / Decoders (ext/pg_*coder.c, lib/pg/*coder.rb)
108
-
109
- This is the lower layer, containing encoding classes that convert Ruby
110
- objects for transmission to the DBMS and decoding classes to convert
111
- received data back to Ruby objects. The classes are namespaced according
112
- to their format and direction in PG::TextEncoder, PG::TextDecoder,
113
- PG::BinaryEncoder and PG::BinaryDecoder.
114
-
115
- It is possible to assign a type OID, format code (text or binary) and
116
- optionally a name to an encoder or decoder object. It's also possible
117
- to build composite types by assigning an element encoder/decoder.
118
- PG::Coder objects can be used to set up a PG::TypeMap or alternatively
119
- to convert single values to/from their string representation.
120
-
121
- The following PostgreSQL column types are supported by ruby-pg (TE = Text Encoder, TD = Text Decoder, BE = Binary Encoder, BD = Binary Decoder):
122
- * 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_rdoc.html#label-Type+Casts] 💡
123
- * BE: {Int2}[rdoc-ref:PG::BinaryEncoder::Int2], {Int4}[rdoc-ref:PG::BinaryEncoder::Int4], {Int8}[rdoc-ref:PG::BinaryEncoder::Int8]
124
- * Float: {TE}[rdoc-ref:PG::TextEncoder::Float], {TD}[rdoc-ref:PG::TextDecoder::Float], {BD}[rdoc-ref:PG::BinaryDecoder::Float]
125
- * Numeric: {TE}[rdoc-ref:PG::TextEncoder::Numeric], {TD}[rdoc-ref:PG::TextDecoder::Numeric]
126
- * 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]
127
- * 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]
128
- * 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]
129
- * 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]
130
- * Timestamp:
131
- * TE: {local}[rdoc-ref:PG::TextEncoder::TimestampWithoutTimeZone], {UTC}[rdoc-ref:PG::TextEncoder::TimestampUtc], {with-TZ}[rdoc-ref:PG::TextEncoder::TimestampWithTimeZone]
132
- * TD: {local}[rdoc-ref:PG::TextDecoder::TimestampLocal], {UTC}[rdoc-ref:PG::TextDecoder::TimestampUtc], {UTC-to-local}[rdoc-ref:PG::TextDecoder::TimestampUtcToLocal]
133
- * BD: {local}[rdoc-ref:PG::BinaryDecoder::TimestampLocal], {UTC}[rdoc-ref:PG::BinaryDecoder::TimestampUtc], {UTC-to-local}[rdoc-ref:PG::BinaryDecoder::TimestampUtcToLocal]
134
- * Date: {TE}[rdoc-ref:PG::TextEncoder::Date], {TD}[rdoc-ref:PG::TextDecoder::Date]
135
- * JSON and JSONB: {TE}[rdoc-ref:PG::TextEncoder::JSON], {TD}[rdoc-ref:PG::TextDecoder::JSON]
136
- * Inet: {TE}[rdoc-ref:PG::TextEncoder::Inet], {TD}[rdoc-ref:PG::TextDecoder::Inet]
137
- * Array: {TE}[rdoc-ref:PG::TextEncoder::Array], {TD}[rdoc-ref:PG::TextDecoder::Array]
138
- * Composite Type (also called "Row" or "Record"): {TE}[rdoc-ref:PG::TextEncoder::Record], {TD}[rdoc-ref:PG::TextDecoder::Record]
139
-
140
- The following text formats can also be encoded although they are not used as column type:
141
- * COPY input and output data: {TE}[rdoc-ref:PG::TextEncoder::CopyRow], {TD}[rdoc-ref:PG::TextDecoder::CopyRow]
142
- * Literal for insertion into SQL string: {TE}[rdoc-ref:PG::TextEncoder::QuotedLiteral]
143
- * SQL-Identifier: {TE}[rdoc-ref:PG::TextEncoder::Identifier], {TD}[rdoc-ref:PG::TextDecoder::Identifier]
144
-
145
- === PG::TypeMap and derivations (ext/pg_type_map*.c, lib/pg/type_map*.rb)
146
-
147
- A TypeMap defines which value will be converted by which encoder/decoder.
148
- There are different type map strategies, implemented by several derivations
149
- of this class. They can be chosen and configured according to the particular
150
- needs for type casting. The default type map is PG::TypeMapAllStrings.
151
-
152
- A type map can be assigned per connection or per query respectively per
153
- result set. Type maps can also be used for COPY in and out data streaming.
154
- See PG::Connection#copy_data .
155
-
156
- The following base type maps are available:
157
- * PG::TypeMapAllStrings - encodes and decodes all values to and from strings (default)
158
- * PG::TypeMapByClass - selects encoder based on the class of the value to be sent
159
- * PG::TypeMapByColumn - selects encoder and decoder by column order
160
- * PG::TypeMapByOid - selects decoder by PostgreSQL type OID
161
- * PG::TypeMapInRuby - define a custom type map in ruby
162
-
163
- The following type maps are prefilled with type mappings from the PG::BasicTypeRegistry :
164
- * PG::BasicTypeMapForResults - a PG::TypeMapByOid prefilled with decoders for common PostgreSQL column types
165
- * PG::BasicTypeMapBasedOnResult - a PG::TypeMapByOid prefilled with encoders for common PostgreSQL column types
166
- * PG::BasicTypeMapForQueries - a PG::TypeMapByClass prefilled with encoders for common Ruby value classes
167
-
168
-
169
- == Contributing
170
-
171
- To report bugs, suggest features, or check out the source with Git,
172
- {check out the project page}[https://github.com/ged/ruby-pg].
173
-
174
- After checking out the source, install all dependencies:
175
-
176
- $ bundle install
177
-
178
- Cleanup extension files, packaging files, test databases:
179
-
180
- $ rake clean
181
-
182
- Compile extension:
183
-
184
- $ rake compile
185
-
186
- Run tests/specs with PostgreSQL tools like `initdb` in the path:
187
-
188
- $ PATH=$PATH:/usr/lib/postgresql/14/bin rake test
189
-
190
- Or run a specific test with the line number:
191
-
192
- $ PATH=$PATH:/usr/lib/postgresql/14/bin rspec -Ilib -fd spec/pg/connection_spec.rb:455
193
-
194
- Generate the API documentation:
195
-
196
- $ rake docs
197
-
198
- Make sure, that all bugs and new features are verified by tests.
199
-
200
- The current maintainers are Michael Granger <ged@FaerieMUD.org> and
201
- Lars Kanis <lars@greiz-reinsdorf.de>.
202
-
203
-
204
- == Copying
205
-
206
- Copyright (c) 1997-2022 by the authors.
207
-
208
- * Jeff Davis <ruby-pg@j-davis.com>
209
- * Guy Decoux (ts) <decoux@moulon.inra.fr>
210
- * Michael Granger <ged@FaerieMUD.org>
211
- * Lars Kanis <lars@greiz-reinsdorf.de>
212
- * Dave Lee
213
- * Eiji Matsumoto <usagi@ruby.club.or.jp>
214
- * Yukihiro Matsumoto <matz@ruby-lang.org>
215
- * Noboru Saitou <noborus@netlab.jp>
216
-
217
- You may redistribute this software under the same terms as Ruby itself; see
218
- https://www.ruby-lang.org/en/about/license.txt or the BSDL file in the source
219
- for details.
220
-
221
- Portions of the code are from the PostgreSQL project, and are distributed
222
- under the terms of the PostgreSQL license, included in the file POSTGRES.
223
-
224
- Portions copyright LAIKA, Inc.
225
-
226
-
227
- == Acknowledgments
228
-
229
- See Contributors.rdoc for the many additional fine people that have contributed
230
- to this library over the years.
231
-
232
- We are thankful to the people at the ruby-list and ruby-dev mailing lists.
233
- And to the people who developed PostgreSQL.
@@ -1,47 +0,0 @@
1
- # -*- ruby -*-
2
- # frozen_string_literal: true
3
-
4
- require 'pg' unless defined?( PG )
5
-
6
- # Simple set of rules for type casting common PostgreSQL types from Ruby
7
- # to PostgreSQL.
8
- #
9
- # OIDs of supported type casts are not hard-coded in the sources, but are retrieved from the
10
- # PostgreSQL's +pg_type+ table in PG::BasicTypeMapBasedOnResult.new .
11
- #
12
- # This class works equal to PG::BasicTypeMapForResults, but does not define decoders for
13
- # the given result OIDs, but encoders. So it can be used to type cast field values based on
14
- # the type OID retrieved by a separate SQL query.
15
- #
16
- # PG::TypeMapByOid#build_column_map(result) can be used to generate a result independent
17
- # PG::TypeMapByColumn type map, which can subsequently be used to cast query bind parameters
18
- # or #put_copy_data fields.
19
- #
20
- # Example:
21
- # conn.exec( "CREATE TEMP TABLE copytable (t TEXT, i INT, ai INT[])" )
22
- #
23
- # # Retrieve table OIDs per empty result set.
24
- # res = conn.exec( "SELECT * FROM copytable LIMIT 0" )
25
- # # Build a type map for common ruby to database type encoders.
26
- # btm = PG::BasicTypeMapBasedOnResult.new(conn)
27
- # # Build a PG::TypeMapByColumn with encoders suitable for copytable.
28
- # tm = btm.build_column_map( res )
29
- # row_encoder = PG::TextEncoder::CopyRow.new type_map: tm
30
- #
31
- # conn.copy_data( "COPY copytable FROM STDIN", row_encoder ) do |res|
32
- # conn.put_copy_data ['a', 123, [5,4,3]]
33
- # end
34
- # This inserts a single row into copytable with type casts from ruby to
35
- # database types.
36
- class PG::BasicTypeMapBasedOnResult < PG::TypeMapByOid
37
- include PG::BasicTypeRegistry::Checker
38
-
39
- def initialize(connection_or_coder_maps, registry: nil)
40
- @coder_maps = build_coder_maps(connection_or_coder_maps, registry: registry)
41
-
42
- # Populate TypeMapByOid hash with encoders
43
- @coder_maps.each_format(:encoder).flat_map{|f| f.coders }.each do |coder|
44
- add_coder(coder)
45
- end
46
- end
47
- end
@@ -1,193 +0,0 @@
1
- # -*- ruby -*-
2
- # frozen_string_literal: true
3
-
4
- require 'pg' unless defined?( PG )
5
-
6
- # Simple set of rules for type casting common Ruby types to PostgreSQL.
7
- #
8
- # OIDs of supported type casts are not hard-coded in the sources, but are retrieved from the
9
- # PostgreSQL's pg_type table in PG::BasicTypeMapForQueries.new .
10
- #
11
- # Query params are type casted based on the class of the given value.
12
- #
13
- # Higher level libraries will most likely not make use of this class, but use their
14
- # own derivation of PG::TypeMapByClass or another set of rules to choose suitable
15
- # encoders and decoders for the values to be sent.
16
- #
17
- # Example:
18
- # conn = PG::Connection.new
19
- # # Assign a default ruleset for type casts of input and output values.
20
- # conn.type_map_for_queries = PG::BasicTypeMapForQueries.new(conn)
21
- # # Execute a query. The Integer param value is typecasted internally by PG::BinaryEncoder::Int8.
22
- # # The format of the parameter is set to 0 (text) and the OID of this parameter is set to 20 (int8).
23
- # res = conn.exec_params( "SELECT $1", [5] )
24
- class PG::BasicTypeMapForQueries < PG::TypeMapByClass
25
- # Helper class for submission of binary strings into bytea columns.
26
- #
27
- # Since PG::BasicTypeMapForQueries chooses the encoder to be used by the class of the submitted value,
28
- # it's necessary to send binary strings as BinaryData.
29
- # That way they're distinct from text strings.
30
- # Please note however that PG::BasicTypeMapForResults delivers bytea columns as plain String
31
- # with binary encoding.
32
- #
33
- # conn.type_map_for_queries = PG::BasicTypeMapForQueries.new(conn)
34
- # conn.exec("CREATE TEMP TABLE test (data bytea)")
35
- # bd = PG::BasicTypeMapForQueries::BinaryData.new("ab\xff\0cd")
36
- # conn.exec_params("INSERT INTO test (data) VALUES ($1)", [bd])
37
- class BinaryData < String
38
- end
39
-
40
- class UndefinedEncoder < RuntimeError
41
- end
42
-
43
- include PG::BasicTypeRegistry::Checker
44
-
45
- # Create a new type map for query submission
46
- #
47
- # Options:
48
- # * +registry+: Custom type registry, nil for default global registry
49
- # * +if_undefined+: Optional +Proc+ object which is called, if no type for an parameter class is not defined in the registry.
50
- def initialize(connection_or_coder_maps, registry: nil, if_undefined: nil)
51
- @coder_maps = build_coder_maps(connection_or_coder_maps, registry: registry)
52
- @array_encoders_by_klass = array_encoders_by_klass
53
- @encode_array_as = :array
54
- @if_undefined = if_undefined || proc { |oid_name, format|
55
- raise UndefinedEncoder, "no encoder defined for type #{oid_name.inspect} format #{format}"
56
- }
57
- init_encoders
58
- end
59
-
60
- # Change the mechanism that is used to encode ruby array values
61
- #
62
- # Possible values:
63
- # * +:array+ : Encode the ruby array as a PostgreSQL array.
64
- # The array element type is inferred from the class of the first array element. This is the default.
65
- # * +:json+ : Encode the ruby array as a JSON document.
66
- # * +:record+ : Encode the ruby array as a composite type row.
67
- # * <code>"_type"</code> : Encode the ruby array as a particular PostgreSQL type.
68
- # All PostgreSQL array types are supported.
69
- # If there's an encoder registered for the elements +type+, it will be used.
70
- # Otherwise a string conversion (by +value.to_s+) is done.
71
- def encode_array_as=(pg_type)
72
- case pg_type
73
- when :array
74
- when :json
75
- when :record
76
- when /\A_/
77
- else
78
- raise ArgumentError, "invalid pg_type #{pg_type.inspect}"
79
- end
80
-
81
- @encode_array_as = pg_type
82
-
83
- init_encoders
84
- end
85
-
86
- attr_reader :encode_array_as
87
-
88
- private
89
-
90
- def init_encoders
91
- coders.each { |kl, c| self[kl] = nil } # Clear type map
92
- populate_encoder_list
93
- @textarray_encoder = coder_by_name(0, :encoder, '_text')
94
- end
95
-
96
- def coder_by_name(format, direction, name)
97
- check_format_and_direction(format, direction)
98
- @coder_maps.map_for(format, direction).coder_by_name(name)
99
- end
100
-
101
- def undefined(name, format)
102
- @if_undefined.call(name, format)
103
- end
104
-
105
- def populate_encoder_list
106
- DEFAULT_TYPE_MAP.each do |klass, selector|
107
- if Array === selector
108
- format, name, oid_name = selector
109
- coder = coder_by_name(format, :encoder, name).dup
110
- if coder
111
- if oid_name
112
- oid_coder = coder_by_name(format, :encoder, oid_name)
113
- if oid_coder
114
- coder.oid = oid_coder.oid
115
- else
116
- undefined(oid_name, format)
117
- end
118
- else
119
- coder.oid = 0
120
- end
121
- self[klass] = coder
122
- else
123
- undefined(name, format)
124
- end
125
- else
126
-
127
- case @encode_array_as
128
- when :array
129
- self[klass] = selector
130
- when :json
131
- self[klass] = PG::TextEncoder::JSON.new
132
- when :record
133
- self[klass] = PG::TextEncoder::Record.new type_map: self
134
- when /\A_/
135
- coder = coder_by_name(0, :encoder, @encode_array_as)
136
- if coder
137
- self[klass] = coder
138
- else
139
- undefined(@encode_array_as, format)
140
- end
141
- else
142
- raise ArgumentError, "invalid pg_type #{@encode_array_as.inspect}"
143
- end
144
- end
145
- end
146
- end
147
-
148
- def array_encoders_by_klass
149
- DEFAULT_ARRAY_TYPE_MAP.inject({}) do |h, (klass, (format, name))|
150
- h[klass] = coder_by_name(format, :encoder, name)
151
- h
152
- end
153
- end
154
-
155
- def get_array_type(value)
156
- elem = value
157
- while elem.kind_of?(Array)
158
- elem = elem.first
159
- end
160
- @array_encoders_by_klass[elem.class] ||
161
- elem.class.ancestors.lazy.map{|ancestor| @array_encoders_by_klass[ancestor] }.find{|a| a } ||
162
- @textarray_encoder
163
- end
164
-
165
- DEFAULT_TYPE_MAP = {
166
- TrueClass => [1, 'bool', 'bool'],
167
- FalseClass => [1, 'bool', 'bool'],
168
- # We use text format and no type OID for numbers, because setting the OID can lead
169
- # to unnecessary type conversions on server side.
170
- Integer => [0, 'int8'],
171
- Float => [0, 'float8'],
172
- BigDecimal => [0, 'numeric'],
173
- Time => [0, 'timestamptz'],
174
- # We use text format and no type OID for IPAddr, because setting the OID can lead
175
- # to unnecessary inet/cidr conversions on the server side.
176
- IPAddr => [0, 'inet'],
177
- Hash => [0, 'json'],
178
- Array => :get_array_type,
179
- BinaryData => [1, 'bytea'],
180
- }
181
-
182
- DEFAULT_ARRAY_TYPE_MAP = {
183
- TrueClass => [0, '_bool'],
184
- FalseClass => [0, '_bool'],
185
- Integer => [0, '_int8'],
186
- String => [0, '_text'],
187
- Float => [0, '_float8'],
188
- BigDecimal => [0, '_numeric'],
189
- Time => [0, '_timestamptz'],
190
- IPAddr => [0, '_inet'],
191
- }
192
-
193
- end