db-postgres 0.1.3 → 0.2.4

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: 15e56a0b92baec716e393ca41924d4a4aa90416821d8487bc02673142d1ed9d4
4
- data.tar.gz: d4cbaa125adf5ea621cc70ae1e7161a77a9923fbcd7c48a770ca86632e578baa
3
+ metadata.gz: 9914774aac9e6cf060fdba11e1ce395b7311ee55c514b3720a94b8252aaf82f6
4
+ data.tar.gz: fa42571a59bc7c9f12103359a4e396607536a6542a5ab37bd6a736b882450792
5
5
  SHA512:
6
- metadata.gz: 432dffb6cf3656f9a7e4d55654cee51bf4f7fd7453a700d7c58cf429621ebd4cc71d86a851755eceb278df8135c64e208857ab7a45647c5c32565534e85ceccd
7
- data.tar.gz: 0b6d0cb0da0d93decaafbc5fa0e96f29df546f6b865edbc11e9d9290de6bddc11c0cf6e169b649e0ea2fbf2ee0909e5830eafbf8d5e5ff510d518a6cd11409df
6
+ metadata.gz: 9766e98f2f42277a5ffe6df30777f8f328f8d12146cce6dddfcc0e9f50a8c1359e4b2d4766377775eb996046219e188b14e7f728609da7544d338363dacc478f
7
+ data.tar.gz: d0a9718c070dede2a6aa61e060518c8a43d0448345a0e0c79a20ff1486f89a303cd0ef120ac9137ab13575044b3811574904056c3342ce0073ab6b532ea3754f
Binary file
@@ -27,12 +27,6 @@ require_relative 'native/connection'
27
27
 
28
28
  module DB
29
29
  module Postgres
30
- module IO
31
- def self.new(fd, mode)
32
- Async::IO::Generic.new(::IO.new(fd, mode, autoclose: false))
33
- end
34
- end
35
-
36
30
  # This implements the interface between the underlying
37
31
  class Connection < Async::Pool::Resource
38
32
  def initialize(**options)
@@ -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
@@ -96,19 +96,26 @@ module DB
96
96
  attach_function :escape_literal, :PQescapeLiteral, [:pointer, :string, :size_t], :pointer
97
97
  attach_function :escape_identifier, :PQescapeIdentifier, [:pointer, :string, :size_t], :pointer
98
98
 
99
+ module IO
100
+ def self.new(fd, mode)
101
+ Async::IO::Generic.new(::IO.new(fd, mode, autoclose: false))
102
+ end
103
+ end
104
+
99
105
  class Connection < FFI::Pointer
100
- def self.connect(io: IO, types: DEFAULT_TYPES, **options)
106
+ def self.connect(wrapper: IO, types: DEFAULT_TYPES, **options)
101
107
  # Prefer 'database' key for 'dbname' parameter:
102
108
  if database = options.delete(:database)
103
109
  options[:dbname] = database
104
110
  end
105
111
 
106
- keys = Native.array_of_strings(options.keys)
107
- values = Native.array_of_strings(options.values)
112
+ keys = Strings.new(options.keys)
113
+ values = Strings.new(options.values)
108
114
 
109
- pointer = Native.connect_start_params(keys, values, 0)
115
+ pointer = Native.connect_start_params(keys.array, values.array, 0)
116
+ Native.set_nonblocking(pointer, 1)
110
117
 
111
- io = io.new(Native.socket(pointer), "r+")
118
+ io = wrapper.new(Native.socket(pointer), "r+")
112
119
 
113
120
  while status = Native.connect_poll(pointer)
114
121
  break if status == :ok || status == :failed
@@ -124,11 +131,9 @@ module DB
124
131
 
125
132
  Native.finish(pointer)
126
133
 
127
- raise "connect: #{error_message}"
134
+ raise Error, "Could not connect: #{error_message}"
128
135
  end
129
136
 
130
- Native.set_nonblocking(pointer, 1)
131
-
132
137
  return self.new(pointer, io, types)
133
138
  end
134
139
 
@@ -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.1.3"
23
+ VERSION = "0.2.4"
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.1.3
4
+ version: 0.2.4
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: 2020-12-25 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
@@ -114,6 +128,7 @@ executables: []
114
128
  extensions: []
115
129
  extra_rdoc_files: []
116
130
  files:
131
+ - lib/.DS_Store
117
132
  - lib/db/postgres.rb
118
133
  - lib/db/postgres/adapter.rb
119
134
  - lib/db/postgres/connection.rb
@@ -143,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
158
  - !ruby/object:Gem::Version
144
159
  version: '0'
145
160
  requirements: []
146
- rubygems_version: 3.0.3
161
+ rubygems_version: 3.1.2
147
162
  signing_key:
148
163
  specification_version: 4
149
164
  summary: Ruby FFI bindings for libpq C interface.