@@ -6,18 +6,25 @@ defmodule Mongo.Ecto.Connection do
66 alias Mongo.Ecto.NormalizedQuery.CommandQuery
77 alias Mongo.Ecto.NormalizedQuery.CountQuery
88 alias Mongo.Ecto.NormalizedQuery.AggregateQuery
9+ alias Mongo.Query
910
1011 ## Worker
1112
1213 def storage_down ( opts ) do
1314 opts = Keyword . put ( opts , :pool , DBConnection.Connection )
1415
16+ { :ok , pid } = case Application . ensure_started ( :mongodb ) do
17+ :ok -> { :ok , nil }
18+ { :error , reason } -> Mongo.App . start ( nil , nil )
19+ pid -> pid
20+ end
1521 { :ok , conn } = Mongo . start_link ( opts )
1622
1723 try do
1824 Mongo . command! ( conn , dropDatabase: 1 )
1925 :ok
2026 after
27+ if pid , do: Supervisor . stop ( pid )
2128 GenServer . stop ( conn )
2229 end
2330 end
@@ -27,7 +34,8 @@ defmodule Mongo.Ecto.Connection do
2734 def read ( repo , query , opts \\ [ ] )
2835
2936 def read ( repo , % ReadQuery { } = query , opts ) do
30- opts = [ projection: query . projection , sort: query . order ] ++ query . opts ++ opts
37+ projection = Map . put_new ( query . projection , :_id , false )
38+ opts = [ projection: projection , sort: query . order ] ++ query . opts ++ opts
3139 coll = query . coll
3240 query = query . query
3341
@@ -80,8 +88,12 @@ defmodule Mongo.Ecto.Connection do
8088 opts = query . opts ++ opts
8189 query = query . query
8290
83- % { modified_count: n } = query ( repo , :update , [ coll , query , command ] , opts )
84- n
91+ case query ( repo , :update_many , [ coll , query , command ] , opts ) do
92+ { :ok , % Mongo.UpdateResult { modified_count: m } } ->
93+ m
94+ { :error , error } ->
95+ check_constraint_errors ( error )
96+ end
8597 end
8698
8799 def update ( repo , % WriteQuery { } = query , opts ) do
@@ -90,7 +102,7 @@ defmodule Mongo.Ecto.Connection do
90102 opts = query . opts ++ opts
91103 query = query . query
92104
93- case query ( repo , :update , [ coll , query , command ] , opts ) do
105+ case query ( repo , :update_one , [ coll , query , command ] , opts ) do
94106 { :ok , % { modified_count: 1 } } ->
95107 { :ok , [ ] }
96108 { :ok , _ } ->
@@ -111,6 +123,19 @@ defmodule Mongo.Ecto.Connection do
111123 end
112124 end
113125
126+ def insert_all ( repo , % WriteQuery { } = query , opts ) do
127+ coll = query . coll
128+ command = query . command
129+ opts = query . opts ++ opts
130+
131+ case query ( repo , :insert_many , [ coll , command ] , opts ) do
132+ { :ok , % { inserted_ids: ids } } ->
133+ { Enum . count ( ids ) , nil }
134+ { :error , error } ->
135+ check_constraint_errors ( error )
136+ end
137+ end
138+
114139 def command ( repo , % CommandQuery { } = query , opts ) do
115140 command = query . command
116141 opts = query . opts ++ opts
@@ -126,17 +151,21 @@ defmodule Mongo.Ecto.Connection do
126151
127152 defp with_log ( repo , opts ) do
128153 case Keyword . pop ( opts , :log , true ) do
129- { true , opts } -> [ log: & log ( repo , & 1 ) ] ++ opts
154+ { true , opts } -> [ log: & log ( repo , & 1 , opts ) ] ++ opts
130155 { false , opts } -> opts
131156 end
132157 end
133158
134- defp log ( repo , entry ) do
159+ defp log ( repo , entry , opts ) do
135160 % { connection_time: query_time , decode_time: decode_time ,
136- pool_time: queue_time , result: result , query: query , params: params } = entry
161+ pool_time: queue_time , result: result ,
162+ query: query , params: params } = entry
163+ source = Keyword . get ( opts , :source )
164+
137165 repo . __log__ ( % Ecto.LogEntry { query_time: query_time , decode_time: decode_time ,
138166 queue_time: queue_time , result: log_result ( result ) ,
139- params: [ ] , query: & format_query ( & 1 , query , params ) } )
167+ params: [ ] , query: format_query ( query , params ) ,
168+ source: source } )
140169 end
141170
142171 defp log_result ( { :ok , _query , res } ) , do: { :ok , res }
@@ -160,48 +189,66 @@ defmodule Mongo.Ecto.Connection do
160189 end
161190 end
162191
163- alias Mongo.Query
164-
165- # TODO: fix logging
166- defp format_query ( _entry , % Query { action: :command } , [ command ] ) do
192+ defp format_query ( % Query { action: :command } , [ command ] ) do
167193 [ "COMMAND " | inspect ( command ) ]
168194 end
169- defp format_query ( _entry , :insert_one , [ coll , doc , _opts ] ) do
170- [ "INSERT" , format_part ( "coll" , coll ) , format_part ( "document" , doc ) ]
171- end
172- defp format_query ( _entry , :insert_many , [ coll , docs , _opts ] ) do
173- [ "INSERT" , format_part ( "coll " , coll ) , format_part ( "documents" , docs ) ]
195+ defp format_query ( % Query { action: :find , extra: coll } , [ query , projection ] ) do
196+ [ "FIND" ,
197+ format_part ( "coll" , coll ) ,
198+ format_part ( "query" , query ) ,
199+ format_part ( "projection " , projection ) ]
174200 end
175- defp format_query ( _entry , :delete_one , [ coll , filter , _opts ] ) do
176- [ "DELETE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
177- format_part ( "many" , false ) ]
201+ defp format_query ( % Query { action: :insert_one , extra: coll } , [ doc ] ) do
202+ [ "INSERT" ,
203+ format_part ( "coll" , coll ) ,
204+ format_part ( "document" , doc ) ]
178205 end
179- defp format_query ( _entry , :delete_many , [ coll , filter , _opts ] ) do
180- [ "DELETE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
206+ defp format_query ( % Query { action: :insert_many , extra: coll } , docs ) do
207+ [ "INSERT" ,
208+ format_part ( "coll" , coll ) ,
209+ format_part ( "documents" , docs ) ,
181210 format_part ( "many" , true ) ]
182211 end
183- defp format_query ( _entry , :replace_one , [ coll , filter , doc , _opts ] ) do
184- [ "REPLACE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
185- format_part ( "document" , doc ) ]
212+ defp format_query ( % Query { action: :update_one , extra: coll } , [ filter , update ] ) do
213+ [ "UPDATE" ,
214+ format_part ( "coll" , coll ) ,
215+ format_part ( "filter" , filter ) ,
216+ format_part ( "update" , update ) ]
186217 end
187- defp format_query ( _entry , :update_one , [ coll , filter , update , _opts ] ) do
188- [ "UPDATE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
189- format_part ( "update" , update ) , format_part ( "many" , false ) ]
218+ defp format_query ( % Query { action: :update_many , extra: coll } , [ filter , update ] ) do
219+ [ "UPDATE" ,
220+ format_part ( "coll" , coll ) ,
221+ format_part ( "filter" , filter ) ,
222+ format_part ( "update" , update ) ,
223+ format_part ( "many" , true ) ]
190224 end
191- defp format_query ( _entry , :update_many , [ coll , filter , update , _opts ] ) do
192- [ "UPDATE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
193- format_part ( "update" , update ) , format_part ( "many" , true ) ]
225+ defp format_query ( % Query { action: :delete_one , extra: coll } , [ filter ] ) do
226+ [ "DELETE" ,
227+ format_part ( "coll" , coll ) ,
228+ format_part ( "filter" , filter ) ]
194229 end
195- defp format_query ( _entry , :find , [ coll , query , projection , _opts ] ) do
196- [ "FIND" , format_part ( "coll" , coll ) , format_part ( "query" , query ) ,
197- format_part ( "projection" , projection ) ]
230+ defp format_query ( % Query { action: :delete_many , extra: coll } , [ filter ] ) do
231+ [ "DELETE" ,
232+ format_part ( "coll" , coll ) ,
233+ format_part ( "filter" , filter ) ,
234+ format_part ( "many" , true ) ]
198235 end
199- defp format_query ( _entry , :find_rest , [ coll , cursor , _opts ] ) do
236+ defp format_query ( % Query { action: :replace_one , extra: coll } , [ filter , doc ] ) do
237+ [ "REPLACE" , format_part ( "coll" , coll ) , format_part ( "filter" , filter ) ,
238+ format_part ( "document" , doc ) ]
239+ end
240+ defp format_query ( % Query { action: :get_more , extra: coll } , [ cursor ] ) do
200241 [ "GET_MORE" , format_part ( "coll" , coll ) , format_part ( "cursor_id" , cursor ) ]
201242 end
202- defp format_query ( _entry , :kill_cursors , [ cursors , _opts ] ) do
243+ defp format_query ( % Query { action: :get_more , extra: coll } , [ ] ) do
244+ [ "GET_MORE" , format_part ( "coll" , coll ) , format_part ( "cursor_id" , "" ) ]
245+ end
246+ defp format_query ( % Query { action: :kill_cursors , extra: coll } , [ cursors ] ) do
203247 [ "KILL_CURSORS" , format_part ( "cursor_ids" , cursors ) ]
204248 end
249+ defp format_query ( % Query { action: :kill_cursors , extra: coll } , [ ] ) do
250+ [ "KILL_CURSORS" , format_part ( "cursor_ids" , "" ) ]
251+ end
205252
206253 defp format_part ( name , value ) do
207254 [ " " , name , "=" | inspect ( value ) ]
0 commit comments