method

exec_stmt

Importance_0
v3.1.0 - Show latest stable - 0 notes - Class: ActiveRecord::ConnectionAdapters::MysqlAdapter
exec_stmt(sql, name, binds) private

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 845
      def exec_stmt(sql, name, binds)
        cache = {}
        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
          }
        end

        result = yield [cols, stmt]

        stmt.result_metadata.free if cols
        stmt.free_result
        stmt.close if binds.empty?

        result
      end
Register or log in to add new notes.