From 9ca5024824bc50375553351c33a29641adaaeb12 Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 21 Nov 2024 15:46:14 +0100 Subject: [PATCH 1/6] Encode column names with encoding of context --- contrib/ruby/ext/trilogy-ruby/cext.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contrib/ruby/ext/trilogy-ruby/cext.c b/contrib/ruby/ext/trilogy-ruby/cext.c index 54dc8168..49659c19 100644 --- a/contrib/ruby/ext/trilogy-ruby/cext.c +++ b/contrib/ruby/ext/trilogy-ruby/cext.c @@ -811,10 +811,12 @@ static VALUE read_query_response(VALUE vargs) } } + rb_encoding *conn_enc = rb_to_encoding(ctx->encoding); + #ifdef HAVE_RB_INTERNED_STR - VALUE column_name = rb_interned_str(column.name, column.name_len); + VALUE column_name = rb_enc_interned_str(column.name, column.name_len, conn_enc); #else - VALUE column_name = rb_str_new(column.name, column.name_len); + VALUE column_name = rb_enc_str_new(column.name, column.name_len, conn_enc); OBJ_FREEZE(column_name); #endif From 9343cd45b5166d821898d545e2f8123faffa776d Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 5 Dec 2024 09:37:24 +0100 Subject: [PATCH 2/6] Use `HAVE_RB_ENC_INTERNED_STR` instead of `HAVE_RB_INTERNED_STR` to check for encoding support --- contrib/ruby/ext/trilogy-ruby/cext.c | 2 +- contrib/ruby/ext/trilogy-ruby/extconf.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/ruby/ext/trilogy-ruby/cext.c b/contrib/ruby/ext/trilogy-ruby/cext.c index 49659c19..a6542a9b 100644 --- a/contrib/ruby/ext/trilogy-ruby/cext.c +++ b/contrib/ruby/ext/trilogy-ruby/cext.c @@ -813,7 +813,7 @@ static VALUE read_query_response(VALUE vargs) rb_encoding *conn_enc = rb_to_encoding(ctx->encoding); -#ifdef HAVE_RB_INTERNED_STR +#ifdef HAVE_RB_ENC_INTERNED_STR VALUE column_name = rb_enc_interned_str(column.name, column.name_len, conn_enc); #else VALUE column_name = rb_enc_str_new(column.name, column.name_len, conn_enc); diff --git a/contrib/ruby/ext/trilogy-ruby/extconf.rb b/contrib/ruby/ext/trilogy-ruby/extconf.rb index f618ef21..b4a4a273 100644 --- a/contrib/ruby/ext/trilogy-ruby/extconf.rb +++ b/contrib/ruby/ext/trilogy-ruby/extconf.rb @@ -17,5 +17,6 @@ have_library("crypto", "CRYPTO_malloc") have_library("ssl", "SSL_new") have_func("rb_interned_str", "ruby.h") +have_func("rb_enc_interned_str", "ruby.h") create_makefile "trilogy/cext" From b55afcf2f0134c21e9513fb16d5a9ea1f8c9149a Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 5 Dec 2024 09:59:49 +0100 Subject: [PATCH 3/6] Move `rb_to_encoding` call out of the loop --- contrib/ruby/ext/trilogy-ruby/cext.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/ruby/ext/trilogy-ruby/cext.c b/contrib/ruby/ext/trilogy-ruby/cext.c index a6542a9b..0348f773 100644 --- a/contrib/ruby/ext/trilogy-ruby/cext.c +++ b/contrib/ruby/ext/trilogy-ruby/cext.c @@ -791,6 +791,8 @@ static VALUE read_query_response(VALUE vargs) VALUE rb_column_info; struct column_info *column_info = ALLOCV_N(struct column_info, rb_column_info, column_count); + rb_encoding *conn_enc = rb_to_encoding(ctx->encoding); + for (uint64_t i = 0; i < column_count; i++) { trilogy_column_t column; @@ -811,8 +813,6 @@ static VALUE read_query_response(VALUE vargs) } } - rb_encoding *conn_enc = rb_to_encoding(ctx->encoding); - #ifdef HAVE_RB_ENC_INTERNED_STR VALUE column_name = rb_enc_interned_str(column.name, column.name_len, conn_enc); #else From 70410b8d8742fb0510404cdeaea290da88718af3 Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 5 Dec 2024 10:52:27 +0100 Subject: [PATCH 4/6] Store `rb_encoding` in `trilogy_ctx` struct --- contrib/ruby/ext/trilogy-ruby/cext.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/ruby/ext/trilogy-ruby/cext.c b/contrib/ruby/ext/trilogy-ruby/cext.c index 0348f773..53c0e105 100644 --- a/contrib/ruby/ext/trilogy-ruby/cext.c +++ b/contrib/ruby/ext/trilogy-ruby/cext.c @@ -32,6 +32,7 @@ struct trilogy_ctx { char server_version[TRILOGY_SERVER_VERSION_SIZE + 1]; unsigned int query_flags; VALUE encoding; + rb_encoding *conn_encoding; }; static void mark_trilogy(void *ptr) @@ -456,6 +457,7 @@ static VALUE rb_trilogy_connect(VALUE self, VALUE encoding, VALUE charset, VALUE RB_OBJ_WRITE(self, &ctx->encoding, encoding); connopt.encoding = NUM2INT(charset); + ctx->conn_encoding = rb_to_encoding(ctx->encoding); Check_Type(opts, T_HASH); @@ -791,8 +793,6 @@ static VALUE read_query_response(VALUE vargs) VALUE rb_column_info; struct column_info *column_info = ALLOCV_N(struct column_info, rb_column_info, column_count); - rb_encoding *conn_enc = rb_to_encoding(ctx->encoding); - for (uint64_t i = 0; i < column_count; i++) { trilogy_column_t column; @@ -814,9 +814,9 @@ static VALUE read_query_response(VALUE vargs) } #ifdef HAVE_RB_ENC_INTERNED_STR - VALUE column_name = rb_enc_interned_str(column.name, column.name_len, conn_enc); + VALUE column_name = rb_enc_interned_str(column.name, column.name_len, ctx->conn_encoding); #else - VALUE column_name = rb_enc_str_new(column.name, column.name_len, conn_enc); + VALUE column_name = rb_enc_str_new(column.name, column.name_len, ctx->conn_encoding); OBJ_FREEZE(column_name); #endif @@ -924,7 +924,7 @@ static VALUE rb_trilogy_query(VALUE self, VALUE query) struct trilogy_ctx *ctx = get_open_ctx(self); StringValue(query); - query = rb_str_export_to_enc(query, rb_to_encoding(ctx->encoding)); + query = rb_str_export_to_enc(query, ctx->conn_encoding); int rc = trilogy_query_send(&ctx->conn, RSTRING_PTR(query), RSTRING_LEN(query)); From 88d6be049bc56ae3c1174e889aa5bf507e64580a Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 5 Dec 2024 11:16:44 +0100 Subject: [PATCH 5/6] Use `rb_encoding *` as type for connection encoding, remove obsolete method calls. --- contrib/ruby/ext/trilogy-ruby/cext.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/contrib/ruby/ext/trilogy-ruby/cext.c b/contrib/ruby/ext/trilogy-ruby/cext.c index 53c0e105..43840fe7 100644 --- a/contrib/ruby/ext/trilogy-ruby/cext.c +++ b/contrib/ruby/ext/trilogy-ruby/cext.c @@ -31,14 +31,12 @@ struct trilogy_ctx { trilogy_conn_t conn; char server_version[TRILOGY_SERVER_VERSION_SIZE + 1]; unsigned int query_flags; - VALUE encoding; - rb_encoding *conn_encoding; + rb_encoding *encoding; }; static void mark_trilogy(void *ptr) { struct trilogy_ctx *ctx = ptr; - rb_gc_mark(ctx->encoding); } static void free_trilogy(void *ptr) @@ -455,9 +453,8 @@ static VALUE rb_trilogy_connect(VALUE self, VALUE encoding, VALUE charset, VALUE trilogy_handshake_t handshake; VALUE val; - RB_OBJ_WRITE(self, &ctx->encoding, encoding); + ctx->encoding = rb_to_encoding(encoding); connopt.encoding = NUM2INT(charset); - ctx->conn_encoding = rb_to_encoding(ctx->encoding); Check_Type(opts, T_HASH); @@ -814,9 +811,9 @@ static VALUE read_query_response(VALUE vargs) } #ifdef HAVE_RB_ENC_INTERNED_STR - VALUE column_name = rb_enc_interned_str(column.name, column.name_len, ctx->conn_encoding); + VALUE column_name = rb_enc_interned_str(column.name, column.name_len, ctx->encoding); #else - VALUE column_name = rb_enc_str_new(column.name, column.name_len, ctx->conn_encoding); + VALUE column_name = rb_enc_str_new(column.name, column.name_len, ctx->encoding); OBJ_FREEZE(column_name); #endif @@ -924,7 +921,7 @@ static VALUE rb_trilogy_query(VALUE self, VALUE query) struct trilogy_ctx *ctx = get_open_ctx(self); StringValue(query); - query = rb_str_export_to_enc(query, ctx->conn_encoding); + query = rb_str_export_to_enc(query, ctx->encoding); int rc = trilogy_query_send(&ctx->conn, RSTRING_PTR(query), RSTRING_LEN(query)); From f84264c425c58c161930043a1387cfcb7c3caeae Mon Sep 17 00:00:00 2001 From: Adrian Hirt <13788379+Adrian-Hirt@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:57:54 +0100 Subject: [PATCH 6/6] Remove obsolete `have_func("rb_interned_str")` call Co-authored-by: Jean Boussier --- contrib/ruby/ext/trilogy-ruby/extconf.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/ruby/ext/trilogy-ruby/extconf.rb b/contrib/ruby/ext/trilogy-ruby/extconf.rb index b4a4a273..d23a96c3 100644 --- a/contrib/ruby/ext/trilogy-ruby/extconf.rb +++ b/contrib/ruby/ext/trilogy-ruby/extconf.rb @@ -16,7 +16,6 @@ have_library("crypto", "CRYPTO_malloc") have_library("ssl", "SSL_new") -have_func("rb_interned_str", "ruby.h") have_func("rb_enc_interned_str", "ruby.h") create_makefile "trilogy/cext"