module BarkestCore::ConnectionAdapterExtensions

Adds some helper methods to connection adapters.

Public Instance Methods

exec_sp(stmt) click to toggle source

Executes a stored procedure.

For MS SQL Server, this will return the return value from the procedure. For other providers, this is the same as execute.

# File lib/barkest_core/extensions/active_record_extensions.rb, line 37
def exec_sp(stmt)
  klass = self.class.name
  if klass == 'ActiveRecord::ConnectionAdapters::SQLServerAdapter'
    rex = /^exec(?:ute)?\s+[\["]?(?<PROC>[a-z][a-z0-9_]*)[\]"]?(?<ARGS>\s.*)?$/i
    match = rex.match(stmt)
    if match
      exec_query("DECLARE @RET INTEGER; EXECUTE @RET=[#{match['PROC']}]#{match['ARGS']}; SELECT @RET AS [RET]").first['RET']
    else
      execute stmt
    end
  else
    execute stmt
  end
end
object_exists?(object_name) click to toggle source

Searches the database to determine if an object with the specified name exists.

# File lib/barkest_core/extensions/active_record_extensions.rb, line 11
def object_exists?(object_name)
  safe_name = "'#{object_name.gsub('\'','\'\'')}'"
  klass = self.class.name

  sql =
      if klass == 'ActiveRecord::ConnectionAdapters::SQLServerAdapter'
        # use sysobjects table.
        "SELECT COUNT(*) AS \"one\" FROM \"sysobjects\" WHERE \"name\"=#{safe_name}"
      elsif klass == 'ActiveRecord::ConnectionAdapters::SQLite3Adapter'
        # use sqlite_master table.
        "SELECT COUNT(*) AS \"one\" FROM \"sqlite_master\" WHERE (\"type\"='table' OR \"type\"='view') AND (\"name\"=#{safe_name})"
      else
        # query the information_schema TABLES and ROUTINES views.
        "SELECT SUM(Z.\"one\") AS \"one\" FROM (SELECT COUNT(*) AS \"one\" FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=#{safe_name} UNION SELECT COUNT(*) AS \"one\" FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME=#{safe_name}) AS Z"
      end

  result = exec_query(sql).first

  result && result['one'] >= 1
end