From e220c8b6f2b13b354e6f31126f0fa9e5d87795a0 Mon Sep 17 00:00:00 2001 From: Frank Diebolt Date: Thu, 26 Nov 2020 12:17:13 +0100 Subject: [PATCH] support "gen_tcp:connect" options --- CHANGELOG.md | 8 ++++++++ src/p1_mysql_conn.erl | 2 +- src/p1_mysql_recv.erl | 32 +++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 541f6bd..2531113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Version 1.0.17 + +* Support "gen_tcp" connect options (ie. keepalive, send_timeout, sndbuf, recbuf...) + +# Version 1.0.16 + +* Support OTP-23 on travis + # Version 1.0.15 * Fix warnings diff --git a/src/p1_mysql_conn.erl b/src/p1_mysql_conn.erl index 1b8c3c3..afd7c23 100644 --- a/src/p1_mysql_conn.erl +++ b/src/p1_mysql_conn.erl @@ -330,7 +330,7 @@ do_recv(LogFun, RecvPid, SeqNum) when is_function(LogFun); %% Returns : void() | does not return %%-------------------------------------------------------------------- init(Host, Port, User, Password, Database, ConnectTimeout, LogFun, Parent, SSLOpts) -> - case p1_mysql_recv:start_link(Host, Port, ConnectTimeout, LogFun, self()) of + case p1_mysql_recv:start_link(Host, Port, ConnectTimeout, LogFun, self(), SSLOpts) of {ok, RecvPid, Sock0} -> case mysql_init(Sock0, RecvPid, User, Password, LogFun, SSLOpts) of {ok, {SockMod, RawSock} = Sock, Version} -> diff --git a/src/p1_mysql_recv.erl b/src/p1_mysql_recv.erl index 5639f8f..33dc78f 100644 --- a/src/p1_mysql_recv.erl +++ b/src/p1_mysql_recv.erl @@ -31,7 +31,8 @@ %%-------------------------------------------------------------------- %% External exports (should only be used by the 'p1_mysql_conn' module) %%-------------------------------------------------------------------- --export([start_link/5 +-export([start_link/5, + start_link/6 ]). -include_lib("kernel/include/inet.hrl"). @@ -56,6 +57,7 @@ %% Port = integer() %% LogFun = undefined | function() of arity 3 %% Parent = pid(), process that should get received frames +%% Options = [atom() | {atom{}, any{}}] gen_tcp options %% Descrip.: Start a process that connects to Host:Port and waits for %% data. When it has received a MySQL frame, it sends it to %% Parent and waits for the next frame. @@ -65,11 +67,14 @@ %% Socket = term(), gen_tcp socket %% Reason = atom() | string() %%-------------------------------------------------------------------- -start_link(Host, Port, ConnectTimeout, LogFun, Parent) when is_list(Host), +start_link(Host, Port, ConnectTimeout, LogFun, Parent) -> + start_link(Host, Port, ConnectTimeout, LogFun, Parent, []). + +start_link(Host, Port, ConnectTimeout, LogFun, Parent, Options) when is_list(Host), is_integer(Port) -> RecvPid = spawn_link(fun () -> - init(Host, Port, LogFun, Parent) + init(Host, Port, LogFun, Parent, Options) end), %% wait for the socket from the spawned pid receive @@ -97,8 +102,8 @@ start_link(Host, Port, ConnectTimeout, LogFun, Parent) when is_list(Host), %% Descrip.: Connect to Host:Port and then enter receive-loop. %% Returns : error | never returns %%-------------------------------------------------------------------- -init(Host, Port, LogFun, Parent) -> - case connect(Host, Port) of +init(Host, Port, LogFun, Parent, Options) -> + case connect(Host, Port, Options) of {ok, Sock} -> Parent ! {p1_mysql_recv, self(), init, {ok, Sock}}, State = #state{socket = Sock, @@ -182,22 +187,27 @@ sendpacket(Parent, Data) -> %%-------------------------------------------------------------------- %% Connecting stuff %%-------------------------------------------------------------------- -connect(Host, Port) -> +connect(Host, Port, Options) -> case lookup(Host) of {ok, AddrsFamilies} -> - do_connect(AddrsFamilies, Port, {error, nxdomain}); + do_connect(AddrsFamilies, Port, Options, {error, nxdomain}); {error, _} = Err -> Err end. -do_connect([{IP, Family}|AddrsFamilies], Port, _Err) -> - case gen_tcp:connect(IP, Port, [binary, {packet, 0}, Family]) of +do_connect([{IP, Family}|AddrsFamilies], Port, Options, _Err) -> + SupportedOptions = inet:options() -- [binary,packet,inet,inet6], + OtherOpts = lists:filter(fun(Opt) -> + OptKey = case Opt of {K, _} -> K; K -> K end, + lists:member(OptKey, SupportedOptions) + end, Options), + case gen_tcp:connect(IP, Port, [binary, {packet, 0}, Family | OtherOpts]) of {ok, Sock} -> {ok, Sock}; {error, _} = Err -> - do_connect(AddrsFamilies, Port, Err) + do_connect(AddrsFamilies, Port, Options, Err) end; -do_connect([], _Port, Err) -> +do_connect([], _Port, _Options, Err) -> Err. lookup(Host) ->