@@ -50,6 +50,45 @@ defmodule Ecto.Repo.Schema do
5050 { count , postprocess ( rows , fields , adapter , schema , source ) }
5151 end
5252
53+ @ doc """
54+ Implementation for `Ecto.Repo.start_consumer/2`.
55+ """
56+ def start_consumer ( repo , adapter , schema , opts ) when is_atom ( schema ) do
57+ start_consumer ( repo , adapter , schema , schema . __schema__ ( :prefix ) ,
58+ schema . __schema__ ( :source ) , opts )
59+ end
60+
61+ def start_consumer ( repo , adapter , table , opts ) when is_binary ( table ) do
62+ start_consumer ( repo , adapter , nil , nil , table , opts )
63+ end
64+
65+ def start_consumer ( repo , adapter , { source , schema } , opts ) when is_atom ( schema ) do
66+ start_consumer ( repo , adapter , schema , schema . __schema__ ( :prefix ) , source , opts )
67+ end
68+
69+ defp start_consumer ( repo , adapter , schema , prefix , source , opts ) do
70+ returning = opts [ :returning ] || false
71+ autogen = schema && schema . __schema__ ( :autogenerate_id )
72+ source = { Keyword . get ( opts , :prefix , prefix ) , source }
73+ fields = preprocess ( returning , schema )
74+
75+ insert_all = fn ( rows ) ->
76+ { rows , header } = extract_header_and_fields ( rows , schema , autogen , adapter )
77+ counter = fn -> Enum . reduce ( rows , 0 , & length ( & 1 ) + & 2 ) end
78+ metadata = % { source: source , context: nil , schema: schema , autogenerate_id: autogen }
79+
80+ { on_conflict , opts } = Keyword . pop ( opts , :on_conflict , :raise )
81+ { conflict_target , opts } = Keyword . pop ( opts , :conflict_target , [ ] )
82+ on_conflict = on_conflict ( on_conflict , conflict_target , metadata , counter , adapter )
83+
84+ { count , _ } =
85+ adapter . insert_all ( repo , metadata , Map . keys ( header ) , rows , on_conflict , fields || [ ] , opts )
86+ count
87+ end
88+
89+ adapter . start_consumer ( repo , insert_all , opts )
90+ end
91+
5392 defp preprocess ( [ _ | _ ] = fields , _schema ) ,
5493 do: fields
5594 defp preprocess ( [ ] , _schema ) ,
0 commit comments