From 42a1da6d2e1fc42090a223d8d086d05b79416762 Mon Sep 17 00:00:00 2001 From: Pavel Abalikhin Date: Thu, 3 Dec 2015 12:08:02 +0300 Subject: [PATCH] Add transaction support --- README.md | 21 +++++++++++++++++++++ src/pgpool_worker.erl | 11 ++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f99c8..7411216 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,27 @@ Types: Params = list() ``` +##### Transaction + +```erlang +pgpool:transaction(DatabaseName, Fun) -> (see epgsql for reply/error types) + +Types: + DatabaseName = atom() + Fun = fun() +``` + +For example: + +```erlang +pgpool:transaction(db1_name, + fun(C) -> + pgpool:squery(C, "DELETE FROM users WHERE foo = true"), + pgpool:squery(C, "UPDATE users SET bar = 100"), + pgpool:squery(C, "SELECT * FROM users") + end). +``` + ## Contributing So you want to contribute? That's great! Please follow the guidelines below. It will make it easier to get merged in. diff --git a/src/pgpool_worker.erl b/src/pgpool_worker.erl index 2f7a914..206f9d2 100644 --- a/src/pgpool_worker.erl +++ b/src/pgpool_worker.erl @@ -4,7 +4,7 @@ %% API -export([start_link/1]). --export([squery/2, equery/3]). +-export([squery/2, equery/3, transaction/2]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -43,6 +43,12 @@ equery(DatabaseName, Statement, Params) -> gen_server:call(Worker, {equery, Statement, Params}) end). +-spec transaction(DatabaseName :: atom(), Fun :: fun()) -> any() | {error, no_connection}. +transaction(DatabaseName, Fun) -> + poolboy:transaction(DatabaseName, fun(Worker) -> + gen_server:call(Worker, {transaction, Fun}) + end). + %% =================================================================== %% Callbacks %% =================================================================== @@ -102,6 +108,9 @@ handle_call({squery, Sql}, _From, #state{conn = Conn} = State) -> handle_call({equery, Statement, Params}, _From, #state{conn = Conn} = State) -> {reply, epgsql:equery(Conn, Statement, Params), State}; +handle_call({transaction, Fun}, _From, #state{conn = Conn} = State) -> + {reply, epgsql:with_transaction(Conn, Fun), State}; + handle_call(Request, From, State) -> error_logger:warning_msg("Received from ~p an unknown call message: ~p", [Request, From]), {reply, undefined, State}.