allow specify how many times we can try to connect to the database

This commit is contained in:
Tomasz Sowa 2022-04-29 05:56:02 +02:00
parent d384929e75
commit 469294502e
2 changed files with 67 additions and 15 deletions

View File

@ -101,7 +101,7 @@ bool PostgreSQLConnector::do_query(const char * query_str, PostgreSQLQueryResult
{ {
if( PQstatus(pg_conn) != CONNECTION_OK ) if( PQstatus(pg_conn) != CONNECTION_OK )
{ {
assert_connection(); assert_connection_is_working();
psql_result->psql_result = PQexec(pg_conn, query_str); psql_result->psql_result = PQexec(pg_conn, query_str);
} }
} }
@ -431,6 +431,8 @@ void PostgreSQLConnector::set_conn_param(const std::wstring & database_name, con
} }
void PostgreSQLConnector::overwrite(pt::TextStream & stream) void PostgreSQLConnector::overwrite(pt::TextStream & stream)
{ {
pt::TextStream::iterator i = stream.begin(); pt::TextStream::iterator i = stream.begin();
@ -511,6 +513,17 @@ void PostgreSQLConnector::connect()
// //
// //
void PostgreSQLConnector::log_no_connection(size_t attempts)
{
if( log )
{
(*log) << pt::Log::log2 << "Morm: connection to the database cannot be established";
(*log) << pt::Log::log3 << ", (" << attempts << " attempt(s))" << pt::Log::logend;
(*log) << pt::Log::logsave;
}
}
void PostgreSQLConnector::log_connection_socket() void PostgreSQLConnector::log_connection_socket()
{ {
if( pg_conn && log ) if( pg_conn && log )
@ -521,8 +534,18 @@ void PostgreSQLConnector::log_connection_socket()
} }
} }
void PostgreSQLConnector::wait_for_connection()
bool PostgreSQLConnector::wait_for_connection(size_t attempts_max, size_t attempt_delay)
{ {
size_t attempts = 0;
bool attempts_exceeded = false;
if( attempt_delay == 0 )
attempt_delay = 1;
if( attempt_delay > 120 )
attempt_delay = 120;
if( !pg_conn || PQstatus(pg_conn) != CONNECTION_OK ) if( !pg_conn || PQstatus(pg_conn) != CONNECTION_OK )
{ {
if( log ) if( log )
@ -530,24 +553,41 @@ void PostgreSQLConnector::wait_for_connection()
(*log) << pt::Log::log3 << "Morm: waiting for the db to be ready...." << pt::Log::logend << pt::Log::logsave; (*log) << pt::Log::log3 << "Morm: waiting for the db to be ready...." << pt::Log::logend << pt::Log::logsave;
} }
while( !assert_connection(false) ) while( !attempts_exceeded && !assert_connection_is_working(false) )
{ {
sleep(5); if( attempts_max != 0 )
} {
attempts += 1;
attempts_exceeded = (attempts >= attempts_max);
}
if( !attempts_exceeded )
{
sleep(attempt_delay);
}
}
}
if( attempts_exceeded )
{
log_no_connection(attempts);
}
else
{
log_connection_socket(); log_connection_socket();
} }
return !attempts_exceeded;
} }
// IMPROVE ME what about the exception now? // IMPROVE ME what about the exception now?
bool PostgreSQLConnector::assert_connection(bool put_log) bool PostgreSQLConnector::assert_connection_is_working(bool put_log)
{ {
bool was_connection = true; bool was_connection = true;
if( !pg_conn ) if( !pg_conn )
{ {
was_connection = false; was_connection = false;

View File

@ -104,17 +104,23 @@ public:
virtual void set_conn_param(const std::wstring & database_host, const std::wstring & database_hostaddr, const std::wstring & database_port, virtual void set_conn_param(const std::wstring & database_host, const std::wstring & database_hostaddr, const std::wstring & database_port,
const std::wstring & database, const std::wstring & user, const std::wstring & pass); const std::wstring & database, const std::wstring & user, const std::wstring & pass);
virtual void set_conn_param(const std::wstring & database, const std::wstring & user, const std::wstring & pass); virtual void set_conn_param(const std::wstring & database, const std::wstring & user, const std::wstring & pass);
virtual void connect();
virtual void wait_for_connection();
virtual void close();
//virtual bool assert_connection(bool put_log = true, bool throw_if_no_connection = true);
virtual bool assert_connection(bool put_log = true);
virtual void set_db_parameters();
virtual void log_connection_socket();
/*
* waiting for a valid connection to the database
*
* attempts_max - how many connection attempts are allowed (0 - infinite)
* attempt_delay - delay between each attempt (in seconds)
*
*/
virtual bool wait_for_connection(size_t attempts_max = 0, size_t attempt_delay = 5);
/*
* close the connection with the database if it was open
*/
virtual void close();
@ -132,6 +138,12 @@ protected:
std::wstring db_user; std::wstring db_user;
std::wstring db_pass; std::wstring db_pass;
virtual void set_db_parameters();
virtual void log_no_connection(size_t attempts);
virtual void log_connection_socket();
virtual bool assert_connection_is_working(bool put_log = true);
virtual void connect();
virtual bool do_query(const char * query_str, PostgreSQLQueryResult * psql_result); virtual bool do_query(const char * query_str, PostgreSQLQueryResult * psql_result);
virtual void allocate_default_expression(); virtual void allocate_default_expression();
virtual void overwrite(pt::TextStream & stream); virtual void overwrite(pt::TextStream & stream);