Module: ActiveRecord::PLSQL::ProcedureMethods::ClassMethods

Defined in:
lib/active_record/plsql/procedure_methods.rb

Instance Method Summary collapse

Instance Method Details

#procedure_method(method, procedure_name = method, options = {}, &block) ⇒ Object

Raises:

  • (ArgumentError)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 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_methodsObject



60
61
62
# File 'lib/active_record/plsql/procedure_methods.rb', line 60

def procedure_methods
  procedure_methods_cache[self]
end

#procedures_argumentsObject



85
86
87
88
89
90
# 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) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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 = {}) ⇒ Object



55
56
57
58
# 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 = {}) ⇒ Object



47
48
49
50
51
52
53
# 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