2 ===================================================================
3 --- mysql_conn.erl (revision 861)
4 +++ mysql_conn.erl (working copy)
7 %%--------------------------------------------------------------------
15 %%--------------------------------------------------------------------
16 %% Function: start(Host, Port, User, Password, Database, LogFun)
17 +%% Function: start(Host, Port, User, Password, Database, UserFlags, LogFun)
18 %% Function: start_link(Host, Port, User, Password, Database, LogFun)
22 %% Password = string()
23 %% Database = string()
24 +%% UserFlags = list()
25 %% LogFun = undefined | function() of arity 3
26 %% Descrip.: Starts a mysql_conn process that connects to a MySQL
27 %% server, logs in and chooses a database.
31 %%--------------------------------------------------------------------
32 -start(Host, Port, User, Password, Database, LogFun) when is_list(Host), is_integer(Port), is_list(User),
33 - is_list(Password), is_list(Database) ->
34 +start(Host, Port, User, Password, Database, LogFun) ->
35 + start(Host, Port, User, Password, Database, [], LogFun).
36 +start(Host, Port, User, Password, Database, UserFlags, LogFun) when is_list(Host), is_integer(Port), is_list(User),
37 + is_list(Password), is_list(Database), is_list(UserFlags) ->
40 - init(Host, Port, User, Password, Database, LogFun, ConnPid)
41 + init(Host, Port, User, Password, Database, UserFlags, LogFun, ConnPid)
43 post_start(Pid, LogFun).
46 is_list(Password), is_list(Database) ->
48 Pid = spawn_link(fun () ->
49 - init(Host, Port, User, Password, Database, LogFun, ConnPid)
50 + init(Host, Port, User, Password, Database, [], LogFun, ConnPid)
52 post_start(Pid, LogFun).
56 %% Password = string()
57 %% Database = string()
58 +%% UserFlags = list()
59 %% LogFun = undefined | function() of arity 3
60 %% Parent = pid() of process starting this mysql_conn
61 %% Descrip.: Connect to a MySQL server, log in and chooses a database.
63 %% we were successfull.
64 %% Returns : void() | does not return
65 %%--------------------------------------------------------------------
66 -init(Host, Port, User, Password, Database, LogFun, Parent) ->
67 +init(Host, Port, User, Password, Database, UserFlags, LogFun, Parent) ->
68 case mysql_recv:start_link(Host, Port, LogFun, self()) of
69 {ok, RecvPid, Sock} ->
70 - case mysql_init(Sock, RecvPid, User, Password, LogFun) of
71 + case mysql_init(Sock, RecvPid, User, Password, UserFlags, LogFun) of
73 case do_query(Sock, RecvPid, LogFun, "use " ++ Database, Version, [{result_type, binary}]) of
78 %%--------------------------------------------------------------------
79 -%% Function: mysql_init(Sock, RecvPid, User, Password, LogFun)
80 +%% Function: mysql_init(Sock, RecvPid, User, Password, UserFlags, LogFun)
81 %% Sock = term(), gen_tcp socket
82 %% RecvPid = pid(), mysql_recv process
85 %% Returns : ok | {error, Reason}
87 %%--------------------------------------------------------------------
88 -mysql_init(Sock, RecvPid, User, Password, LogFun) ->
89 +mysql_init(Sock, RecvPid, User, Password, UserFlags, LogFun) ->
90 case do_recv(LogFun, RecvPid, undefined) of
91 {ok, Packet, InitSeqNum} ->
92 {Version, Salt1, Salt2, Caps} = greeting(Packet, LogFun),
94 case Caps band ?SECURE_CONNECTION of
96 - mysql_auth:do_new_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, Salt1, Salt2, LogFun);
97 + mysql_auth:do_new_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, UserFlags, Salt1, Salt2, LogFun);
99 - mysql_auth:do_old_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, Salt1, LogFun)
100 + mysql_auth:do_old_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, UserFlags, Salt1, LogFun)
103 {ok, <<0:8, _Rest/binary>>, _RecvNum} ->
104 Index: mysql_auth.erl
105 ===================================================================
106 --- mysql_auth.erl (revision 861)
107 +++ mysql_auth.erl (working copy)
109 %% External exports (should only be used by the 'mysql_conn' module)
110 %%--------------------------------------------------------------------
118 %%--------------------------------------------------------------------
120 %% Descrip.: Perform old-style MySQL authentication.
121 %% Returns : result of mysql_conn:do_recv/3
122 %%--------------------------------------------------------------------
123 -do_old_auth(Sock, RecvPid, SeqNum, User, Password, Salt1, LogFun) ->
124 +do_old_auth(Sock, RecvPid, SeqNum, User, Password, UserFlags, Salt1, LogFun) ->
125 Auth = password_old(Password, Salt1),
126 - Packet2 = make_auth(User, Auth),
127 + Packet2 = make_auth(User, Auth, UserFlags),
128 do_send(Sock, Packet2, SeqNum, LogFun),
129 mysql_conn:do_recv(LogFun, RecvPid, SeqNum).
132 %% Descrip.: Perform MySQL authentication.
133 %% Returns : result of mysql_conn:do_recv/3
134 %%--------------------------------------------------------------------
135 -do_new_auth(Sock, RecvPid, SeqNum, User, Password, Salt1, Salt2, LogFun) ->
136 +do_new_auth(Sock, RecvPid, SeqNum, User, Password, UserFlags, Salt1, Salt2, LogFun) ->
137 Auth = password_new(Password, Salt1 ++ Salt2),
138 - Packet2 = make_new_auth(User, Auth, none),
139 + Packet2 = make_new_auth(User, Auth, none, UserFlags),
140 do_send(Sock, Packet2, SeqNum, LogFun),
141 case mysql_conn:do_recv(LogFun, RecvPid, SeqNum) of
142 {ok, Packet3, SeqNum2} ->
146 %% part of do_old_auth/4, which is part of mysql_init/4
147 -make_auth(User, Password) ->
148 - Caps = ?LONG_PASSWORD bor ?LONG_FLAG
149 - bor ?TRANSACTIONS bor ?FOUND_ROWS,
150 +make_auth(User, Password, UserFlags) ->
151 + Flags = lists:append(UserFlags, [?LONG_PASSWORD, ?LONG_FLAG, ?TRANSACTIONS, ?FOUND_ROWS]),
152 + Caps = lists:foldl(fun(Flag, TCaps) when is_integer(Flag) ->
156 UserB = list_to_binary(User),
157 PasswordB = Password,
158 @@ -115,16 +117,18 @@
161 %% part of do_new_auth/4, which is part of mysql_init/4
162 -make_new_auth(User, Password, Database) ->
163 +make_new_auth(User, Password, Database, UserFlags) ->
164 DBCaps = case Database of
170 - Caps = ?LONG_PASSWORD bor ?LONG_FLAG bor ?TRANSACTIONS bor
171 - ?PROTOCOL_41 bor ?SECURE_CONNECTION bor DBCaps
174 + Flags = lists:append(UserFlags, [?LONG_PASSWORD, ?LONG_FLAG, ?TRANSACTIONS, ?PROTOCOL_41, ?SECURE_CONNECTION, DBCaps, ?FOUND_ROWS]),
175 + Caps = lists:foldl(fun(Flag, TCaps) when is_integer(Flag) ->
177 + end, DBCaps, Flags),
178 Maxsize = ?MAX_PACKET_SIZE,
179 UserB = list_to_binary(User),
180 PasswordL = size(Password),