Browse Source

Merge pull request #207 from seriyps/prepared-query-statement

Make it possible to provide `#statement{}` to `epgsql:prepared_query/3`
Sergey Prokhorov 5 years ago
parent
commit
d77e14148a
2 changed files with 16 additions and 13 deletions
  1. 9 8
      README.md
  2. 7 5
      src/epgsql.erl

+ 9 - 8
README.md

@@ -283,25 +283,26 @@ squery including final `{C, Ref, done}`.
 ### Prepared Query
 
 ```erlang
-{ok, Columns, Rows}        = epgsql:prepared_query(C, StatementName, [Parameters]).
-{ok, Count}                = epgsql:prepared_query(C, StatementName, [Parameters]).
-{ok, Count, Columns, Rows} = epgsql:prepared_query(C, StatementName, [Parameters]).
+{ok, Columns, Rows}        = epgsql:prepared_query(C, Statement :: #statement{} | string(), [Parameters]).
+{ok, Count}                = epgsql:prepared_query(C, Statement, [Parameters]).
+{ok, Count, Columns, Rows} = epgsql:prepared_query(C, Statement, [Parameters]).
 {error, Error}             = epgsql:prepared_query(C, "non_existent_query", [Parameters]).
 ```
 
 `Parameters` - optional list of values to be bound to `$1`, `$2`, `$3`, etc.
-`StatementName` - name of query given with ```erlang epgsql:parse(C, StatementName, "select ...", []).```
+`Statement` - name of query given with ```erlang epgsql:parse(C, StatementName, "select ...", []).```
+               (can be empty string) or `#statement{}` record returned by `epgsql:parse`.
 
 With prepared query one can parse a query giving it a name with `epgsql:parse` on start and reuse the name
 for all further queries with different parameters.
 
 ```erlang
-epgsql:parse(C, "inc", "select $1+1", []).
-epgsql:prepared_query(C, "inc", [4]).
-epgsql:prepared_query(C, "inc", [1]).
+{ok, Stmt} = epgsql:parse(C, "inc", "select $1+1", []).
+epgsql:prepared_query(C, Stmt, [4]).
+epgsql:prepared_query(C, Stmt, [1]).
 ```
 
-Asynchronous API `epgsqla:prepared_query/3` requires you to parse statement beforehand
+Asynchronous API `epgsqla:prepared_query/3` requires you to always parse statement beforehand
 
 ```erlang
 #statement{types = Types} = Statement,

+ 7 - 5
src/epgsql.erl

@@ -255,13 +255,15 @@ equery(C, Name, Sql, Parameters) ->
             Error
     end.
 
--spec prepared_query(C::connection(), Name::string(), Parameters::[bind_param()]) ->
+-spec prepared_query(C::connection(), string() | statement(), Parameters::[bind_param()]) ->
                             epgsql_cmd_prepared_query:response().
-prepared_query(C, Name, Parameters) ->
+prepared_query(C, #statement{types = Types} = S, Parameters) ->
+    TypedParameters = lists:zip(Types, Parameters),
+    epgsql_sock:sync_command(C, epgsql_cmd_prepared_query, {S, TypedParameters});
+prepared_query(C, Name, Parameters) when is_list(Name) ->
     case describe(C, statement, Name) of
-        {ok, #statement{types = Types} = S} ->
-            TypedParameters = lists:zip(Types, Parameters),
-            epgsql_sock:sync_command(C, epgsql_cmd_prepared_query, {S, TypedParameters});
+        {ok, #statement{} = S} ->
+            prepared_query(C, S, Parameters);
         Error ->
             Error
     end.