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 )
{
assert_connection();
assert_connection_is_working();
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)
{
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()
{
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( 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;
}
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();
}
return !attempts_exceeded;
}
// 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;
if( !pg_conn )
{
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,
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_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 void allocate_default_expression();
virtual void overwrite(pt::TextStream & stream);