<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/gc_benchmark.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -60,6 +60,7 @@ struct mysql {
     MYSQL handler;
     char connection;
     char query_with_result;
+    char gc_disabled;
     char blocking;
     int async_in_progress;
 };
@@ -181,7 +182,7 @@ static void mysql_raise(MYSQL* m)
     rb_exc_raise(e);
 }
 
-static VALUE mysqlres2obj(MYSQL_RES* res)
+static VALUE mysqlres2obj(MYSQL_RES* res, VALUE gc_disabled)
 {
     VALUE obj;
     struct mysql_res* resp;
@@ -191,8 +192,9 @@ static VALUE mysqlres2obj(MYSQL_RES* res)
     resp-&gt;res = res;
     resp-&gt;freed = Qfalse;
     rb_obj_call_init(obj, 0, NULL);
-    if (++store_result_count &gt; GC_STORE_RESULT_LIMIT)
-	rb_gc();
+    if (++store_result_count &gt; GC_STORE_RESULT_LIMIT &amp;&amp; gc_disabled == Qfalse){
+      rb_gc();
+	}
     return obj;
 }
 
@@ -228,6 +230,7 @@ static VALUE init(VALUE klass)
     mysql_init(&amp;myp-&gt;handler);
     myp-&gt;connection = Qfalse;
     myp-&gt;query_with_result = Qtrue;
+    myp-&gt;gc_disabled = Qfalse;
     rb_obj_call_init(obj, 0, NULL);
     return obj;
 }
@@ -646,7 +649,7 @@ static VALUE list_fields(int argc, VALUE* argv, VALUE obj)
     res = mysql_list_fields(m, StringValuePtr(table), NILorSTRING(field));
     if (res == NULL)
 	mysql_raise(m);
-    return mysqlres2obj(res);
+    return mysqlres2obj(res, GetMysqlStruct(obj)-&gt;gc_disabled);
 }
 
 /*	list_processes()	*/
@@ -656,7 +659,7 @@ static VALUE list_processes(VALUE obj)
     MYSQL_RES* res = mysql_list_processes(m);
     if (res == NULL)
 	mysql_raise(m);
-    return mysqlres2obj(res);
+    return mysqlres2obj(res, GetMysqlStruct(obj)-&gt;gc_disabled);
 }
 
 /*	list_tables(table=nil)	*/
@@ -750,7 +753,7 @@ static VALUE store_result(VALUE obj)
     MYSQL_RES* res = mysql_store_result(m);
     if (res == NULL)
 	mysql_raise(m);
-    return mysqlres2obj(res);
+    return mysqlres2obj(res, GetMysqlStruct(obj)-&gt;gc_disabled);
 }
 
 /*	thread_id()	*/
@@ -766,7 +769,7 @@ static VALUE use_result(VALUE obj)
     MYSQL_RES* res = mysql_use_result(m);
     if (res == NULL)
 	mysql_raise(m);
-    return mysqlres2obj(res);
+    return mysqlres2obj(res, GetMysqlStruct(obj)-&gt;gc_disabled);
 }
 
 static VALUE res_free(VALUE);
@@ -788,7 +791,7 @@ static VALUE query(VALUE obj, VALUE sql)
 		if (mysql_field_count(m) != 0)
 		    mysql_raise(m);
 	    } else {
-		VALUE robj = mysqlres2obj(res);
+		VALUE robj = mysqlres2obj(res, GetMysqlStruct(obj)-&gt;gc_disabled);
 		rb_ensure(rb_yield, robj, res_free, robj);
 	    }
 #if MYSQL_VERSION_ID &gt;= 40101
@@ -859,6 +862,20 @@ static VALUE reconnected( VALUE obj ){
     return ( current_connection_id == mysql_thread_id( m ) ) ? Qfalse : Qtrue;
 }
 
+/* disable_gc(true|false) */
+static VALUE disable_gc_set(VALUE obj, VALUE flag)
+{
+    if (TYPE(flag) != T_TRUE &amp;&amp; TYPE(flag) != T_FALSE)
+        rb_raise(rb_eTypeError, &quot;invalid type, required true or false.&quot;);
+    GetMysqlStruct(obj)-&gt;gc_disabled = flag;
+    return flag;
+}
+
+/* gc_disabled */
+static VALUE gc_disabled( VALUE obj ){
+    return GetMysqlStruct(obj)-&gt;gc_disabled ? Qtrue: Qfalse;  
+}
+
 static void validate_async_query( VALUE obj )
 {
   	MYSQL* m = GetHandler(obj);
@@ -1986,7 +2003,7 @@ static VALUE stmt_result_metadata(VALUE obj)
 	mysql_stmt_raise(s-&gt;stmt);
       return Qnil;
     }
-    return mysqlres2obj(res);
+    return mysqlres2obj(res, Qfalse);
 }
 
 /*	row_seek(offset)	*/
@@ -2254,6 +2271,8 @@ void Init_mysql(void)
     rb_define_method(cMysql, &quot;retry?&quot;, retry, 0);
     rb_define_method(cMysql, &quot;interrupted?&quot;, interrupted, 0);
     rb_define_method(cMysql, &quot;blocking?&quot;, blocking, 0);
+    rb_define_method(cMysql, &quot;gc_disabled?&quot;, gc_disabled, 0);
+    rb_define_method(cMysql, &quot;disable_gc=&quot;, disable_gc_set, 1);
     rb_define_method(cMysql, &quot;socket&quot;, socket, 0);
     rb_define_method(cMysql, &quot;refresh&quot;, refresh, 1);
     rb_define_method(cMysql, &quot;reload&quot;, reload, 0);</diff>
      <filename>ext/mysql.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8e6f300f9db75f07c03049efd00a6b91fe16538d</id>
    </parent>
  </parents>
  <author>
    <name>Lourens Naude</name>
    <email>lourens@methodmissing.com</email>
  </author>
  <url>http://github.com/oldmoe/mysqlplus/commit/35d2545c17f385a9cf524bfea39606524d75c009</url>
  <id>35d2545c17f385a9cf524bfea39606524d75c009</id>
  <committed-date>2008-10-08T14:11:14-07:00</committed-date>
  <authored-date>2008-10-08T14:11:14-07:00</authored-date>
  <message>Selective enable || disable GC for result retrieval with Mysql#disable_gc = true|false</message>
  <tree>fc06dc3c76bbaa2008fe6e263eaa0cb81395a026</tree>
  <committer>
    <name>Lourens Naude</name>
    <email>lourens@methodmissing.com</email>
  </committer>
</commit>
