class ActionCost::SqlParser

Constants

VALID_OPERATIONS

Attributes

invalid[R]
join_tables[R]
operation[R]
table_name[R]

Public Class Methods

new(sql) click to toggle source
# File lib/action_cost/sql_parser.rb, line 7
def initialize(sql)
  @invalid  = false
  @sql      = sql
  @join_tables = []
end

Public Instance Methods

log() click to toggle source
# File lib/action_cost/sql_parser.rb, line 38
def log
  if @invalid
    Rails.logger.debug "action_cost: non parsable query"
  else
    Rails.logger.debug "action_cost: operation=#{@operation} table_name=#{@table_name} " +
                       "join_tables=#{@join_tables.inspect}"
  end
end
parse() click to toggle source
# File lib/action_cost/sql_parser.rb, line 13
def parse
  if @sql =~ /^\s*(\w+)/
    op = $1.downcase
    unless VALID_OPERATIONS.include?(op)
      Rails.logger.error "action_cost: unknown operation [#{op}]"
      @invalid = true
      return false
    end
    @operation = op
  else
    Rails.logger.error "action_cost: could not parse [#{@sql}]"
    @invalid = true
    return false
  end

  case @operation
  when 'select' then parse_select
  when 'insert' then parse_insert
  when 'update' then parse_update
  when 'delete' then parse_delete
  end

  return !@invalid
end

Private Instance Methods

parse_delete() click to toggle source
# File lib/action_cost/sql_parser.rb, line 80
def parse_delete
  if @sql =~ /^delete from ["`']?(\w+)["`']?\b/
    @table_name = $1.downcase
  else
    @invalid = true
  end
end
parse_insert() click to toggle source
# File lib/action_cost/sql_parser.rb, line 64
def parse_insert
  if @sql =~ /insert into ["`']?(\w+)["`']?\b/i
    @table_name = $1.downcase
  else
    @invalid = true
  end
end
parse_select() click to toggle source
# File lib/action_cost/sql_parser.rb, line 49
def parse_select
  if @sql =~ /from ["`']?(\w+)["`']?\b/i
    @table_name = $1.downcase
  else
    @invalid = true
    return
  end

  @sql.scan(/join ["`']?(\w+)["`']?\b/i) do |arr|
    arr.each do |t|
      @join_tables << t.downcase
    end
  end
end
parse_update() click to toggle source
# File lib/action_cost/sql_parser.rb, line 72
def parse_update
  if @sql =~ /^update ["`']?(\w+)["`']?\b/i
    @table_name = $1.downcase
  else
    @invalid = true
  end
end