db-postgres 0.5.1 → 0.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e5c7a476bf800ceb0e62c23d437963ef7a0a39a0eaabef48956a10af7599df7
4
- data.tar.gz: eed2783a2f8b9fc31b9736a2d9cd6376c1b22af58b15a2632bbd11133e308b7d
3
+ metadata.gz: 2ba17d708434471a3146cf704a5df1f64109ee8d914f73e7fbd07bcee83a04d0
4
+ data.tar.gz: 896c9c7c8850266ec0ec93a2f3ccbf35a70edd1bf88d6e9f15b67702338d6f66
5
5
  SHA512:
6
- metadata.gz: 242ac6071931166bdbd4b8a6fabedd09e5bfd01456e610b728a9582ca8dc04b3e45ef5c89dde5a6b142ad4ef3ae83fc14ebd1cc1d0d95e348e456b94125b4242
7
- data.tar.gz: 409c949f727ed4ea349bb01449ef1c431c890f4c6b8ea72197a5c7cf3c792b08347d733591bd8ce941fca0d2767d94bfdac1363e0e88c0d159d177e5d7f80280
6
+ metadata.gz: 18d4937f8998c303c2816a9a7fc990e0b9af87fc44a25f448a48f20f509fdf6738a697eeca81df043109ebc753585565c0d67c822b350350fa69b3db9248fb82
7
+ data.tar.gz: cd4a0d9ea49bbee151193bc512765631c47ea99d97ae495f96d0dd91d709b216fe70840038ec410f538aeaafc3029ba63bd9df0025193dcc2622658b4bcf569d
checksums.yaml.gz.sig ADDED
Binary file
@@ -36,11 +36,18 @@ module DB
36
36
  end
37
37
 
38
38
  def close
39
- @native.close
39
+ if @native
40
+ @native&.close
41
+ @native = nil
42
+ end
40
43
 
41
44
  super
42
45
  end
43
46
 
47
+ def types
48
+ @native.types
49
+ end
50
+
44
51
  def append_string(value, buffer = String.new)
45
52
  buffer << @native.escape_literal(value)
46
53
 
@@ -49,6 +56,8 @@ module DB
49
56
 
50
57
  def append_literal(value, buffer = String.new)
51
58
  case value
59
+ when Time, DateTime, Date
60
+ append_string(value.iso8601, buffer)
52
61
  when Numeric
53
62
  buffer << value.to_s
54
63
  when TrueClass
@@ -149,6 +149,8 @@ module DB
149
149
  @types = types
150
150
  end
151
151
 
152
+ attr :types
153
+
152
154
  # Return the status of the connection.
153
155
  def status
154
156
  Native.status(self)
@@ -214,7 +216,7 @@ module DB
214
216
 
215
217
  Native.clear(result)
216
218
 
217
- raise Error, "Could not get next result: #{message}"
219
+ raise Error, message
218
220
  end
219
221
 
220
222
  return Result.new(self, types, result)
@@ -20,32 +20,60 @@
20
20
 
21
21
  require_relative 'types'
22
22
 
23
- require 'json'
24
- require 'time'
25
-
26
23
  module DB
27
24
  module Postgres
28
25
  module Native
29
- # These are hard coded OIDs.
30
26
  DEFAULT_TYPES = {
31
- 16 => Types::Boolean,
27
+ # Pseudo types:
28
+ primary_key: Types::Integer.new('BIGSERIAL PRIMARY KEY'),
29
+ foreign_key: Types::Integer.new('BIGINT'),
30
+ text: Types::Text.new("TEXT"),
31
+ string: Types::Text.new("VARCHAR(255)"),
32
+
33
+ # Symbolic types:
34
+ decimal: Types::Decimal.new,
35
+ boolean: Types::Boolean.new,
36
+
37
+ smallint: Types::Integer.new("SMALLINT"),
38
+ integer: Types::Integer.new("INTEGER"),
39
+ bigint: Types::Integer.new("BIGINT"),
40
+
41
+ float: Types::Float.new,
42
+ double: Types::Float.new("DOUBLE"),
43
+
44
+ timestamp: Types::DateTime.new("TIMESTAMP"),
45
+ date: Types::Date.new,
46
+ datetime: Types::DateTime.new("DATETIME"),
47
+ year: Types::Integer.new("LONG"),
48
+
49
+ json: Types::JSON.new,
50
+ enum: Types::Symbol.new,
51
+
52
+ # Native types:
53
+ # This data is extracted by hand from:
54
+ # <https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_type.dat>.
55
+ # These are hard coded OIDs.
56
+ 16 => Types::Boolean.new,
57
+
58
+ 20 => Types::Integer.new("int8"),
59
+ 21 => Types::Integer.new("int2"),
60
+ 23 => Types::Integer.new("int4"),
32
61
 
33
- 20 => Types::Integer,
34
- 21 => Types::Integer,
35
- 23 => Types::Integer,
62
+ 114 => Types::JSON.new,
36
63
 
37
- 114 => JSON,
64
+ 700 => Types::Float.new('float4'),
65
+ 701 => Types::Float.new('float8'),
38
66
 
39
- 700 => Types::Float,
40
- 701 => Types::Float,
67
+ 1082 => Types::Date.new,
68
+ 1083 => Types::DateTime.new("TIME"),
41
69
 
42
- 1082 => Date,
43
- 1083 => Types::DateTime,
44
- 1114 => Types::DateTime,
70
+ 1114 => Types::DateTime.new("TIMESTAMP"),
71
+ 1184 => Types::DateTime.new("TIMESTAMPTZ"),
45
72
 
46
- 1700 => Types::Decimal,
73
+ 1700 => Types::Decimal.new,
47
74
 
48
- 3500 => Types::Symbol,
75
+ # Not sure if this is ever used?
76
+ 3500 => Types::Symbol.new,
49
77
  }
50
78
  end
51
79
  end
@@ -54,8 +54,6 @@ module DB
54
54
  ffi_attach_function :PQfreemem, [:pointer], :void, as: :free_memory
55
55
 
56
56
  class Result < FFI::Pointer
57
- include Enumerable
58
-
59
57
  def initialize(connection, types = {}, address)
60
58
  super(address)
61
59
 
@@ -101,6 +99,26 @@ module DB
101
99
  Native.clear(self)
102
100
  end
103
101
 
102
+ def map(&block)
103
+ results = []
104
+
105
+ self.each do |row|
106
+ results << yield(row)
107
+ end
108
+
109
+ return results
110
+ end
111
+
112
+ def to_a
113
+ rows = []
114
+
115
+ self.each do |row|
116
+ rows << row
117
+ end
118
+
119
+ return rows
120
+ end
121
+
104
122
  protected
105
123
 
106
124
  def get_value(row, field)
@@ -18,8 +18,6 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'ffi'
22
-
23
21
  require 'json'
24
22
  require 'bigdecimal'
25
23
 
@@ -27,41 +25,109 @@ module DB
27
25
  module Postgres
28
26
  module Native
29
27
  module Types
30
- module Boolean
31
- def self.parse(string)
28
+ class Text
29
+ def initialize(name = "TEXT")
30
+ @name = name
31
+ end
32
+
33
+ attr :name
34
+
35
+ def parse(string)
36
+ string
37
+ end
38
+ end
39
+
40
+ class Integer
41
+ def initialize(name = "INTEGER")
42
+ @name = name
43
+ end
44
+
45
+ attr :name
46
+
47
+ def parse(string)
48
+ Integer(string) if string
49
+ end
50
+ end
51
+
52
+ class Boolean
53
+ def name
54
+ "BOOLEAN"
55
+ end
56
+
57
+ def parse(string)
32
58
  string == 't'
33
59
  end
34
60
  end
35
61
 
36
- module Integer
37
- def self.parse(string)
38
- Integer(string)
62
+ class Decimal
63
+ def name
64
+ "DECIMAL"
65
+ end
66
+
67
+ def parse(string)
68
+ BigDecimal(string) if string
39
69
  end
40
70
  end
41
71
 
42
- module Decimal
43
- def self.parse(string)
44
- BigDecimal(string)
72
+ class Float
73
+ def initialize(name = "FLOAT")
74
+ @name = name
75
+ end
76
+
77
+ attr :name
78
+
79
+ def parse(string)
80
+ Float(string) if string
45
81
  end
46
82
  end
47
83
 
48
- module Float
49
- def self.parse(string)
50
- Float(string)
84
+ class Symbol
85
+ def name
86
+ "ENUM"
87
+ end
88
+
89
+ def parse(string)
90
+ string&.to_sym
51
91
  end
52
92
  end
53
93
 
54
- module Symbol
55
- def self.parse(string)
56
- string.to_sym
94
+ class DateTime
95
+ def initialize(name = "TIMESTAMP")
96
+ @name = name
97
+ end
98
+
99
+ attr :name
100
+
101
+ def parse(string)
102
+ if string
103
+ parts = string.split(/[\-\s:]/)
104
+
105
+ return Time.utc(*parts)
106
+ end
57
107
  end
58
108
  end
59
109
 
60
- module DateTime
61
- def self.parse(string)
62
- parts = string.split(/[\-\s:\.]/)
63
-
64
- return Time.utc(*parts)
110
+ class Date
111
+ def name
112
+ "DATE"
113
+ end
114
+
115
+ def parse(string)
116
+ if string
117
+ parts = string.split(/[\-\s:]/)
118
+
119
+ return Time.utc(*parts)
120
+ end
121
+ end
122
+ end
123
+
124
+ class JSON
125
+ def name
126
+ "JSON"
127
+ end
128
+
129
+ def parse(string)
130
+ ::JSON.parse(string, symbolize_names: true) if string
65
131
  end
66
132
  end
67
133
  end
@@ -35,7 +35,7 @@ module DB
35
35
 
36
36
  ## Ubuntu
37
37
 
38
- sudo apt-get install postgresql postgresql-contrib
38
+ sudo apt-get install libpq-dev
39
39
 
40
40
  ## Arch Linux
41
41
 
@@ -20,6 +20,6 @@
20
20
 
21
21
  module DB
22
22
  module Postgres
23
- VERSION = "0.5.1"
23
+ VERSION = "0.7.0"
24
24
  end
25
25
  end
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ _��F�b��(�zM��Zs�ƙ��.UV�"��ث*rS>���VB�ٻ��b2u0�
2
+ p��W�6�kFF���A�
metadata CHANGED
@@ -1,31 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db-postgres
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2021-04-04 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
14
+ ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
15
+ MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
16
+ aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
17
+ AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
18
+ xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
19
+ eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
20
+ L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
21
+ 9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
22
+ E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
23
+ rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
24
+ w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
25
+ 8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
26
+ BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
27
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
28
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
29
+ CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
30
+ 9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
31
+ vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
32
+ x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
33
+ bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
34
+ Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
35
+ y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
36
+ RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
37
+ HiLJ8VOFx6w=
38
+ -----END CERTIFICATE-----
39
+ date: 2021-10-04 00:00:00.000000000 Z
12
40
  dependencies:
13
41
  - !ruby/object:Gem::Dependency
14
- name: ffi-module
42
+ name: async-io
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
- - - "~>"
45
+ - - ">="
18
46
  - !ruby/object:Gem::Version
19
- version: 0.3.0
47
+ version: '0'
20
48
  type: :runtime
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
- - - "~>"
52
+ - - ">="
25
53
  - !ruby/object:Gem::Version
26
- version: 0.3.0
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
- name: async-io
56
+ name: async-pool
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - ">="
@@ -39,19 +67,19 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
- name: async-pool
70
+ name: ffi-module
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
- - - ">="
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '0'
75
+ version: 0.3.0
48
76
  type: :runtime
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ">="
80
+ - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '0'
82
+ version: 0.3.0
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: async-rspec
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +109,7 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: covered
112
+ name: bundler
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
@@ -95,7 +123,7 @@ dependencies:
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
- name: bundler
126
+ name: covered
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - ">="
@@ -128,7 +156,6 @@ executables: []
128
156
  extensions: []
129
157
  extra_rdoc_files: []
130
158
  files:
131
- - lib/.DS_Store
132
159
  - lib/db/postgres.rb
133
160
  - lib/db/postgres/adapter.rb
134
161
  - lib/db/postgres/connection.rb
@@ -139,7 +166,7 @@ files:
139
166
  - lib/db/postgres/native/result.rb
140
167
  - lib/db/postgres/native/types.rb
141
168
  - lib/db/postgres/version.rb
142
- homepage:
169
+ homepage: https://github.com/socketry/db-postgres
143
170
  licenses:
144
171
  - MIT
145
172
  metadata: {}
@@ -158,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
185
  - !ruby/object:Gem::Version
159
186
  version: '0'
160
187
  requirements: []
161
- rubygems_version: 3.2.3
188
+ rubygems_version: 3.2.22
162
189
  signing_key:
163
190
  specification_version: 4
164
191
  summary: Ruby FFI bindings for libpq C interface.
metadata.gz.sig ADDED
Binary file
data/lib/.DS_Store DELETED
Binary file