Skip to content

Commit 58f43f8

Browse files
committed
Connection. Track prepared statements.
1 parent 02ddb50 commit 58f43f8

File tree

4 files changed

+33
-17
lines changed

4 files changed

+33
-17
lines changed

src/oatpp-postgresql/Connection.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,17 @@ Connection::~Connection() {
3636
}
3737
}
3838

39-
void* Connection::getHandle() {
39+
PGconn* Connection::getHandle() {
4040
return m_connection;
4141
}
4242

43+
void Connection::setPrepared(const oatpp::String& statementName) {
44+
m_prepared.insert(statementName);
45+
}
46+
47+
bool Connection::isPrepared(const oatpp::String& statementName) {
48+
auto it = m_prepared.find(statementName);
49+
return it != m_prepared.end();
50+
}
51+
4352
}}

src/oatpp-postgresql/Connection.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define oatpp_postgresql_Connection_hpp
2727

2828
#include "oatpp/database/Connection.hpp"
29+
#include "oatpp/core/Types.hpp"
2930

3031
#include <libpq-fe.h>
3132

@@ -34,12 +35,16 @@ namespace oatpp { namespace postgresql {
3435
class Connection : public database::Connection {
3536
private:
3637
PGconn* m_connection;
38+
std::unordered_set<oatpp::String> m_prepared;
3739
public:
3840

3941
Connection(PGconn* connection);
4042
~Connection();
4143

42-
void* getHandle() override;
44+
PGconn* getHandle();
45+
46+
void setPrepared(const oatpp::String& statementName);
47+
bool isPrepared(const oatpp::String& statementName);
4348

4449
};
4550

src/oatpp-postgresql/Executor.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,20 @@ std::unique_ptr<Oid[]> Executor::getParamTypes(const StringTemplate& queryTempla
5151
}
5252

5353
void Executor::prepareQuery(const StringTemplate& queryTemplate,
54-
const std::shared_ptr<database::Connection>& connection)
54+
const std::shared_ptr<postgresql::Connection>& connection)
5555
{
5656

5757
auto extra = std::static_pointer_cast<ql_template::Parser::TemplateExtra>(queryTemplate.getExtraData());
5858

59-
auto pgConnection = static_cast<PGconn *>(connection->getHandle());
60-
PGresult *qres = PQprepare(pgConnection,
59+
PGresult *qres = PQprepare(connection->getHandle(),
6160
extra->templateName->c_str(),
6261
extra->preparedTemplate->c_str(),
6362
queryTemplate.getTemplateVariables().size(),
6463
extra->paramTypes.get());
6564

6665
auto status = PQresultStatus(qres);
6766
if (status != PGRES_COMMAND_OK) {
68-
OATPP_LOGD("Executor::prepareQuery", "execute prepare failed: %s", PQerrorMessage(pgConnection));
67+
OATPP_LOGD("Executor::prepareQuery", "execute prepare failed: %s", PQerrorMessage(connection->getHandle()));
6968
} else {
7069
OATPP_LOGD("Executor::prepareQuery", "OK");
7170
}
@@ -74,13 +73,11 @@ void Executor::prepareQuery(const StringTemplate& queryTemplate,
7473

7574
void Executor::executeQuery(const StringTemplate& queryTemplate,
7675
const std::unordered_map<oatpp::String, oatpp::Void>& params,
77-
const std::shared_ptr<database::Connection>& connection)
76+
const std::shared_ptr<postgresql::Connection>& connection)
7877
{
7978

8079
auto extra = std::static_pointer_cast<ql_template::Parser::TemplateExtra>(queryTemplate.getExtraData());
8180

82-
auto pgConnection = static_cast<PGconn *>(connection->getHandle());
83-
8481
v_uint32 paramsNumber = queryTemplate.getTemplateVariables().size();
8582

8683
std::vector<mapping::Serializer::OutputData> outData(paramsNumber);
@@ -104,7 +101,7 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
104101
paramFormats[i] = data.dataFormat;
105102
}
106103

107-
PGresult *qres = PQexecPrepared(pgConnection,
104+
PGresult *qres = PQexecPrepared(connection->getHandle(),
108105
extra->templateName->c_str(),
109106
paramsNumber,
110107
paramValues.get(),
@@ -114,7 +111,7 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
114111

115112
auto status = PQresultStatus(qres);
116113
if (status != PGRES_TUPLES_OK) {
117-
OATPP_LOGD("Database", "execute query failed: %s", PQerrorMessage(pgConnection));
114+
OATPP_LOGD("Database", "execute query failed: %s", PQerrorMessage(connection->getHandle()));
118115
} else {
119116
OATPP_LOGD("Database", "OK_2");
120117
}
@@ -170,6 +167,7 @@ database::QueryResult Executor::execute(const StringTemplate& queryTemplate,
170167
const std::shared_ptr<database::Connection>& connection)
171168
{
172169

170+
auto pgConnection = std::static_pointer_cast<postgresql::Connection>(connection);
173171
auto extra = std::static_pointer_cast<ql_template::Parser::TemplateExtra>(queryTemplate.getExtraData());
174172

175173
std::unordered_map<oatpp::String, oatpp::String> map;
@@ -178,13 +176,17 @@ database::QueryResult Executor::execute(const StringTemplate& queryTemplate,
178176
}
179177
auto res = queryTemplate.format(map);
180178

181-
OATPP_LOGD("AAA", "prepared[%s]={%s}", extra->templateName->c_str(), extra->preparedTemplate->c_str());
182-
OATPP_LOGD("AAA", "query={%s}", res->c_str());
179+
if(!pgConnection->isPrepared(extra->templateName)) {
180+
OATPP_LOGD("AAA", "prepared[%s]={%s}", extra->templateName->c_str(), extra->preparedTemplate->c_str());
181+
prepareQuery(queryTemplate, pgConnection);
182+
pgConnection->setPrepared(extra->templateName);
183+
}
183184

184-
prepareQuery(queryTemplate, connection);
185-
executeQuery(queryTemplate, params, connection);
185+
OATPP_LOGD("AAA", "query={%s}", res->c_str());
186+
executeQuery(queryTemplate, params, pgConnection);
186187

187188
return database::QueryResult();
189+
188190
}
189191

190192
}}

src/oatpp-postgresql/Executor.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ namespace oatpp { namespace postgresql {
3838
class Executor : public database::Executor {
3939
private:
4040
std::unique_ptr<Oid[]> getParamTypes(const StringTemplate& queryTemplate, const ParamsTypeMap& paramsTypeMap);
41-
void prepareQuery(const StringTemplate& queryTemplate, const std::shared_ptr<database::Connection>& connection);
41+
void prepareQuery(const StringTemplate& queryTemplate, const std::shared_ptr<postgresql::Connection>& connection);
4242
void executeQuery(const StringTemplate& queryTemplate,
4343
const std::unordered_map<oatpp::String, oatpp::Void>& params,
44-
const std::shared_ptr<database::Connection>& connection);
44+
const std::shared_ptr<postgresql::Connection>& connection);
4545
private:
4646
mapping::TypeMapper m_typeMapper;
4747
mapping::Serializer m_serializer;

0 commit comments

Comments
 (0)