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>
This commit is contained in:
parent
9c7fe7c672
commit
8326b95169
@ -308,6 +308,7 @@ def select_rows(sql, name = nil)
|
|||||||
rows
|
rows
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# 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.
|
||||||
def execute(sql, name = nil) #:nodoc:
|
def execute(sql, name = nil) #:nodoc:
|
||||||
log(sql, name) { @connection.query(sql) }
|
log(sql, name) { @connection.query(sql) }
|
||||||
rescue ActiveRecord::StatementInvalid => exception
|
rescue ActiveRecord::StatementInvalid => exception
|
||||||
@ -414,7 +415,9 @@ def collation
|
|||||||
|
|
||||||
def tables(name = nil) #:nodoc:
|
def tables(name = nil) #:nodoc:
|
||||||
tables = []
|
tables = []
|
||||||
execute("SHOW TABLES", name).each { |field| tables << field[0] }
|
result = execute("SHOW TABLES", name)
|
||||||
|
result.each { |field| tables << field[0] }
|
||||||
|
result.free
|
||||||
tables
|
tables
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -425,7 +428,8 @@ def drop_table(table_name, options = {})
|
|||||||
def indexes(table_name, name = nil)#:nodoc:
|
def indexes(table_name, name = nil)#:nodoc:
|
||||||
indexes = []
|
indexes = []
|
||||||
current_index = nil
|
current_index = nil
|
||||||
execute("SHOW KEYS FROM #{quote_table_name(table_name)}", name).each do |row|
|
result = execute("SHOW KEYS FROM #{quote_table_name(table_name)}", name)
|
||||||
|
result.each do |row|
|
||||||
if current_index != row[2]
|
if current_index != row[2]
|
||||||
next if row[2] == "PRIMARY" # skip the primary key
|
next if row[2] == "PRIMARY" # skip the primary key
|
||||||
current_index = row[2]
|
current_index = row[2]
|
||||||
@ -434,13 +438,16 @@ def indexes(table_name, name = nil)#:nodoc:
|
|||||||
|
|
||||||
indexes.last.columns << row[4]
|
indexes.last.columns << row[4]
|
||||||
end
|
end
|
||||||
|
result.free
|
||||||
indexes
|
indexes
|
||||||
end
|
end
|
||||||
|
|
||||||
def columns(table_name, name = nil)#:nodoc:
|
def columns(table_name, name = nil)#:nodoc:
|
||||||
sql = "SHOW FIELDS FROM #{quote_table_name(table_name)}"
|
sql = "SHOW FIELDS FROM #{quote_table_name(table_name)}"
|
||||||
columns = []
|
columns = []
|
||||||
execute(sql, name).each { |field| columns << MysqlColumn.new(field[0], field[4], field[1], field[2] == "YES") }
|
result = execute(sql, name)
|
||||||
|
result.each { |field| columns << MysqlColumn.new(field[0], field[4], field[1], field[2] == "YES") }
|
||||||
|
result.free
|
||||||
columns
|
columns
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -521,9 +528,11 @@ def show_variable(name)
|
|||||||
# Returns a table's primary key and belonging sequence.
|
# Returns a table's primary key and belonging sequence.
|
||||||
def pk_and_sequence_for(table) #:nodoc:
|
def pk_and_sequence_for(table) #:nodoc:
|
||||||
keys = []
|
keys = []
|
||||||
execute("describe #{quote_table_name(table)}").each_hash do |h|
|
result = execute("describe #{quote_table_name(table)}")
|
||||||
|
result.each_hash do |h|
|
||||||
keys << h["Field"]if h["Key"] == "PRI"
|
keys << h["Field"]if h["Key"] == "PRI"
|
||||||
end
|
end
|
||||||
|
result.free
|
||||||
keys.length == 1 ? [keys.first, nil] : nil
|
keys.length == 1 ? [keys.first, nil] : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user