@@ -19,7 +19,7 @@ extern VALUE mMysql2, cMysql2Error, cMysql2TimeoutError;
1919static VALUE sym_id , sym_version , sym_header_version , sym_async , sym_symbolize_keys , sym_as , sym_array , sym_stream ;
2020static VALUE sym_no_good_index_used , sym_no_index_used , sym_query_was_slow ;
2121static ID intern_brackets , intern_merge , intern_merge_bang , intern_new_with_args ,
22- intern_current_query_options , intern_read_timeout ;
22+ intern_current_query_options , intern_read_timeout , intern_values ;
2323
2424#define REQUIRE_INITIALIZED (wrapper ) \
2525 if (!wrapper->initialized) { \
@@ -166,6 +166,7 @@ static void rb_mysql_client_mark(void * wrapper) {
166166 if (w ) {
167167 rb_gc_mark (w -> encoding );
168168 rb_gc_mark (w -> active_thread );
169+ rb_gc_mark (w -> prepared_statements );
169170 }
170171}
171172
@@ -262,6 +263,14 @@ static VALUE invalidate_fd(int clientfd)
262263}
263264#endif /* _WIN32 */
264265
266+ static int decr_mysql2_stmt_hash (VALUE key , VALUE val , VALUE arg )
267+ {
268+ mysql_client_wrapper * wrapper = (mysql_client_wrapper * )arg ;
269+ VALUE stmt = rb_ivar_get (wrapper -> prepared_statements , key );
270+ // rb_funcall(stmt, rb_intern("close"), 0);
271+ return 0 ;
272+ }
273+
265274static void * nogvl_close (void * ptr ) {
266275 mysql_client_wrapper * wrapper = ptr ;
267276
@@ -303,6 +312,8 @@ void decr_mysql2_client(mysql_client_wrapper *wrapper)
303312 }
304313#endif
305314
315+ // rb_hash_foreach(wrapper->prepared_statements, decr_mysql2_stmt_hash, (VALUE)wrapper);
316+
306317 nogvl_close (wrapper );
307318 xfree (wrapper -> client );
308319 xfree (wrapper );
@@ -315,6 +326,7 @@ static VALUE allocate(VALUE klass) {
315326 obj = Data_Make_Struct (klass , mysql_client_wrapper , rb_mysql_client_mark , rb_mysql_client_free , wrapper );
316327 wrapper -> encoding = Qnil ;
317328 wrapper -> active_thread = Qnil ;
329+ wrapper -> prepared_statements = rb_hash_new ();
318330 wrapper -> automatic_close = 1 ;
319331 wrapper -> server_version = 0 ;
320332 wrapper -> reconnect_enabled = 0 ;
@@ -1371,10 +1383,25 @@ static VALUE initialize_ext(VALUE self) {
13711383 * Create a new prepared statement.
13721384 */
13731385static VALUE rb_mysql_client_prepare_statement (VALUE self , VALUE sql ) {
1386+ VALUE stmt ;
13741387 GET_CLIENT (self );
13751388 REQUIRE_CONNECTED (wrapper );
13761389
1377- return rb_mysql_stmt_new (self , sql );
1390+ stmt = rb_mysql_stmt_new (self , sql );
1391+
1392+ return stmt ;
1393+ }
1394+
1395+ /* call-seq:
1396+ * client.prepared_statements
1397+ *
1398+ * Returns an array of prepared statement objects.
1399+ */
1400+ static VALUE rb_mysql_client_prepared_statements_read (VALUE self ) {
1401+ unsigned long retVal ;
1402+ GET_CLIENT (self );
1403+
1404+ return rb_funcall (wrapper -> prepared_statements , intern_values , 0 );
13781405}
13791406
13801407void init_mysql2_client () {
@@ -1423,6 +1450,7 @@ void init_mysql2_client() {
14231450 rb_define_method (cMysql2Client , "last_id" , rb_mysql_client_last_id , 0 );
14241451 rb_define_method (cMysql2Client , "affected_rows" , rb_mysql_client_affected_rows , 0 );
14251452 rb_define_method (cMysql2Client , "prepare" , rb_mysql_client_prepare_statement , 1 );
1453+ rb_define_method (cMysql2Client , "prepared_statements" , rb_mysql_client_prepared_statements_read , 0 );
14261454 rb_define_method (cMysql2Client , "thread_id" , rb_mysql_client_thread_id , 0 );
14271455 rb_define_method (cMysql2Client , "ping" , rb_mysql_client_ping , 0 );
14281456 rb_define_method (cMysql2Client , "select_db" , rb_mysql_client_select_db , 1 );
@@ -1474,6 +1502,7 @@ void init_mysql2_client() {
14741502 intern_new_with_args = rb_intern ("new_with_args" );
14751503 intern_current_query_options = rb_intern ("@current_query_options" );
14761504 intern_read_timeout = rb_intern ("@read_timeout" );
1505+ intern_values = rb_intern ("values" );
14771506
14781507#ifdef CLIENT_LONG_PASSWORD
14791508 rb_const_set (cMysql2Client , rb_intern ("LONG_PASSWORD" ),
0 commit comments