提交 8326b951 编写于 作者: M Manfred Stienstra 提交者: Pratik Naik

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: NFrederick Cheung <frederick.cheung@gmail.com>
上级 9c7fe7c6
...@@ -308,6 +308,7 @@ def select_rows(sql, name = nil) ...@@ -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 ...@@ -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 = {}) ...@@ -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: ...@@ -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) ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册