@@ -50,7 +50,7 @@ defmodule Mongo.MongoDBConnection do
50
50
result =
51
51
with { :ok , state } <- tcp_connect ( opts , state ) ,
52
52
{ :ok , state } <- maybe_ssl ( opts , state ) ,
53
- { :ok , state } <- wire_version ( state ) ,
53
+ { :ok , state } <- hand_shake ( opts , state ) ,
54
54
{ :ok , state } <- maybe_auth ( opts , state ) do
55
55
{ :ok , state }
56
56
end
@@ -117,21 +117,64 @@ defmodule Mongo.MongoDBConnection do
117
117
end
118
118
end
119
119
120
- defp wire_version ( state ) do
120
+ defp wire_version ( state , client \\ nil ) do
121
121
# wire version
122
122
# https://github.com/mongodb/mongo/blob/master/src/mongo/db/wire_version.h
123
- case Utils . command ( - 1 , [ ismaster: 1 ] , state ) do
123
+
124
+ cmd = [ ismaster: 1 , client: client ] |> filter_nils ( )
125
+
126
+ case Utils . command ( - 1 , cmd , state ) do
124
127
{ :ok , % { "ok" => ok , "maxWireVersion" => version } = response } when ok == 1 -> { :ok , % { update_limits ( state , response ) | wire_version: version } }
125
128
{ :ok , % { "ok" => ok } } when ok == 1 -> { :ok , % { state | wire_version: 0 } }
126
129
{ :ok , % { "ok" => ok , "errmsg" => msg , "code" => code } } when ok == 0 ->
127
130
err = Mongo.Error . exception ( message: msg , code: code )
128
131
{ :disconnect , err , state }
129
132
{ :disconnect , _ , _ } = error -> error
130
133
end
134
+ end
131
135
136
+ defp hand_shake ( opts , state ) do
137
+ wire_version ( state , driver ( opts [ :appname ] || "My killer app" ) )
138
+ end
139
+
140
+ defp driver ( appname ) do
141
+
142
+ driver_version = case :application . get_key ( :mongodb_driver , :vsn ) do
143
+ { :ok , version } -> to_string ( version )
144
+ _ -> "??"
145
+ end
132
146
147
+ [ architecture , name | _rest ] = String . split ( to_string ( :erlang . system_info ( :system_architecture ) ) , "-" )
148
+
149
+ version = case :os . version ( ) do
150
+ { one , two , tree } -> to_string ( one ) <> "." <> to_string ( two ) <> "." <> to_string ( tree )
151
+ s -> s
152
+ end
153
+
154
+ plattform = "Elixir (" <> System . version ( ) <> "), Erlang/OTP (" <> to_string ( :erlang . system_info ( :otp_release ) ) <> "), ERTS (" <> to_string ( :erlang . system_info ( :version ) ) <> ")"
155
+
156
+ type = elem ( :os . type ( ) , 1 )
157
+ % {
158
+ client: % {
159
+ application: % { name: appname }
160
+ } ,
161
+ driver: % {
162
+ name: "mongodb_driver" ,
163
+ version: driver_version
164
+ } ,
165
+ os: % {
166
+ type: type ,
167
+ name: pretty_name ( name ) ,
168
+ architecture: architecture ,
169
+ version: version
170
+ } ,
171
+ platform: plattform
172
+ }
133
173
end
134
174
175
+ defp pretty_name ( "apple" ) , do: "Mac OS X"
176
+ defp pretty_name ( name ) , do: name
177
+
135
178
##
136
179
#
137
180
# Updates the limits from the isMaster response:
@@ -239,5 +282,8 @@ defmodule Mongo.MongoDBConnection do
239
282
end )
240
283
end
241
284
285
+ defp filter_nils ( keyword ) when is_list ( keyword ) do
286
+ Enum . reject ( keyword , fn { _key , value } -> is_nil ( value ) end )
287
+ end
242
288
243
289
end
0 commit comments