db-mariadb 0.2.0 → 0.3.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 +4 -4
- data/lib/db/mariadb/adapter.rb +4 -4
- data/lib/db/mariadb/connection.rb +18 -6
- data/lib/db/mariadb/error.rb +28 -0
- data/lib/db/mariadb/native/connection.rb +47 -20
- data/lib/db/mariadb/native/field.rb +3 -2
- data/lib/db/mariadb/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d18fa619ccfc3b043299790a3e6a275670ce48614304355e3f75ba5ed1cdc202
|
4
|
+
data.tar.gz: eb9e90465532de40869b545c1a65158136e2efbedeff6440f061c4f45d486e8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec5a4ceca8186959f19019e92cc77a53e945e4834f2c7776d60b78688c32d5f614e243a868b19f584e93c70bd8c19360525a1e2b11d9b597a37a83ae247e239b
|
7
|
+
data.tar.gz: 65b204be2c1c3f4dfa24f114246a2ec32913aceb580c7be40333aafe8c89a5680098612fae30136f8d537821d246ae9bf508def1f367d57db9c0bb59f767bd82
|
data/lib/db/mariadb/adapter.rb
CHANGED
@@ -27,14 +27,14 @@ module DB
|
|
27
27
|
LOCAL = "mysql://localhost/test"
|
28
28
|
|
29
29
|
class Adapter
|
30
|
-
def initialize(
|
31
|
-
@
|
30
|
+
def initialize(**options)
|
31
|
+
@options = options
|
32
32
|
end
|
33
33
|
|
34
|
-
attr :
|
34
|
+
attr :options
|
35
35
|
|
36
36
|
def call
|
37
|
-
Connection.new(
|
37
|
+
Connection.new(**@options)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -21,16 +21,12 @@
|
|
21
21
|
# THE SOFTWARE.
|
22
22
|
|
23
23
|
require 'async/pool/resource'
|
24
|
+
require 'async/io/generic'
|
25
|
+
|
24
26
|
require_relative 'native/connection'
|
25
27
|
|
26
28
|
module DB
|
27
29
|
module MariaDB
|
28
|
-
module IO
|
29
|
-
def self.new(fd, mode)
|
30
|
-
Async::IO::Generic.new(::IO.new(fd, mode, autoclose: false))
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
30
|
# This implements the interface between the underyling native interface interface and "standardised" connection interface.
|
35
31
|
class Connection < Async::Pool::Resource
|
36
32
|
def initialize(**options)
|
@@ -74,11 +70,27 @@ module DB
|
|
74
70
|
return buffer
|
75
71
|
end
|
76
72
|
|
73
|
+
def id_column(name = 'id', primary_key: true)
|
74
|
+
buffer = String.new
|
75
|
+
|
76
|
+
append_identifier(name, buffer)
|
77
|
+
|
78
|
+
buffer << " BIGINT AUTO_INCREMENT"
|
79
|
+
|
80
|
+
if primary_key
|
81
|
+
buffer << " PRIMARY KEY"
|
82
|
+
end
|
83
|
+
|
84
|
+
return buffer
|
85
|
+
end
|
86
|
+
|
77
87
|
def status
|
78
88
|
@native.status
|
79
89
|
end
|
80
90
|
|
81
91
|
def send_query(statement)
|
92
|
+
@native.discard_results
|
93
|
+
|
82
94
|
@native.send_query(statement)
|
83
95
|
end
|
84
96
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
module DB
|
24
|
+
module MariaDB
|
25
|
+
class Error < StandardError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -19,7 +19,7 @@
|
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
21
|
require_relative 'result'
|
22
|
-
|
22
|
+
require_relative '../error'
|
23
23
|
|
24
24
|
module DB
|
25
25
|
module MariaDB
|
@@ -48,6 +48,7 @@ module DB
|
|
48
48
|
|
49
49
|
attach_function :mysql_use_result, [:pointer], :pointer
|
50
50
|
attach_function :mysql_next_result, [:pointer], :int
|
51
|
+
attach_function :mysql_more_results, [:pointer], :int
|
51
52
|
attach_function :mysql_free_result, [:pointer], :void
|
52
53
|
|
53
54
|
attach_function :mysql_affected_rows, [:pointer], :uint64
|
@@ -62,6 +63,12 @@ module DB
|
|
62
63
|
|
63
64
|
attach_function :mysql_real_escape_string, [:pointer, :pointer, :string, :size_t], :size_t
|
64
65
|
|
66
|
+
module IO
|
67
|
+
def self.new(fd, mode)
|
68
|
+
Async::IO::Generic.new(::IO.new(fd, mode, autoclose: false))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
65
72
|
class Connection < FFI::Pointer
|
66
73
|
def self.connect(io: IO, host: 'localhost', user: nil, password: nil, database: nil, port: 0, unix_socket: nil, client_flags: 0, compression: false, types: DEFAULT_TYPES, **options)
|
67
74
|
pointer = Native.mysql_init(nil)
|
@@ -94,13 +101,13 @@ module DB
|
|
94
101
|
end
|
95
102
|
|
96
103
|
if result.read_pointer.null?
|
97
|
-
raise "Could not connect: #{Native.mysql_error(pointer)}!"
|
104
|
+
raise Error, "Could not connect: #{Native.mysql_error(pointer)}!"
|
98
105
|
end
|
99
106
|
|
100
107
|
return self.new(pointer, io, types, **options)
|
101
108
|
end
|
102
109
|
|
103
|
-
def initialize(address, io, types)
|
110
|
+
def initialize(address, io, types, **options)
|
104
111
|
super(address)
|
105
112
|
|
106
113
|
@io = io
|
@@ -119,7 +126,7 @@ module DB
|
|
119
126
|
|
120
127
|
def check_error!(message)
|
121
128
|
if Native.mysql_errno(self) != 0
|
122
|
-
raise "#{message}: #{Native.mysql_error(self)}!"
|
129
|
+
raise Error, "#{message}: #{Native.mysql_error(self)}!"
|
123
130
|
end
|
124
131
|
end
|
125
132
|
|
@@ -168,42 +175,62 @@ module DB
|
|
168
175
|
end
|
169
176
|
|
170
177
|
if error.read_int != 0
|
171
|
-
raise "Could not send query: #{Native.mysql_error(self)}!"
|
178
|
+
raise Error, "Could not send query: #{Native.mysql_error(self)}!"
|
172
179
|
end
|
173
180
|
end
|
174
181
|
|
182
|
+
# @returns [Boolean] If there are more results.
|
183
|
+
def more_results?
|
184
|
+
Native.mysql_more_results(self) == 1
|
185
|
+
end
|
186
|
+
|
175
187
|
def next_result(types: @types)
|
188
|
+
if result = self.get_result
|
189
|
+
return Result.new(self, types, result)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# Silently discard any results that application didn't read.
|
194
|
+
def discard_results
|
195
|
+
while result = self.get_result
|
196
|
+
end
|
197
|
+
|
198
|
+
return nil
|
199
|
+
end
|
200
|
+
|
201
|
+
def affected_rows
|
202
|
+
Native.mysql_affected_rows(self)
|
203
|
+
end
|
204
|
+
|
205
|
+
def insert_id
|
206
|
+
Native.mysql_insert_id(self)
|
207
|
+
end
|
208
|
+
|
209
|
+
def info
|
210
|
+
Native.mysql_info(self)
|
211
|
+
end
|
212
|
+
|
213
|
+
protected
|
214
|
+
def get_result
|
176
215
|
if @result
|
177
216
|
self.free_result
|
178
217
|
|
179
218
|
# Successful and there are no more results:
|
180
219
|
return if Native.mysql_next_result(self) == -1
|
181
220
|
|
182
|
-
check_error!("
|
221
|
+
check_error!("Get result")
|
183
222
|
end
|
184
223
|
|
185
224
|
@result = Native.mysql_use_result(self)
|
186
225
|
|
187
226
|
if @result.null?
|
188
|
-
check_error!("
|
227
|
+
check_error!("Get result")
|
189
228
|
|
190
229
|
return nil
|
191
230
|
else
|
192
|
-
return
|
231
|
+
return @result
|
193
232
|
end
|
194
233
|
end
|
195
|
-
|
196
|
-
def affected_rows
|
197
|
-
Native.mysql_affected_rows(self)
|
198
|
-
end
|
199
|
-
|
200
|
-
def insert_id
|
201
|
-
Native.mysql_insert_id(self)
|
202
|
-
end
|
203
|
-
|
204
|
-
def info
|
205
|
-
Native.mysql_info(self)
|
206
|
-
end
|
207
234
|
end
|
208
235
|
end
|
209
236
|
end
|
@@ -25,7 +25,7 @@ require_relative 'types'
|
|
25
25
|
module DB
|
26
26
|
module MariaDB
|
27
27
|
module Native
|
28
|
-
Type = enum(
|
28
|
+
Type = enum(
|
29
29
|
:decimal,
|
30
30
|
:tiny,
|
31
31
|
:short,
|
@@ -98,7 +98,8 @@ module DB
|
|
98
98
|
:flags, :uint,
|
99
99
|
:decimals, :uint,
|
100
100
|
:charsetnr, :uint,
|
101
|
-
:type, Type
|
101
|
+
:type, Type,
|
102
|
+
:extension, :pointer,
|
102
103
|
)
|
103
104
|
|
104
105
|
def name
|
data/lib/db/mariadb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db-mariadb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- lib/db/mariadb.rb
|
118
118
|
- lib/db/mariadb/adapter.rb
|
119
119
|
- lib/db/mariadb/connection.rb
|
120
|
+
- lib/db/mariadb/error.rb
|
120
121
|
- lib/db/mariadb/native.rb
|
121
122
|
- lib/db/mariadb/native/connection.rb
|
122
123
|
- lib/db/mariadb/native/field.rb
|
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
143
|
- !ruby/object:Gem::Version
|
143
144
|
version: '0'
|
144
145
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
146
|
+
rubygems_version: 3.0.3
|
146
147
|
signing_key:
|
147
148
|
specification_version: 4
|
148
149
|
summary: An event-driven interface for MariaDB and MySQL servers.
|