Skip to content

Commit 7a6f9c7

Browse files
committed
Implement Transactions.
1 parent f1de170 commit 7a6f9c7

File tree

6 files changed

+56
-10
lines changed

6 files changed

+56
-10
lines changed

src/oatpp-postgresql/Executor.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ data::share::StringTemplate Executor::parseQueryTemplate(const oatpp::String& na
163163
auto extra = std::make_shared<ql_template::Parser::TemplateExtra>();
164164
t.setExtraData(extra);
165165

166+
extra->prepare = prepare;
166167
extra->templateName = name;
167168
ql_template::TemplateValueProvider valueProvider;
168169
extra->preparedTemplate = t.format(&valueProvider);
@@ -181,8 +182,7 @@ std::shared_ptr<orm::Connection> Executor::getConnection() {
181182

182183
std::shared_ptr<orm::QueryResult> Executor::execute(const StringTemplate& queryTemplate,
183184
const std::unordered_map<oatpp::String, oatpp::Void>& params,
184-
const std::shared_ptr<orm::Connection>& connection,
185-
bool prepare)
185+
const std::shared_ptr<orm::Connection>& connection)
186186
{
187187

188188
std::shared_ptr<orm::Connection> conn = connection;
@@ -193,6 +193,7 @@ std::shared_ptr<orm::QueryResult> Executor::execute(const StringTemplate& queryT
193193
auto pgConnection = std::static_pointer_cast<postgresql::Connection>(conn);
194194

195195
auto extra = std::static_pointer_cast<ql_template::Parser::TemplateExtra>(queryTemplate.getExtraData());
196+
bool prepare = extra->prepare;
196197

197198
if(prepare) {
198199

@@ -213,4 +214,29 @@ std::shared_ptr<orm::QueryResult> Executor::execute(const StringTemplate& queryT
213214

214215
}
215216

217+
std::shared_ptr<orm::QueryResult> Executor::begin(const std::shared_ptr<orm::Connection>& connection) {
218+
219+
std::shared_ptr<orm::Connection> conn = connection;
220+
if(!conn) {
221+
conn = getConnection();
222+
}
223+
224+
auto pgConnection = std::static_pointer_cast<postgresql::Connection>(conn);
225+
PGresult *qres = PQexec(pgConnection->getHandle(), "BEGIN");
226+
return std::make_shared<QueryResult>(qres, pgConnection, m_connectionProvider, m_resultMapper);
227+
228+
}
229+
230+
std::shared_ptr<orm::QueryResult> Executor::commit(const std::shared_ptr<orm::Connection>& connection) {
231+
auto pgConnection = std::static_pointer_cast<postgresql::Connection>(connection);
232+
PGresult *qres = PQexec(pgConnection->getHandle(), "END");
233+
return std::make_shared<QueryResult>(qres, pgConnection, m_connectionProvider, m_resultMapper);
234+
}
235+
236+
std::shared_ptr<orm::QueryResult> Executor::rollback(const std::shared_ptr<orm::Connection>& connection) {
237+
auto pgConnection = std::static_pointer_cast<postgresql::Connection>(connection);
238+
PGresult *qres = PQexec(pgConnection->getHandle(), "ROLLBACK");
239+
return std::make_shared<QueryResult>(qres, pgConnection, m_connectionProvider, m_resultMapper);
240+
}
241+
216242
}}

src/oatpp-postgresql/Executor.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,13 @@ class Executor : public orm::Executor {
9696

9797
std::shared_ptr<orm::QueryResult> execute(const StringTemplate& queryTemplate,
9898
const std::unordered_map<oatpp::String, oatpp::Void>& params,
99-
const std::shared_ptr<orm::Connection>& connection,
100-
bool prepare) override;
99+
const std::shared_ptr<orm::Connection>& connection) override;
100+
101+
std::shared_ptr<orm::QueryResult> begin(const std::shared_ptr<orm::Connection>& connection = nullptr) override;
102+
103+
std::shared_ptr<orm::QueryResult> commit(const std::shared_ptr<orm::Connection>& connection) override;
104+
105+
std::shared_ptr<orm::QueryResult> rollback(const std::shared_ptr<orm::Connection>& connection) override;
101106

102107
};
103108

src/oatpp-postgresql/QueryResult.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ QueryResult::~QueryResult() {
7070
PQclear(m_dbResult);
7171
}
7272

73+
std::shared_ptr<orm::Connection> QueryResult::getConnection() const {
74+
return m_connection;
75+
}
76+
7377
bool QueryResult::isSuccess() const {
7478
return m_success;
7579
}
@@ -82,11 +86,11 @@ oatpp::String QueryResult::getErrorMessage() const {
8286
return nullptr;
8387
}
8488

85-
v_int64 QueryResult::position() const {
89+
v_int64 QueryResult::getPosition() const {
8690
return m_resultData.rowIndex;
8791
}
8892

89-
v_int64 QueryResult::count() const {
93+
v_int64 QueryResult::getCount() const {
9094
switch(m_type) {
9195
case TYPE_TUPLES: return m_resultData.rowCount;
9296
// case TYPE_COMMAND: return 0;

src/oatpp-postgresql/QueryResult.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,15 @@ class QueryResult : public orm::QueryResult {
5656

5757
~QueryResult();
5858

59+
std::shared_ptr<orm::Connection> getConnection() const override;
60+
5961
bool isSuccess() const override;
6062

6163
oatpp::String getErrorMessage() const override;
6264

63-
v_int64 position() const override;
65+
v_int64 getPosition() const override;
6466

65-
v_int64 count() const override;
67+
v_int64 getCount() const override;
6668

6769
void fetch(oatpp::Void& polymorph, v_int64 count) override;
6870

src/oatpp-postgresql/ql_template/Parser.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class Parser {
4040
oatpp::String templateName;
4141
oatpp::String preparedTemplate;
4242
std::unique_ptr<Oid[]> paramTypes;
43+
bool prepare;
4344

4445
};
4546

test/oatpp-postgresql/tests.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ class MyClient : public oatpp::orm::DbClient {
125125

126126
QUERY(selectFloats, "SELECT * FROM test_floats")
127127

128+
std::shared_ptr<oatpp::orm::QueryResult> insertMultipleUsers() {
129+
auto t = beginTransaction();
130+
createUser("admin5", "AdMiN", "admin5@admin.com", t.getConnection());
131+
createUser("admin6", "AdMiN", "admin6@admin.com", t.getConnection());
132+
return t.commit();
133+
}
134+
128135
};
129136

130137
#include OATPP_CODEGEN_END(DbClient)
@@ -188,10 +195,11 @@ class Test : public oatpp::test::UnitTest {
188195
{
189196

190197
//auto res = client.createUser("admin1", "AdMiN", "admin1@admin.com");
191-
auto res = client.selectUsers();
198+
//auto res = client.selectUsers();
199+
auto res = client.insertMultipleUsers();
192200

193201
if(res->isSuccess()) {
194-
OATPP_LOGD(TAG, "OK, count=%d", res->count());
202+
OATPP_LOGD(TAG, "OK, count=%d", res->getCount());
195203
} else {
196204
auto message = res->getErrorMessage();
197205
OATPP_LOGD(TAG, "Error, message=%s", message->c_str());

0 commit comments

Comments
 (0)