def adapter_class(master_connection)
adapter_class_name = master_connection.adapter_name.classify
return const_get(adapter_class_name) if const_defined?(adapter_class_name, false)
read_only_methods = [:select, :select_rows, :execute, :tables, :columns]
clear_cache_methods = [:insert, :update, :delete]
master_methods = []
override_classes = (master_connection.class.ancestors - AbstractAdapter.ancestors)
override_classes.each do |connection_class|
master_methods.concat(connection_class.public_instance_methods(false))
master_methods.concat(connection_class.protected_instance_methods(false))
end
master_methods = master_methods.collect{|m| m.to_sym}.uniq
master_methods -= public_instance_methods(false) + protected_instance_methods(false) + private_instance_methods(false)
master_methods -= read_only_methods
master_methods -= [:select_all, :select_one, :select_value, :select_values]
master_methods -= clear_cache_methods
klass = Class.new(self)
master_methods.each do |method_name|
klass.class_eval "def \#{method_name}(*args, &block)\nuse_master_connection do\nreturn proxy_connection_method(master_connection, :\#{method_name}, :master, *args, &block)\nend\nend\n", __FILE__, __LINE__ + 1
end
clear_cache_methods.each do |method_name|
klass.class_eval "def \#{method_name}(*args, &block)\nclear_query_cache if query_cache_enabled\nuse_master_connection do\nreturn proxy_connection_method(master_connection, :\#{method_name}, :master, *args, &block)\nend\nend\n", __FILE__, __LINE__ + 1
end
read_only_methods.each do |method_name|
klass.class_eval "def \#{method_name}(*args, &block)\nconnection = @use_master ? master_connection : current_read_connection\nproxy_connection_method(connection, :\#{method_name}, :read, *args, &block)\nend\n", __FILE__, __LINE__ + 1
end
klass.send :protected, :select
const_set(adapter_class_name, klass)
return klass
end