Просмотр исходного кода

Default port 0 for unix socket

Also add a test case using unix socket (#116)
Jan Uhlig 6 лет назад
Родитель
Сommit
b41a193ada
3 измененных файлов с 45 добавлено и 3 удалено
  1. 4 2
      src/mysql.erl
  2. 7 1
      src/mysql_conn.erl
  3. 34 0
      test/mysql_tests.erl

+ 4 - 2
src/mysql.erl

@@ -76,9 +76,11 @@
 %%       name. For details see the documentation for the first argument of
 %%       gen_server:start_link/4.</dd>
 %%   <dt>`{host, Host}'</dt>
-%%   <dd>Hostname of the MySQL database; default `"localhost"'.</dd>
+%%   <dd>Hostname of the MySQL database. Since OTP version 19, it is also
+%%       possible to specify a local (Unix) Socket by specifying
+%%       `{local, SocketFile}'. Default `"localhost"'.</dd>
 %%   <dt>`{port, Port}'</dt>
-%%   <dd>Port; default 3306 if omitted.</dd>
+%%   <dd>Port; default 3306 for non-local or 0 for local (Unix) sockets.</dd>
 %%   <dt>`{user, User}'</dt>
 %%   <dd>Username.</dd>
 %%   <dt>`{password, Password}'</dt>

+ 7 - 1
src/mysql_conn.erl

@@ -61,7 +61,13 @@
 init(Opts) ->
     %% Connect
     Host           = proplists:get_value(host, Opts, ?default_host),
-    Port           = proplists:get_value(port, Opts, ?default_port),
+
+    DefaultPort = case Host of
+        {local, _LocalAddr} -> 0;
+        _NonLocalAddr -> ?default_port
+    end,
+    Port           = proplists:get_value(port, Opts, DefaultPort),
+
     User           = proplists:get_value(user, Opts, ?default_user),
     Password       = proplists:get_value(password, Opts, ?default_password),
     Database       = proplists:get_value(database, Opts, undefined),

+ 34 - 0
test/mysql_tests.erl

@@ -173,6 +173,40 @@ keep_alive_test() ->
      ?assertMatch({crash_report, _}, LoggedReport),
      ?assertExit(noproc, mysql:stop(Pid)).
 
+unix_socket_test() ->
+    try
+        list_to_integer(erlang:system_info(otp_release))
+    of
+        %% Supported in OTP >= 19
+        OtpRelease when OtpRelease >= 19 ->
+            %% Get socket file to use
+            {ok, Pid1} = mysql:start_link([{user, ?user},
+                                           {password, ?password}]),
+            {ok, [<<"@@socket">>], [SockFile]} = mysql:query(Pid1,
+                                                             "SELECT @@socket"),
+            mysql:stop(Pid1),
+            %% Connect through unix socket
+            case mysql:start_link([{host, {local, SockFile}},
+                                   {user, ?user}, {password, ?password}]) of
+                {ok, Pid2} ->
+                    ?assertEqual({ok, [<<"1">>], [[1]]},
+                                 mysql:query(Pid2, <<"SELECT 1">>)),
+                    mysql:stop(Pid2);
+                {error, eafnosupport} ->
+                    error_logger:info_msg("Skipping unix socket test. "
+                                          "Not supported on this OS.~n")
+            end;
+        OtpRelease ->
+            error_logger:info_msg("Skipping unix socket test. Current OTP "
+                                  "release is ~B. Required release is >= 19.~n",
+                                  [OtpRelease])
+    catch
+        error:badarg ->
+            error_logger:info_msg("Skipping unix socket tests. Current OTP "
+                                  "release could not be determined.~n")
+    end.
+    
+
 %% For R16B where sys:get_state/1 is not available.
 get_state(Process) ->
     {status,_,_,[_,_,_,_,Misc]} = sys:get_status(Process),