class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
Public Instance Methods
execute_stored_procedure(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 63 def execute_stored_procedure(sp) call_results = execute(stored_procedure_to_sql(sp)) clnt = instance_variable_get(:@connection) while clnt.next_result if result_array = clnt.store_result.to_a[0] sp_out_params(sp).length != 0 sp_out_params(sp).each_with_index do |param,i| sp.__send__ "#{param.name}=", result_array[i] end end end call_results end
stored_procedure_params(param_list,collation)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 32 def stored_procedure_params(param_list,collation) params = [] param_list = param_list.to_s.split("\n").collect{ |r| r.gsub(/\s+/, ' ').strip.split(" ")} param_list.delete([]) param_list.each do |param| param_type = param[0].upcase field_name = param[1].to_s.underscore #set_field_encoding(param[1]) sql_type = param[2] if ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR > 1 cast_type = lookup_cast_type(sql_type) column = new_column(field_name, nil, cast_type, sql_type, true, collation, nil) else column = new_column(field_name, nil, sql_type, false, collation) end column.param_type = param_type params << column end params end
stored_procedure_to_sql(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 54 def stored_procedure_to_sql(sp) sql = [] sql << sp_inout_sql(sp) sql << sp_call_sql(sp) sql << sp_out_sql(sp) sql.compact! sql.join("\n") end
Private Instance Methods
sp_call_sql(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 117 def sp_call_sql(sp) "CALL #{sp.class.stored_procedure[:db]}.#{sp.class.stored_procedure[:specific_name]}(#{sp_in_params(sp).join(',')});" end
sp_in_params(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 81 def sp_in_params(sp) prms = [] sp.class.stored_procedure[:param_list].each do |param| if param.param_type == "IN" prms << quote(sp.read_attribute(param.name)) else # OUT prms << "@#{param.name}" end end prms end
sp_inout_params(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 97 def sp_inout_params(sp) sp.class.stored_procedure[:param_list].select { |param| param.param_type.to_s =~ /inout/i } end
sp_inout_sql(sp)
click to toggle source
In MySQL even with multi-statements flag set, variables must be set 1 at a time, so return an array
# File lib/spare/mysql_abstract_adapter.rb, line 109 def sp_inout_sql(sp) sql = [] sp_inout_params(sp).each do |param| sql << "SET @#{param.name} = #{quote(sp.send(param.name))};" end sql end
sp_out_params(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 93 def sp_out_params(sp) sp.class.stored_procedure[:param_list].select { |param| param.param_type.to_s =~ /out/i } end
sp_out_sql(sp)
click to toggle source
# File lib/spare/mysql_abstract_adapter.rb, line 101 def sp_out_sql(sp) out_vars = sp_out_params(sp).map{|param| "@#{param.name}"}.join(',') if !out_vars.blank? "SELECT #{sp_out_params(sp).map{|param| "@#{param.name}"}.join(',')};" end end