method
exec_stmt
v4.0.2 -
Show latest stable
- Class:
ActiveRecord::ConnectionAdapters::MysqlAdapter
exec_stmt(sql, name, binds)private
No documentation available.
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 477
def exec_stmt(sql, name, binds)
cache = {}
log(sql, name, binds) do
if binds.empty?
stmt = @connection.prepare(sql)
else
cache = @statements[sql] ||= {
:stmt => @connection.prepare(sql)
}
stmt = cache[:stmt]
end
begin
stmt.execute(*binds.map { |col, val| type_cast(val, col) })
rescue Mysql::Error => e
# Older versions of MySQL leave the prepared statement in a bad
# place when an error occurs. To support older mysql versions, we
# need to close the statement and delete the statement from the
# cache.
stmt.close
@statements.delete sql
raise e
end
cols = nil
if metadata = stmt.result_metadata
cols = cache[:cols] ||= metadata.fetch_fields.map { |field|
field.name
}
metadata.free
end
result_set = ActiveRecord::Result.new(cols, stmt.to_a) if cols
affected_rows = stmt.affected_rows
stmt.free_result
stmt.close if binds.empty?
[result_set, affected_rows]
end
end