trilogy 2.6.0 → 2.6.1
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/README.md +1 -2
- data/ext/trilogy-ruby/cext.c +7 -10
- data/ext/trilogy-ruby/extconf.rb +5 -1
- data/ext/trilogy-ruby/src/buffer.c +6 -1
- data/ext/trilogy-ruby/src/socket.c +17 -4
- data/lib/trilogy/error.rb +1 -1
- data/lib/trilogy/version.rb +1 -1
- data/lib/trilogy.rb +3 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d015527cefe1e66b73b4db1d31b98e3db6ab616edb1fb2da947054a55818f338
|
4
|
+
data.tar.gz: 315bdd0e7dabf0f37ed69f5cd0884a702a7502443b1e26e5b01bec90b122e11d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6e50321b8493b6ea8137d534e0fa8eedc5b7388093fee5e910dbe8c6bd81c0e0dc9c8d9c448895096fb8bd0244a0ee65b19b5f580c3b9137c76c9af221f0ab2
|
7
|
+
data.tar.gz: 7d8b81caf8faaadc4ef548ffddab7a73f9b8d4d6ede5a0f9078c6ea65cd195f83bdcacdf5a3d7b71d76503161a689d8ac66b058a4c605a915f9a9dcf4aa56cdd
|
data/README.md
CHANGED
@@ -27,7 +27,6 @@ $ gem install trilogy
|
|
27
27
|
``` ruby
|
28
28
|
client = Trilogy.new(host: "127.0.0.1", port: 3306, username: "root", read_timeout: 2)
|
29
29
|
if client.ping
|
30
|
-
client.query_options[:database_timezone] = :utc
|
31
30
|
client.change_db "mydb"
|
32
31
|
|
33
32
|
result = client.query("SELECT id, created_at FROM users LIMIT 10")
|
@@ -63,7 +62,7 @@ bundle exec rake build
|
|
63
62
|
|
64
63
|
The official Ruby bindings are inside of the canonical trilogy repository itself.
|
65
64
|
|
66
|
-
1. Fork it ( https://github.com/
|
65
|
+
1. Fork it ( https://github.com/trilogy-libraries/trilogy/fork )
|
67
66
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
68
67
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
69
68
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/ext/trilogy-ruby/cext.c
CHANGED
@@ -43,9 +43,7 @@ static void mark_trilogy(void *ptr)
|
|
43
43
|
static void free_trilogy(void *ptr)
|
44
44
|
{
|
45
45
|
struct trilogy_ctx *ctx = ptr;
|
46
|
-
|
47
|
-
trilogy_free(&ctx->conn);
|
48
|
-
}
|
46
|
+
trilogy_free(&ctx->conn);
|
49
47
|
xfree(ptr);
|
50
48
|
}
|
51
49
|
|
@@ -309,6 +307,7 @@ static int try_connect(struct trilogy_ctx *ctx, trilogy_handshake_t *handshake,
|
|
309
307
|
int rc = args.rc;
|
310
308
|
|
311
309
|
if (rc != TRILOGY_OK) {
|
310
|
+
trilogy_sock_close(sock);
|
312
311
|
return rc;
|
313
312
|
}
|
314
313
|
|
@@ -316,8 +315,10 @@ static int try_connect(struct trilogy_ctx *ctx, trilogy_handshake_t *handshake,
|
|
316
315
|
escape the GVL on each wait operation without going through call_without_gvl */
|
317
316
|
sock->wait_cb = _cb_ruby_wait;
|
318
317
|
rc = trilogy_connect_send_socket(&ctx->conn, sock);
|
319
|
-
if (rc < 0)
|
318
|
+
if (rc < 0) {
|
319
|
+
trilogy_sock_close(sock);
|
320
320
|
return rc;
|
321
|
+
}
|
321
322
|
|
322
323
|
while (1) {
|
323
324
|
rc = trilogy_connect_recv(&ctx->conn, handshake);
|
@@ -425,7 +426,7 @@ static void authenticate(struct trilogy_ctx *ctx, trilogy_handshake_t *handshake
|
|
425
426
|
}
|
426
427
|
}
|
427
428
|
|
428
|
-
static VALUE
|
429
|
+
static VALUE rb_trilogy_connect(VALUE self, VALUE encoding, VALUE charset, VALUE opts)
|
429
430
|
{
|
430
431
|
struct trilogy_ctx *ctx = get_ctx(self);
|
431
432
|
trilogy_sockopt_t connopt = {0};
|
@@ -436,7 +437,6 @@ static VALUE rb_trilogy_initialize(VALUE self, VALUE encoding, VALUE charset, VA
|
|
436
437
|
connopt.encoding = NUM2INT(charset);
|
437
438
|
|
438
439
|
Check_Type(opts, T_HASH);
|
439
|
-
rb_ivar_set(self, id_connection_options, opts);
|
440
440
|
|
441
441
|
if ((val = rb_hash_lookup(opts, ID2SYM(id_ssl_mode))) != Qnil) {
|
442
442
|
Check_Type(val, T_FIXNUM);
|
@@ -578,9 +578,6 @@ static VALUE rb_trilogy_initialize(VALUE self, VALUE encoding, VALUE charset, VA
|
|
578
578
|
}
|
579
579
|
|
580
580
|
int rc = try_connect(ctx, &handshake, &connopt);
|
581
|
-
if (rc == TRILOGY_TIMEOUT) {
|
582
|
-
rb_raise(Trilogy_TimeoutError, "trilogy_connect_recv");
|
583
|
-
}
|
584
581
|
if (rc != TRILOGY_OK) {
|
585
582
|
if (connopt.path) {
|
586
583
|
handle_trilogy_error(ctx, rc, "trilogy_connect - unable to connect to %s", connopt.path);
|
@@ -1104,7 +1101,7 @@ RUBY_FUNC_EXPORTED void Init_cext()
|
|
1104
1101
|
VALUE Trilogy = rb_const_get(rb_cObject, rb_intern("Trilogy"));
|
1105
1102
|
rb_define_alloc_func(Trilogy, allocate_trilogy);
|
1106
1103
|
|
1107
|
-
rb_define_private_method(Trilogy, "
|
1104
|
+
rb_define_private_method(Trilogy, "_connect", rb_trilogy_connect, 3);
|
1108
1105
|
rb_define_method(Trilogy, "change_db", rb_trilogy_change_db, 1);
|
1109
1106
|
rb_define_alias(Trilogy, "select_db", "change_db");
|
1110
1107
|
rb_define_method(Trilogy, "query", rb_trilogy_query, 1);
|
data/ext/trilogy-ruby/extconf.rb
CHANGED
@@ -2,8 +2,12 @@ require "mkmf"
|
|
2
2
|
|
3
3
|
# concatenate trilogy library sources to allow the compiler to optimise across
|
4
4
|
# source files
|
5
|
+
|
6
|
+
trilogy_src_dir = File.realpath("src", __dir__)
|
5
7
|
File.binwrite("trilogy.c",
|
6
|
-
Dir["#{
|
8
|
+
Dir["#{trilogy_src_dir}/**/*.c"].map { |src|
|
9
|
+
%{#line 1 "#{src}"\n} + File.binread(src)
|
10
|
+
}.join)
|
7
11
|
|
8
12
|
$objs = %w[trilogy.o cast.o cext.o]
|
9
13
|
$CFLAGS << " -I #{__dir__}/inc -std=gnu99 -fvisibility=hidden"
|
@@ -57,4 +57,9 @@ int trilogy_buffer_putc(trilogy_buffer_t *buffer, uint8_t c)
|
|
57
57
|
return TRILOGY_OK;
|
58
58
|
}
|
59
59
|
|
60
|
-
void trilogy_buffer_free(trilogy_buffer_t *buffer)
|
60
|
+
void trilogy_buffer_free(trilogy_buffer_t *buffer)
|
61
|
+
{
|
62
|
+
free(buffer->buff);
|
63
|
+
buffer->buff = NULL;
|
64
|
+
buffer->len = buffer->cap = 0;
|
65
|
+
}
|
@@ -100,8 +100,15 @@ static int _cb_raw_close(trilogy_sock_t *_sock)
|
|
100
100
|
if (sock->fd != -1) {
|
101
101
|
rc = close(sock->fd);
|
102
102
|
}
|
103
|
+
|
103
104
|
if (sock->addr) {
|
104
|
-
|
105
|
+
if (sock->base.opts.hostname == NULL && sock->base.opts.path != NULL) {
|
106
|
+
/* We created these with calloc so must free them instead of calling freeaddrinfo */
|
107
|
+
free(sock->addr->ai_addr);
|
108
|
+
free(sock->addr);
|
109
|
+
} else {
|
110
|
+
freeaddrinfo(sock->addr);
|
111
|
+
}
|
105
112
|
}
|
106
113
|
|
107
114
|
free(sock->base.opts.hostname);
|
@@ -189,6 +196,7 @@ static int raw_connect_internal(struct trilogy_sock *sock, const struct addrinfo
|
|
189
196
|
{
|
190
197
|
int sockerr;
|
191
198
|
socklen_t sockerr_len = sizeof(sockerr);
|
199
|
+
int rc = TRILOGY_SYSERR;
|
192
200
|
|
193
201
|
sock->fd = socket(ai->ai_family, SOCK_STREAM, ai->ai_protocol);
|
194
202
|
if (sock->fd < 0) {
|
@@ -244,8 +252,8 @@ static int raw_connect_internal(struct trilogy_sock *sock, const struct addrinfo
|
|
244
252
|
}
|
245
253
|
}
|
246
254
|
|
247
|
-
if (trilogy_sock_wait_write((trilogy_sock_t *)sock) < 0) {
|
248
|
-
goto
|
255
|
+
if ((rc = trilogy_sock_wait_write((trilogy_sock_t *)sock)) < 0) {
|
256
|
+
goto failrc;
|
249
257
|
}
|
250
258
|
|
251
259
|
if (getsockopt(sock->fd, SOL_SOCKET, SO_ERROR, &sockerr, &sockerr_len) < 0) {
|
@@ -263,9 +271,11 @@ static int raw_connect_internal(struct trilogy_sock *sock, const struct addrinfo
|
|
263
271
|
return TRILOGY_OK;
|
264
272
|
|
265
273
|
fail:
|
274
|
+
rc = TRILOGY_SYSERR;
|
275
|
+
failrc:
|
266
276
|
close(sock->fd);
|
267
277
|
sock->fd = -1;
|
268
|
-
return
|
278
|
+
return rc;
|
269
279
|
}
|
270
280
|
|
271
281
|
static int _cb_raw_connect(trilogy_sock_t *_sock)
|
@@ -377,6 +387,9 @@ static ssize_t ssl_io_return(struct trilogy_sock *sock, ssize_t ret)
|
|
377
387
|
int rc = SSL_get_error(sock->ssl, (int)ret);
|
378
388
|
if (rc == SSL_ERROR_WANT_WRITE || rc == SSL_ERROR_WANT_READ) {
|
379
389
|
return (ssize_t)TRILOGY_AGAIN;
|
390
|
+
} else if (rc == SSL_ERROR_ZERO_RETURN) {
|
391
|
+
// Server has closed the connection for writing by sending the close_notify alert
|
392
|
+
return (ssize_t)TRILOGY_CLOSED_CONNECTION;
|
380
393
|
} else if (rc == SSL_ERROR_SYSCALL && !ERR_peek_error()) {
|
381
394
|
if (errno == 0) {
|
382
395
|
// On OpenSSL <= 1.1.1, SSL_ERROR_SYSCALL with an errno value
|
data/lib/trilogy/error.rb
CHANGED
@@ -117,7 +117,7 @@ class Trilogy
|
|
117
117
|
include ConnectionError
|
118
118
|
end
|
119
119
|
|
120
|
-
#
|
120
|
+
# Occurs when a socket read or write returns EOF or when an operation is
|
121
121
|
# attempted on a socket which previously encountered an error.
|
122
122
|
class EOFError < BaseConnectionError
|
123
123
|
end
|
data/lib/trilogy/version.rb
CHANGED
data/lib/trilogy.rb
CHANGED
@@ -12,8 +12,10 @@ class Trilogy
|
|
12
12
|
mysql_encoding = options[:encoding] || "utf8mb4"
|
13
13
|
encoding = Trilogy::Encoding.find(mysql_encoding)
|
14
14
|
charset = Trilogy::Encoding.charset(mysql_encoding)
|
15
|
+
@connection_options = options
|
16
|
+
@connected_host = nil
|
15
17
|
|
16
|
-
|
18
|
+
_connect(encoding, charset, options)
|
17
19
|
end
|
18
20
|
|
19
21
|
def connection_options
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trilogy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|