module ActiveRecord::PLSQL::ProcedureMethods::ClassMethods

Public Instance Methods

procedure_method(method, procedure_name = method, options = {}, &block) click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 64
      def procedure_method(method, procedure_name = method, options = {}, &block)
        procedure = if PLSQL::Procedure === procedure_name
          procedure_name
        else
          find_procedure(procedure_name)
        end

        # Raise error if procedure not found
        raise ArgumentError, "Procedure (%s) not found for method (%s)" % [procedure_name, method] unless procedure

        procedure_methods[method] = {procedure: procedure, options: options, block: block}

        unless (instance_methods + private_instance_methods).find {|m| m == method}
          generated_feature_methods.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
            def #{method}(arguments = {}, options = {})
              call_procedure_method(:#{method}, arguments, options)
            end
          RUBY
        end
      end
procedure_methods() click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 60
def procedure_methods
  procedure_methods_cache[self]
end
procedures_arguments() click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 85
def procedures_arguments
  @procedures_arguments ||= Hash.new do |cache, procedure|
    # Always select arguments of first function (overloading not supported)
    cache[procedure] = Hash[ procedure.arguments[0].sort_by {|arg| arg[1][:position]} ]
  end
end
set_create_procedure(procedure, options = {}, &reload_block) click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 25
def set_create_procedure(procedure, options = {}, &reload_block)
  block ||= proc do |record, result|
    case result
    when Hash
      record.id = result.values.first
    when Numeric
      record.id = result
    else
      raise CannotFetchId, "Couldn't fetch primary key from create procedure (%s) result: %s" %
        [procedure, result.inspect]
    end

    reload_block ? reload_block.call(record) : record.reload

    record.instance_variable_set(:@new_record, true)
    record.id
  end

  procedure_method(:create, procedure, options, &block)
  set_create_method {call_procedure_method(:create)}
end
set_destroy_procedure(procedure, options = {}) click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 55
def set_destroy_procedure(procedure, options = {})
  procedure_method(:destroy, procedure, options)
  set_delete_method {call_procedure_method(:destroy)}
end
set_update_procedure(procedure, options = {}) click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 47
def set_update_procedure(procedure, options = {})
  procedure_method(:update, procedure, options) do |record|
    record.reload
    record.id
  end
  set_update_method {call_procedure_method(:update)}
end

Private Instance Methods

find_procedure(procedure_name) click to toggle source
# File lib/active_record/plsql/procedure_methods.rb, line 94
def find_procedure(procedure_name)
  procedure_name = procedure_name.to_s.split('.').compact

  case procedure_name.size
  when 2
    plsql.send(procedure_name[0].to_sym)[procedure_name[1]]
  when 1
    if plsql_package
      plsql_package[procedure_name[0]] || PLSQL::Procedure.find(plsql, procedure_name[0])
    else
      PLSQL::Procedure.find(plsql, procedure_name[0])
    end
  end
end