class Sqreen::CBTree

Public Class Methods

new() click to toggle source

Callbacks tree: class methods position

# File lib/sqreen/cb_tree.rb, line 16
def initialize
  @by_class = {}
end

Public Instance Methods

add(cb) click to toggle source
# File lib/sqreen/cb_tree.rb, line 20
def add(cb)
  @by_class[cb.klass] = {} unless @by_class[cb.klass]

  cb_klass = @by_class[cb.klass]
  cb_klass[cb.method] ||= [nil, nil, nil]

  methods = cb_klass[cb.method]

  if cb.pre?
    methods[0] ||= []
    add_to_array(methods[0], cb)
  end
  if cb.post?
    methods[1] ||= []
    add_to_array(methods[1], cb)
  end
  if cb.failing? # rubocop:disable Style/GuardClause
    methods[2] ||= []
    add_to_array(methods[2], cb)
  end
end
each() { |cb| ... } click to toggle source
# File lib/sqreen/cb_tree.rb, line 81
def each
  @by_class.each_value do |values|
    values.each_value do |cbs|
      cbs.each do |cb_ary|
        next unless cb_ary
        cb_ary.each do |cb|
          yield cb
        end
      end
    end
  end
end
get(klass, method) click to toggle source
# File lib/sqreen/cb_tree.rb, line 61
def get(klass, method)
  k = @by_class[klass]
  unless k
    Sqreen.log.debug { format('Error: no cb registered for class %s (%s)', klass.inspect, klass.class) }
    Sqreen.log.debug { inspect }
    return [nil, nil, nil]
  end
  cbs = k[method]
  unless cbs
    Sqreen.log.debug { format('Error: no cbs registered for method %s.%s', klass, method) }
    Sqreen.log.debug { inspect }
    return [nil, nil, nil]
  end
  cbs
rescue StandardError => e
  Sqreen.log.warn "we catched an exception getting cbs: #{e.inspect}"
  Sqreen::RemoteException.record(e)
  [nil, nil, nil]
end
remove(cb) click to toggle source
# File lib/sqreen/cb_tree.rb, line 42
def remove(cb)
  by_meth = @by_class[cb.klass]
  return unless by_meth
  types = by_meth[cb.method]

  if cb.pre? && types[0]
    types[0].delete(cb)
    types[0] = nil if types[0].empty?
  end
  if cb.post? && types[1]
    types[1].delete(cb)
    types[1] = nil if types[1].empty?
  end
  if cb.failing? && types[2] # rubocop:disable Style/GuardClause
    types[2].delete(cb)
    types[2] = nil if types[2].empty?
  end
end

Private Instance Methods

add_to_array(arr, cb) click to toggle source
# File lib/sqreen/cb_tree.rb, line 96
def add_to_array(arr, cb)
  # find last element with prio equal or smaller; insert after
  pos = arr.size
  arr.reverse_each do |arr_cb|
    break if arr_cb.priority <= cb.priority
    pos -= 1
  end

  arr.insert(pos, cb)
end