public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Free MySQL::Result objects after a call to execute [#1416 state:resolved]

No freeing Result objects causes the MySQL driver to free result sets
at undefined times, this can lead to erratic performance in your
application.

Signed-off-by: Frederick Cheung <frederick.cheung@gmail.com>
Manfred (author)
Wed Nov 19 06:17:40 -0800 2008
lifo (committer)
Thu Dec 18 11:19:36 -0800 2008
commit  8326b95169ae6af3b81f5596107fef9db4bcbbb0
tree    269f82deb7a37eb5bf2ea9efc7b9942a832c18ff
parent  9c7fe7c6729bbdde4a22f58e7279463092390330
...
308
309
310
 
311
312
313
...
414
415
416
417
 
 
 
418
419
420
...
425
426
427
428
 
 
429
430
431
...
434
435
436
 
437
438
439
440
441
442
443
 
 
 
444
445
446
...
521
522
523
524
 
 
525
526
 
527
528
529
...
308
309
310
311
312
313
314
...
415
416
417
 
418
419
420
421
422
423
...
428
429
430
 
431
432
433
434
435
...
438
439
440
441
442
443
444
445
446
447
 
448
449
450
451
452
453
...
528
529
530
 
531
532
533
534
535
536
537
538
0
@@ -308,6 +308,7 @@ module ActiveRecord
0
         rows
0
       end
0
 
0
+      # Executes a SQL query and returns a MySQL::Result object. Note that you have to free the Result object after you're done using it.
1
       def execute(sql, name = nil) #:nodoc:
0
         log(sql, name) { @connection.query(sql) }
0
       rescue ActiveRecord::StatementInvalid => exception
0
@@ -414,7 +415,9 @@ module ActiveRecord
0
 
0
       def tables(name = nil) #:nodoc:
0
         tables = []
0
-        execute("SHOW TABLES", name).each { |field| tables << field[0] }
0
+        result = execute("SHOW TABLES", name)
0
+        result.each { |field| tables << field[0] }
0
+        result.free
0
         tables
0
       end
0
 
0
@@ -425,7 +428,8 @@ module ActiveRecord
0
       def indexes(table_name, name = nil)#:nodoc:
0
         indexes = []
0
         current_index = nil
0
-        execute("SHOW KEYS FROM #{quote_table_name(table_name)}", name).each do |row|
0
+        result = execute("SHOW KEYS FROM #{quote_table_name(table_name)}", name)
0
+        result.each do |row|
0
           if current_index != row[2]
0
             next if row[2] == "PRIMARY" # skip the primary key
0
             current_index = row[2]
0
@@ -434,13 +438,16 @@ module ActiveRecord
0
 
0
           indexes.last.columns << row[4]
0
         end
0
+        result.free
0
         indexes
0
       end
0
 
0
       def columns(table_name, name = nil)#:nodoc:
0
         sql = "SHOW FIELDS FROM #{quote_table_name(table_name)}"
0
         columns = []
0
-        execute(sql, name).each { |field| columns << MysqlColumn.new(field[0], field[4], field[1], field[2] == "YES") }
0
+        result = execute(sql, name)
0
+        result.each { |field| columns << MysqlColumn.new(field[0], field[4], field[1], field[2] == "YES") }
0
+        result.free
0
         columns
0
       end
0
 
0
@@ -521,9 +528,11 @@ module ActiveRecord
0
       # Returns a table's primary key and belonging sequence.
0
       def pk_and_sequence_for(table) #:nodoc:
0
         keys = []
0
-        execute("describe #{quote_table_name(table)}").each_hash do |h|
0
+        result = execute("describe #{quote_table_name(table)}")
0
+        result.each_hash do |h|
0
           keys << h["Field"]if h["Key"] == "PRI"
0
         end
0
+        result.free
0
         keys.length == 1 ? [keys.first, nil] : nil
0
       end
0
 

Comments

Remove the “nodoc” comment here?

Manfred Mon Dec 22 01:31:58 -0800 2008

I think all the adapters could use some documentation on database specific issues. Maybe that’s a good christmas vacation project?