@@ -129,17 +129,13 @@ static void *nogvl_execute(void *ptr) {
129
129
}
130
130
}
131
131
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);
143
139
144
140
/* call-seq: stmt.execute
145
141
*
@@ -152,7 +148,18 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
152
148
MYSQL_STMT * stmt ;
153
149
MYSQL_RES * metadata ;
154
150
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
155
156
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
156
163
157
164
stmt = stmt_wrapper -> stmt ;
158
165
@@ -164,9 +171,11 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
164
171
// setup any bind variables in the query
165
172
if (bind_count > 0 ) {
166
173
bind_buffers = xcalloc (bind_count , sizeof (MYSQL_BIND ));
174
+ length_buffers = xcalloc (bind_count , sizeof (unsigned long ));
167
175
168
176
for (i = 0 ; i < argc ; i ++ ) {
169
177
bind_buffers [i ].buffer = NULL ;
178
+ params_enc [i ] = Qnil ;
170
179
171
180
switch (TYPE (argv [i ])) {
172
181
case T_NIL :
@@ -194,13 +203,14 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
194
203
* (double * )(bind_buffers [i ].buffer ) = NUM2DBL (argv [i ]);
195
204
break ;
196
205
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
+ }
204
214
break ;
205
215
default :
206
216
// TODO: what Ruby type should support MYSQL_TYPE_TIME
0 commit comments