Skip to content

Commit 7255519

Browse files
committed
Fix connection invalidator.
1 parent 3071ed1 commit 7255519

File tree

7 files changed

+60
-17
lines changed

7 files changed

+60
-17
lines changed

src/oatpp-postgresql/Connection.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626

2727
namespace oatpp { namespace postgresql {
2828

29+
void Connection::setInvalidator(const std::shared_ptr<provider::Invalidator<Connection>>& invalidator) {
30+
m_invalidator = invalidator;
31+
}
32+
33+
std::shared_ptr<provider::Invalidator<Connection>> Connection::getInvalidator() {
34+
return m_invalidator;
35+
}
36+
2937
ConnectionImpl::ConnectionImpl(PGconn* connection)
3038
: m_connection(connection)
3139
{}

src/oatpp-postgresql/Connection.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace oatpp { namespace postgresql {
3737
* Implementation of &id:oatpp::orm::Connection; for PostgreSQL.
3838
*/
3939
class Connection : public orm::Connection {
40+
private:
41+
std::shared_ptr<provider::Invalidator<Connection>> m_invalidator;
4042
public:
4143

4244
/**
@@ -48,6 +50,9 @@ class Connection : public orm::Connection {
4850
virtual void setPrepared(const oatpp::String& statementName) = 0;
4951
virtual bool isPrepared(const oatpp::String& statementName) = 0;
5052

53+
void setInvalidator(const std::shared_ptr<provider::Invalidator<Connection>>& invalidator);
54+
std::shared_ptr<provider::Invalidator<Connection>> getInvalidator();
55+
5156
};
5257

5358
class ConnectionImpl : public Connection {

src/oatpp-postgresql/ConnectionProvider.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
namespace oatpp { namespace postgresql {
2828

29-
void ConnectionProvider::ConnectionInvalidator::invalidate(const std::shared_ptr<orm::Connection> &resource) {
29+
void ConnectionProvider::ConnectionInvalidator::invalidate(const std::shared_ptr<Connection> &resource) {
3030
(void) resource;
3131
//Do nothing.
3232
}
@@ -36,7 +36,7 @@ ConnectionProvider::ConnectionProvider(const oatpp::String& connectionString)
3636
, m_connectionString(connectionString)
3737
{}
3838

39-
provider::ResourceHandle<orm::Connection> ConnectionProvider::get() {
39+
provider::ResourceHandle<Connection> ConnectionProvider::get() {
4040

4141
auto handle = PQconnectdb(m_connectionString->c_str());
4242

@@ -47,11 +47,11 @@ provider::ResourceHandle<orm::Connection> ConnectionProvider::get() {
4747
"Error. Can't connect. " + errMsg);
4848
}
4949

50-
return provider::ResourceHandle<orm::Connection>(std::make_shared<ConnectionImpl>(handle), m_invalidator);
50+
return provider::ResourceHandle<Connection>(std::make_shared<ConnectionImpl>(handle), m_invalidator);
5151

5252
}
5353

54-
async::CoroutineStarterForResult<const provider::ResourceHandle<orm::Connection>&> ConnectionProvider::getAsync() {
54+
async::CoroutineStarterForResult<const provider::ResourceHandle<Connection>&> ConnectionProvider::getAsync() {
5555
throw std::runtime_error("[oatpp::postgresql::ConnectionProvider::getAsync()]: Error. Not implemented!");
5656
}
5757

src/oatpp-postgresql/ConnectionProvider.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ namespace oatpp { namespace postgresql {
3535
/**
3636
* Connection provider.
3737
*/
38-
class ConnectionProvider : public provider::Provider<orm::Connection> {
38+
class ConnectionProvider : public provider::Provider<Connection> {
3939
private:
4040

41-
class ConnectionInvalidator : public provider::Invalidator<orm::Connection> {
41+
class ConnectionInvalidator : public provider::Invalidator<Connection> {
4242
public:
43-
void invalidate(const std::shared_ptr<orm::Connection>& resource) override;
43+
void invalidate(const std::shared_ptr<Connection>& resource) override;
4444
};
4545

4646
private:
@@ -58,13 +58,13 @@ class ConnectionProvider : public provider::Provider<orm::Connection> {
5858
* Get Connection.
5959
* @return - resource.
6060
*/
61-
provider::ResourceHandle<orm::Connection> get() override;
61+
provider::ResourceHandle<Connection> get() override;
6262

6363
/**
6464
* Get Connection in Async manner.
6565
* @return - &id:oatpp::async::CoroutineStarterForResult; of `Connection`.
6666
*/
67-
async::CoroutineStarterForResult<const provider::ResourceHandle<orm::Connection>&> getAsync() override;
67+
async::CoroutineStarterForResult<const provider::ResourceHandle<Connection>&> getAsync() override;
6868

6969
/**
7070
* Stop provider and free associated resources.
@@ -79,7 +79,7 @@ class ConnectionProvider : public provider::Provider<orm::Connection> {
7979
* - &id:oatpp::postgresql::ConnectionAcquisitionProxy;.
8080
*/
8181
typedef oatpp::provider::Pool<
82-
provider::Provider<orm::Connection>,
82+
provider::Provider<Connection>,
8383
Connection,
8484
ConnectionAcquisitionProxy
8585
> ConnectionPool;

src/oatpp-postgresql/Executor.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ namespace {
5454

5555
}
5656

57+
void Executor::ConnectionInvalidator::invalidate(const std::shared_ptr<orm::Connection>& connection) {
58+
auto c = std::static_pointer_cast<Connection>(connection);
59+
auto invalidator = c->getInvalidator();
60+
if(!invalidator) {
61+
throw std::runtime_error("[oatpp::postgresql::Executor::ConnectionInvalidator::invalidate()]: Error. "
62+
"Connection invalidator was NOT set.");
63+
}
64+
invalidator->invalidate(c);
65+
}
66+
5767
Executor::QueryParams::QueryParams(const StringTemplate& queryTemplate,
5868
const std::unordered_map<oatpp::String, oatpp::Void>& params,
5969
const mapping::Serializer& serializer,
@@ -123,8 +133,9 @@ Executor::QueryParams::QueryParams(const StringTemplate& queryTemplate,
123133

124134
}
125135

126-
Executor::Executor(const std::shared_ptr<provider::Provider<orm::Connection>>& connectionProvider)
127-
: m_connectionProvider(connectionProvider)
136+
Executor::Executor(const std::shared_ptr<provider::Provider<Connection>>& connectionProvider)
137+
: m_connectionInvalidator(std::make_shared<ConnectionInvalidator>())
138+
, m_connectionProvider(connectionProvider)
128139
, m_resultMapper(std::make_shared<mapping::ResultMapper>())
129140
{
130141
m_defaultTypeResolver->addKnownClasses({
@@ -288,7 +299,12 @@ data::share::StringTemplate Executor::parseQueryTemplate(const oatpp::String& na
288299
provider::ResourceHandle<orm::Connection> Executor::getConnection() {
289300
auto connection = m_connectionProvider->get();
290301
if(connection) {
291-
return connection;
302+
/* set correct invalidator before cast */
303+
connection.object->setInvalidator(connection.invalidator);
304+
return provider::ResourceHandle<orm::Connection>(
305+
connection.object,
306+
m_connectionInvalidator
307+
);
292308
}
293309
throw std::runtime_error("[oatpp::postgresql::Executor::getConnection()]: Error. Can't connect.");
294310
}

src/oatpp-postgresql/Executor.hpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ namespace oatpp { namespace postgresql {
4343
* Implementation of &id:oatpp::orm::Executor;. for PostgreSQL.
4444
*/
4545
class Executor : public orm::Executor {
46+
private:
47+
48+
/*
49+
* We need this invalidator to correlate abstract orm::Connection to its correct invalidator.
50+
*/
51+
class ConnectionInvalidator : public provider::Invalidator<orm::Connection> {
52+
public:
53+
void invalidate(const std::shared_ptr<orm::Connection>& connection) override;
54+
};
55+
4656
private:
4757

4858
struct QueryParameter {
@@ -109,12 +119,13 @@ class Executor : public orm::Executor {
109119
const provider::ResourceHandle<orm::Connection>& connection);
110120

111121
private:
112-
std::shared_ptr<provider::Provider<orm::Connection>> m_connectionProvider;
122+
std::shared_ptr<ConnectionInvalidator> m_connectionInvalidator;
123+
std::shared_ptr<provider::Provider<Connection>> m_connectionProvider;
113124
std::shared_ptr<mapping::ResultMapper> m_resultMapper;
114125
mapping::Serializer m_serializer;
115126
public:
116127

117-
Executor(const std::shared_ptr<provider::Provider<orm::Connection>>& connectionProvider);
128+
Executor(const std::shared_ptr<provider::Provider<Connection>>& connectionProvider);
118129

119130
std::shared_ptr<data::mapping::TypeResolver> createTypeResolver() override;
120131

test/oatpp-postgresql/types/ArrayTest.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ void ArrayTest::onRun() {
112112
OATPP_LOGI(TAG, "DB-URL='%s'", TEST_DB_URL);
113113

114114
auto connectionProvider = std::make_shared<oatpp::postgresql::ConnectionProvider>(TEST_DB_URL);
115-
auto executor = std::make_shared<oatpp::postgresql::Executor>(connectionProvider);
115+
auto connectionPool = oatpp::postgresql::ConnectionPool::createShared(connectionProvider,
116+
10,
117+
std::chrono::seconds(3));
118+
auto executor = std::make_shared<oatpp::postgresql::Executor>(connectionPool);
116119

117120
auto client = MyClient(executor);
118121

@@ -483,7 +486,7 @@ void ArrayTest::onRun() {
483486

484487
}
485488

486-
489+
connectionPool->stop();
487490

488491
}
489492

0 commit comments

Comments
 (0)