db-postgres 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad8645e63c269d03c3503158ed9bbca82dc4d4c6fa0eb189dcdc2e1fa7d17605
4
- data.tar.gz: d4e4a3ed0dc4ddc044190ac5fb0483221c97825b1f60371bd8fc5707afb24e45
3
+ metadata.gz: c1e8cc873554e3bcefdbf489094450d6007f0451757cf16989f812fac85d33d2
4
+ data.tar.gz: 91131bfb88f971578e00272aa4c410e445ed2906d051cae8105e389e35bd4423
5
5
  SHA512:
6
- metadata.gz: 4aaa5eb85a4486026a845d24378c3a125edb305e5533e2dcad5d2658395c42ed6da98cc6a393b83d81bf08fb9fbd69b5a834fce41d298a20e5daf254bcc5762f
7
- data.tar.gz: 87d33e1a8549824e60fcee9b7301157393f2fe8dcb1424d81c2ad707ffb2c3ec11c5fb44ffb51d82bb10e91219d1382bcfa216f1746e84f9cbda411385bf7e4e
6
+ metadata.gz: e81269f302f34a4243f0122e3c33146e5f5e988ea90ab19424a11c2acaaea176547b2fdaa5cc339659f2847edf95b57dda6b0fbbd6077ececd6e9bef887badb7
7
+ data.tar.gz: 1c5557f07a0234abbcf9609c655a63a22f5fc1178c25ed86cf8666b80fa88341ab893ffb94f6187ad38e9e9877a98bf9c09850ddff58a2d30c053c81c7051756
@@ -25,16 +25,16 @@ require_relative '../error'
25
25
  module DB
26
26
  module Postgres
27
27
  module Native
28
- def self.array_of_strings(values)
29
- array = FFI::MemoryPointer.new(:pointer, values.size + 1)
30
-
31
- pointers = values.map do |value|
32
- FFI::MemoryPointer.from_string(value.to_s)
28
+ class Strings
29
+ def initialize(values)
30
+ @array = FFI::MemoryPointer.new(:pointer, values.size + 1)
31
+ @pointers = values.map do |value|
32
+ FFI::MemoryPointer.from_string(value.to_s)
33
+ end
34
+ @array.write_array_of_pointer(@pointers)
33
35
  end
34
36
 
35
- array.write_array_of_pointer(pointers)
36
-
37
- return array
37
+ attr :array
38
38
  end
39
39
 
40
40
  attach_function :connect_start_params, :PQconnectStartParams, [:pointer, :pointer, :int], :pointer
@@ -103,18 +103,24 @@ module DB
103
103
  end
104
104
 
105
105
  class Connection < FFI::Pointer
106
- def self.connect(io: IO, types: DEFAULT_TYPES, **options)
107
- # Prefer 'database' key for 'dbname' parameter:
106
+ def self.connect(wrapper: IO, types: DEFAULT_TYPES, **options)
107
+ # Postgres expects "dbname" as the key name:
108
108
  if database = options.delete(:database)
109
109
  options[:dbname] = database
110
110
  end
111
111
 
112
- keys = Native.array_of_strings(options.keys)
113
- values = Native.array_of_strings(options.values)
112
+ # Postgres expects "user" as the key name:
113
+ if username = options.delete(:username)
114
+ options[:user] = username
115
+ end
116
+
117
+ keys = Strings.new(options.keys)
118
+ values = Strings.new(options.values)
114
119
 
115
- pointer = Native.connect_start_params(keys, values, 0)
120
+ pointer = Native.connect_start_params(keys.array, values.array, 0)
121
+ Native.set_nonblocking(pointer, 1)
116
122
 
117
- io = io.new(Native.socket(pointer), "r+")
123
+ io = wrapper.new(Native.socket(pointer), "r+")
118
124
 
119
125
  while status = Native.connect_poll(pointer)
120
126
  break if status == :ok || status == :failed
@@ -130,11 +136,9 @@ module DB
130
136
 
131
137
  Native.finish(pointer)
132
138
 
133
- raise "connect: #{error_message}"
139
+ raise Error, "Could not connect: #{error_message}"
134
140
  end
135
141
 
136
- Native.set_nonblocking(pointer, 1)
137
-
138
142
  return self.new(pointer, io, types)
139
143
  end
140
144
 
@@ -43,7 +43,9 @@ module DB
43
43
  attach_function :field_count, :PQnfields, [:pointer], :int
44
44
  attach_function :field_name, :PQfname, [:pointer, :int], :string
45
45
  attach_function :field_type, :PQftype, [:pointer, :int], :int
46
+
46
47
  attach_function :get_value, :PQgetvalue, [:pointer, :int, :int], :string
48
+ attach_function :get_is_null, :PQgetisnull, [:pointer, :int, :int], :int
47
49
 
48
50
  attach_function :clear, :PQclear, [:pointer], :void
49
51
 
@@ -109,7 +111,9 @@ module DB
109
111
 
110
112
  protected
111
113
  def get_value(row, field)
112
- Native.get_value(self, row, field)
114
+ if Native.get_is_null(self, row, field) == 0
115
+ Native.get_value(self, row, field)
116
+ end
113
117
  end
114
118
 
115
119
  def get_row(row)
@@ -20,6 +20,6 @@
20
20
 
21
21
  module DB
22
22
  module Postgres
23
- VERSION = "0.2.0"
23
+ VERSION = "0.3.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db-postgres
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-05 00:00:00.000000000 Z
11
+ date: 2021-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: async-pool
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: async-rspec
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -143,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
157
  - !ruby/object:Gem::Version
144
158
  version: '0'
145
159
  requirements: []
146
- rubygems_version: 3.0.3
160
+ rubygems_version: 3.1.2
147
161
  signing_key:
148
162
  specification_version: 4
149
163
  summary: Ruby FFI bindings for libpq C interface.