Skip to content

Commit 28a7d66

Browse files
nyaxtjustincase
authored andcommitted
query params encoded correctly
1 parent bcefd29 commit 28a7d66

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

ext/mysql2/statement.c

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,13 @@ static void *nogvl_execute(void *ptr) {
129129
}
130130
}
131131

132-
#define FREE_BINDS \
133-
for (i = 0; i < argc; i++) { \
134-
if (bind_buffers[i].buffer) { \
135-
if (bind_buffers[i].buffer_type == MYSQL_TYPE_STRING) { \
136-
free(bind_buffers[i].length); \
137-
} else { \
138-
free(bind_buffers[i].buffer); \
139-
} \
140-
} \
141-
} \
142-
free(bind_buffers);
132+
#define FREE_BINDS \
133+
for (i = 0; i < argc; i++) { \
134+
if (bind_buffers[i].buffer && NIL_P(params_enc[i])) { \
135+
xfree(bind_buffers[i].buffer); \
136+
} \
137+
} \
138+
xfree(bind_buffers);
143139

144140
/* call-seq: stmt.execute
145141
*
@@ -152,7 +148,18 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
152148
MYSQL_STMT *stmt;
153149
MYSQL_RES *metadata;
154150
VALUE resultObj;
151+
VALUE *params_enc = alloca(sizeof(VALUE) * argc);
152+
unsigned long* length_buffers = NULL;
153+
#ifdef HAVE_RUBY_ENCODING_H
154+
rb_encoding *conn_enc;
155+
#endif
155156
GET_STATEMENT(self);
157+
#ifdef HAVE_RUBY_ENCODING_H
158+
{
159+
GET_CLIENT(stmt_wrapper->client);
160+
conn_enc = rb_to_encoding(wrapper->encoding);
161+
}
162+
#endif
156163

157164
stmt = stmt_wrapper->stmt;
158165

@@ -164,9 +171,11 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
164171
// setup any bind variables in the query
165172
if (bind_count > 0) {
166173
bind_buffers = xcalloc(bind_count, sizeof(MYSQL_BIND));
174+
length_buffers = xcalloc(bind_count, sizeof(unsigned long));
167175

168176
for (i = 0; i < argc; i++) {
169177
bind_buffers[i].buffer = NULL;
178+
params_enc[i] = Qnil;
170179

171180
switch (TYPE(argv[i])) {
172181
case T_NIL:
@@ -194,13 +203,14 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
194203
*(double*)(bind_buffers[i].buffer) = NUM2DBL(argv[i]);
195204
break;
196205
case T_STRING:
197-
// FIXME: convert encoding
198-
bind_buffers[i].buffer_type = MYSQL_TYPE_STRING;
199-
bind_buffers[i].buffer = RSTRING_PTR(argv[i]);
200-
bind_buffers[i].buffer_length = RSTRING_LEN(argv[i]);
201-
unsigned long *len = malloc(sizeof(long));
202-
(*len) = RSTRING_LEN(argv[i]);
203-
bind_buffers[i].length = len;
206+
{
207+
params_enc[i] = rb_str_export_to_enc(argv[i], conn_enc);
208+
bind_buffers[i].buffer_type = MYSQL_TYPE_STRING;
209+
bind_buffers[i].buffer = RSTRING_PTR(params_enc[i]);
210+
bind_buffers[i].buffer_length = RSTRING_LEN(params_enc[i]);
211+
length_buffers[i] = bind_buffers[i].buffer_length;
212+
bind_buffers[i].length = &length_buffers[i];
213+
}
204214
break;
205215
default:
206216
// TODO: what Ruby type should support MYSQL_TYPE_TIME

0 commit comments

Comments
 (0)