2
2
3
3
VALUE cMysql2Statement ;
4
4
extern VALUE mMysql2 , cMysql2Error , cBigDecimal , cDateTime , cDate ;
5
- static VALUE sym_stream ;
5
+ static VALUE sym_stream , intern_error_number_eql , intern_sql_state_eql ;
6
+
7
+ #define GET_STATEMENT (self ) \
8
+ mysql_stmt_wrapper *stmt_wrapper; \
9
+ Data_Get_Struct(self, mysql_stmt_wrapper, stmt_wrapper);
10
+
6
11
7
12
static void rb_mysql_stmt_mark (void * ptr ) {
8
13
mysql_stmt_wrapper * stmt_wrapper = (mysql_stmt_wrapper * )ptr ;
@@ -19,6 +24,49 @@ static void rb_mysql_stmt_free(void * ptr) {
19
24
xfree (ptr );
20
25
}
21
26
27
+ VALUE rb_raise_mysql2_stmt_error2 (MYSQL_STMT * stmt
28
+ #ifdef HAVE_RUBY_ENCODING_H
29
+ , rb_encoding * conn_enc
30
+ #endif
31
+ ) {
32
+ VALUE rb_error_msg = rb_str_new2 (mysql_stmt_error (stmt ));
33
+ VALUE rb_sql_state = rb_tainted_str_new2 (mysql_stmt_sqlstate (stmt ));
34
+ #ifdef HAVE_RUBY_ENCODING_H
35
+ rb_encoding * default_internal_enc = rb_default_internal_encoding ();
36
+
37
+ rb_enc_associate (rb_error_msg , conn_enc );
38
+ rb_enc_associate (rb_sql_state , conn_enc );
39
+ if (default_internal_enc ) {
40
+ rb_error_msg = rb_str_export_to_enc (rb_error_msg , default_internal_enc );
41
+ rb_sql_state = rb_str_export_to_enc (rb_sql_state , default_internal_enc );
42
+ }
43
+ #endif
44
+
45
+ VALUE e = rb_exc_new3 (cMysql2Error , rb_error_msg );
46
+ rb_funcall (e , intern_error_number_eql , 1 , UINT2NUM (mysql_stmt_errno (stmt )));
47
+ rb_funcall (e , intern_sql_state_eql , 1 , rb_sql_state );
48
+ rb_exc_raise (e );
49
+ return Qnil ;
50
+ }
51
+
52
+ static void rb_raise_mysql2_stmt_error (VALUE self ) {
53
+ #ifdef HAVE_RUBY_ENCODING_H
54
+ rb_encoding * conn_enc ;
55
+ #endif
56
+ GET_STATEMENT (self );
57
+ {
58
+ GET_CLIENT (stmt_wrapper -> client );
59
+ conn_enc = rb_to_encoding (wrapper -> encoding );
60
+ }
61
+
62
+ rb_raise_mysql2_stmt_error2 (stmt_wrapper -> stmt
63
+ #ifdef HAVE_RUBY_ENCODING_H
64
+ , conn_enc
65
+ #endif
66
+ );
67
+ }
68
+
69
+
22
70
/*
23
71
* used to pass all arguments to mysql_stmt_prepare while inside
24
72
* nogvl_prepare_statement_args
@@ -88,18 +136,13 @@ VALUE rb_mysql_stmt_new(VALUE rb_client, VALUE sql) {
88
136
args .sql_len = RSTRING_LEN (sql );
89
137
90
138
if ((VALUE )rb_thread_call_without_gvl (nogvl_prepare_statement , & args , RUBY_UBF_IO , 0 ) == Qfalse ) {
91
- rb_raise ( cMysql2Error , "%s" , mysql_stmt_error ( stmt_wrapper -> stmt ) );
139
+ rb_raise_mysql2_stmt_error ( rb_stmt );
92
140
}
93
141
}
94
142
95
143
return rb_stmt ;
96
144
}
97
145
98
- #define GET_STATEMENT (self ) \
99
- mysql_stmt_wrapper *stmt_wrapper; \
100
- Data_Get_Struct(self, mysql_stmt_wrapper, stmt_wrapper)
101
-
102
-
103
146
/* call-seq: stmt.param_count # => Numeric
104
147
*
105
148
* Returns the number of parameters the prepared statement expects.
@@ -275,13 +318,13 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
275
318
// copies bind_buffers into internal storage
276
319
if (mysql_stmt_bind_param (stmt , bind_buffers )) {
277
320
FREE_BINDS ;
278
- rb_raise ( cMysql2Error , "%s" , mysql_stmt_error ( stmt ) );
321
+ rb_raise_mysql2_stmt_error ( self );
279
322
}
280
323
}
281
324
282
325
if ((VALUE )rb_thread_call_without_gvl (nogvl_execute , stmt , RUBY_UBF_IO , 0 ) == Qfalse ) {
283
326
FREE_BINDS ;
284
- rb_raise ( cMysql2Error , "%s" , mysql_stmt_error ( stmt ) );
327
+ rb_raise_mysql2_stmt_error ( self );
285
328
}
286
329
287
330
FREE_BINDS ;
@@ -292,7 +335,7 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
292
335
// either CR_OUT_OF_MEMORY or CR_UNKNOWN_ERROR. both fatal.
293
336
294
337
MARK_CONN_INACTIVE (stmt_wrapper -> client );
295
- rb_raise ( cMysql2Error , "%s" , mysql_stmt_error ( stmt ) );
338
+ rb_raise_mysql2_stmt_error ( self );
296
339
}
297
340
// no data and no error, so query was not a SELECT
298
341
return Qnil ;
@@ -307,7 +350,7 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
307
350
} else {
308
351
// recieve the whole result set from the server
309
352
if (rb_thread_call_without_gvl (nogvl_stmt_store_result , stmt , RUBY_UBF_IO , 0 ) == Qfalse ) {
310
- rb_raise ( cMysql2Error , "%s" , mysql_stmt_error ( stmt ) );
353
+ rb_raise_mysql2_stmt_error ( self );
311
354
}
312
355
MARK_CONN_INACTIVE (stmt_wrapper -> client );
313
356
}
@@ -384,4 +427,7 @@ void init_mysql2_statement() {
384
427
rb_define_method (cMysql2Statement , "fields" , fields , 0 );
385
428
386
429
sym_stream = ID2SYM (rb_intern ("stream" ));
430
+
431
+ intern_error_number_eql = rb_intern ("error_number=" );
432
+ intern_sql_state_eql = rb_intern ("sql_state=" );
387
433
}
0 commit comments