Browse Source

add prepared queries function

Eugene Shubin 9 years ago
parent
commit
c7b63038ec
2 changed files with 36 additions and 0 deletions
  1. 17 0
      README.md
  2. 19 0
      src/epgsql.erl

+ 17 - 0
README.md

@@ -256,6 +256,23 @@ end.
 `epgsqli:equery(C, Statement, [Parameters])` sends same set of messages as
 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]).
+{error, Error}             = epgsql:prepared_equery(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 ...", []).```
+
+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]).
+```
 
 ## Parse/Bind/Execute
 

+ 19 - 0
src/epgsql.erl

@@ -8,6 +8,7 @@
          get_parameter/2,
          squery/2,
          equery/2, equery/3, equery/4,
+         prepared_query/3,
          parse/2, parse/3, parse/4,
          describe/2, describe/3,
          bind/3, bind/4,
@@ -147,6 +148,24 @@ equery(C, Name, Sql, Parameters) ->
             Error
     end.
 
+-spec prepared_query(connection(), string(), [bind_param()]) -> reply(equery_row()).
+prepared_query(C, Name, Parameters) ->
+  case epgsql:describe(C, statement, Name) of
+    {ok, Statement} ->
+      case epgsql:bind(C, Statement, Parameters) of
+        ok ->
+          case epgsql:execute(C, Statement) of
+            {ok, _} = R ->
+              case epgsql:sync(C) of
+                ok -> R;
+                E -> E
+              end;
+            Er -> Er
+          end;
+        Error -> Error
+      end;
+    Err -> Err
+  end.
 %% parse
 
 parse(C, Sql) ->