|
26 | 26 | -define(MAXIMUM_DELAY, 5 * 60 * 1000). % Five minutes |
27 | 27 | -define(TIMEOUT, 5 * 1000). |
28 | 28 |
|
29 | | --define(TX_CONNECTION_VAR(PoolName), {'$pgapp_tx_connection', PoolName}). |
| 29 | +-define(STATE_VAR, '$pgapp_state'). |
30 | 30 |
|
31 | 31 | squery(Sql) -> |
32 | | - squery(epgsql_pool, Sql). |
| 32 | + case get(?STATE_VAR) of |
| 33 | + undefined -> |
| 34 | + squery(epgsql_pool, Sql); |
| 35 | + {_PoolName, Conn} -> |
| 36 | + epgsql:squery(Conn, Sql) |
| 37 | + end. |
33 | 38 |
|
34 | 39 | squery(PoolName, Sql) when is_atom(PoolName) -> |
35 | 40 | squery(PoolName, Sql, ?TIMEOUT); |
36 | 41 | squery(Sql, Timeout) -> |
37 | 42 | squery(epgsql_pool, Sql, Timeout). |
38 | 43 |
|
39 | 44 | squery(PoolName, Sql, Timeout) -> |
40 | | - case get(?TX_CONNECTION_VAR(PoolName)) of |
41 | | - undefined -> |
| 45 | + case get(?STATE_VAR) of |
| 46 | + {PoolName, Conn} -> |
| 47 | + epgsql:squery(Conn, Sql); |
| 48 | + _ -> |
42 | 49 | middle_man_transaction(PoolName, |
43 | 50 | fun (W) -> |
44 | 51 | gen_server:call(W, {squery, Sql}, Timeout) |
45 | | - end, Timeout); |
46 | | - Conn -> |
47 | | - epgsql:squery(Conn, Sql) |
| 52 | + end, Timeout) |
48 | 53 | end. |
49 | 54 |
|
50 | 55 | equery(Sql, Params) -> |
51 | | - equery(epgsql_pool, Sql, Params). |
| 56 | + case get(?STATE_VAR) of |
| 57 | + undefined -> |
| 58 | + equery(epgsql_pool, Sql, Params); |
| 59 | + {_PoolName, Conn} -> |
| 60 | + epgsql:equery(Conn, Sql, Params) |
| 61 | + end. |
52 | 62 |
|
53 | 63 | equery(PoolName, Sql, Params) when is_atom(PoolName) -> |
54 | 64 | equery(PoolName, Sql, Params, ?TIMEOUT); |
55 | 65 | equery(Sql, Params, Timeout) -> |
56 | 66 | equery(epgsql_pool, Sql, Params, Timeout). |
57 | 67 |
|
58 | 68 | equery(PoolName, Sql, Params, Timeout) -> |
59 | | - case get(?TX_CONNECTION_VAR(PoolName)) of |
60 | | - undefined -> |
| 69 | + case get(?STATE_VAR) of |
| 70 | + {PoolName, Conn} -> |
| 71 | + epgsql:equery(Conn, Sql, Params); |
| 72 | + _ -> |
61 | 73 | middle_man_transaction(PoolName, |
62 | 74 | fun (W) -> |
63 | 75 | gen_server:call(W, {equery, Sql, Params}, Timeout) |
64 | | - end, Timeout); |
65 | | - Conn -> |
66 | | - epgsql:equery(Conn, Sql, Params) |
| 76 | + end, Timeout) |
67 | 77 | end. |
68 | 78 |
|
69 | 79 | with_transaction(PoolName, Fun) -> |
70 | 80 | with_transaction(PoolName, Fun, ?TIMEOUT). |
71 | 81 |
|
72 | 82 | with_transaction(PoolName, Fun, Timeout) -> |
73 | | - middle_man_transaction(PoolName, |
74 | | - fun (W) -> |
75 | | - gen_server:call(W, {transaction, PoolName, Fun}, |
76 | | - Timeout) |
77 | | - end, Timeout). |
| 83 | + case get(?STATE_VAR) of |
| 84 | + {PoolName, _Conn} -> |
| 85 | + Fun(); |
| 86 | + _ -> |
| 87 | + middle_man_transaction(PoolName, |
| 88 | + fun (W) -> |
| 89 | + gen_server:call(W, {transaction, PoolName, Fun}, |
| 90 | + Timeout) |
| 91 | + end, Timeout) |
| 92 | + end. |
78 | 93 |
|
79 | 94 | middle_man_transaction(Pool, Fun, Timeout) -> |
80 | 95 | Tag = make_ref(), |
@@ -111,16 +126,9 @@ handle_call({equery, Sql, Params}, _From, |
111 | 126 | {reply, epgsql:equery(Conn, Sql, Params), State}; |
112 | 127 | handle_call({transaction, PoolName, Fun}, _From, |
113 | 128 | #state{conn = Conn} = State) -> |
114 | | - Result = case get(?TX_CONNECTION_VAR(PoolName)) of |
115 | | - undefined -> |
116 | | - put(?TX_CONNECTION_VAR(PoolName), Conn), |
117 | | - Res = epgsql:with_transaction(Conn, fun(_) -> Fun() end), |
118 | | - erase(?TX_CONNECTION_VAR(PoolName)), |
119 | | - Res; |
120 | | - _ -> |
121 | | - % transaction is already in progress |
122 | | - Fun() |
123 | | - end, |
| 129 | + put(?STATE_VAR, {PoolName, Conn}), |
| 130 | + Result = epgsql:with_transaction(Conn, fun(_) -> Fun() end), |
| 131 | + erase(?STATE_VAR), |
124 | 132 | {reply, Result, State}. |
125 | 133 |
|
126 | 134 | handle_cast(reconnect, State) -> |
|
0 commit comments