Anton Lebedevich 13 лет назад
Родитель
Сommit
7e55d6dc10
2 измененных файлов с 65 добавлено и 19 удалено
  1. 19 18
      src/pgsql.erl
  2. 46 1
      src/pgsql_sock.erl

+ 19 - 18
src/pgsql.erl

@@ -21,17 +21,16 @@ connect(Host, Username, Opts) ->
 
 connect(Host, Username, Password, Opts) ->
     {ok, C} = pgsql_sock:start_link(),
-    gen_server:call(C, {connect, Host, Username, Password, Opts}).
+    pgsql_sock:connect(C, Host, Username, Password, Opts).
 
-close(C) when is_pid(C) ->
-    catch gen_server:call(C, stop),
-    ok.
+close(C) ->
+    pgsl_sock:close(C).
 
 get_parameter(C, Name) ->
-    pgsql_connection:get_parameter(C, Name).
+    pgsql_sock:get_parameter(C, Name).
 
 squery(C, Sql) ->
-    ok = pgsql_connection:squery(C, Sql),
+    ok = pgsql_sock:squery(C, Sql),
     case receive_results(C, []) of
         [Result] -> Result;
         Results  -> Results
@@ -41,10 +40,12 @@ equery(C, Sql) ->
     equery(C, Sql, []).
 
 equery(C, Sql, Parameters) ->
-    case pgsql_connection:parse(C, "", Sql, []) of
-        {ok, #statement{types = Types} = S} ->
-            Typed_Parameters = lists:zip(Types, Parameters),
-            ok = pgsql_connection:equery(C, S, Typed_Parameters),
+    case parse(C, Sql) of
+        {ok, S} ->
+            ok = bind(C, S, Parameters),
+            ok = pgsql_sock:execute(C, S, "", 0),
+            ok = close(C, S),
+            ok = sync(C),
             receive_result(C, undefined);
         Error ->
             Error
@@ -59,7 +60,7 @@ parse(C, Sql, Types) ->
     parse(C, "", Sql, Types).
 
 parse(C, Name, Sql, Types) ->
-    pgsql_connection:parse(C, Name, Sql, Types).
+    pgsql_sock:parse(C, Name, Sql, Types).
 
 %% bind
 
@@ -67,7 +68,7 @@ bind(C, Statement, Parameters) ->
     bind(C, Statement, "", Parameters).
 
 bind(C, Statement, PortalName, Parameters) ->
-    pgsql_connection:bind(C, Statement, PortalName, Parameters).
+    pgsql_sock:bind(C, Statement, PortalName, Parameters).
 
 %% execute
 
@@ -78,25 +79,25 @@ execute(C, S, N) ->
     execute(C, S, "", N).
 
 execute(C, S, PortalName, N) ->
-    pgsql_connection:execute(C, S, PortalName, N),
+    pgsql_sock:execute(C, S, PortalName, N),
     receive_extended_result(C).
 
 %% statement/portal functions
 
 describe(C, #statement{name = Name}) ->
-    pgsql_connection:describe(C, statement, Name).
+    pgsql_sock:describe(C, statement, Name).
 
 describe(C, Type, Name) ->
-    pgsql_connection:describe(C, Type, Name).
+    pgsql_sock:describe(C, Type, Name).
 
 close(C, #statement{name = Name}) ->
-    pgsql_connection:close(C, statement, Name).
+    pgsql_sock:close(C, statement, Name).
 
 close(C, Type, Name) ->
-    pgsql_connection:close(C, Type, Name).
+    pgsql_sock:close(C, Type, Name).
 
 sync(C) ->
-    pgsql_connection:sync(C).
+    pgsql_sock:sync(C).
 
 %% misc helper functions
 with_transaction(C, F) ->

+ 46 - 1
src/pgsql_sock.erl

@@ -4,7 +4,18 @@
 
 -behavior(gen_server).
 
--export([start_link/0, cancel/1]).
+-export([start_link/0,
+         connect/5,
+         close/1,
+         get_parameter/2,
+         squery/2,
+         parse/4,
+         bind/4,
+         execute/4,
+         describe/3,
+         sync/1,
+         close/3,
+         cancel/1]).
 
 -export([handle_call/3, handle_cast/2, handle_info/2]).
 -export([init/1, code_change/3, terminate/2]).
@@ -32,6 +43,37 @@
 start_link() ->
     gen_server:start_link(?MODULE, [], []).
 
+connect(C, Host, Username, Password, Opts) ->
+    gen_server:call(C, {connect, Host, Username, Password, Opts}, infinity).
+
+close(C) when is_pid(C) ->
+    catch gen_server:call(C, stop, infinity),
+    ok.
+
+get_parameter(C, Name) ->
+    gen_server:call(C, {get_parameter, to_binary(Name)}).
+
+squery(C, Sql) ->
+    gen_server:call(C, {squery, Sql}, infinity).
+
+parse(C, Name, Sql, Types) ->
+    gen_server:call(C, {parse, Name, Sql, Types}, infinity).
+
+bind(C, Statement, PortalName, Parameters) ->
+    gen_server:call(C, {bind, Statement, PortalName, Parameters}, infinity).
+
+execute(C, Statement, PortalName, MaxRows) ->
+    gen_server:call(C, {execute, Statement, PortalName, MaxRows}, infinity).
+
+describe(C, Type, Name) ->
+    gen_server:call(C, {describe, Type, Name}, infinity).
+
+close(C, Type, Name) ->
+    gen_server:call(C, {close, Type, Name}, infinity).
+
+sync(C) ->
+    gen_server:call(C, sync, infinity).
+
 cancel(S) ->
     gen_server:cast(S, cancel).
 
@@ -272,6 +314,9 @@ on_message({$A, <<Pid:?int32, Strings/binary>>}, State) ->
     notify_async(State, {notification, Channel, Pid, Payload}),
     {noreply, State}.
 
+to_binary(B) when is_binary(B) -> B;
+to_binary(L) when is_list(L)   -> list_to_binary(L).
+
 hex(Bin) ->
     HChar = fun(N) when N < 10 -> $0 + N;
                (N) when N < 16 -> $W + N