X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/641204dfbdb9fc870cdd2e7f9e3169a44693e7bf..2574a28cbf000603bc31f61593dbf061ff56c1d5:/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp index e316beaf..e5738286 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp @@ -22,7 +22,7 @@ * This file contains a realization of a base postgresql-storage plugin class * * v. 1.3 - * FreeMb logging on dosconnects added + * FreeMb logging on disconnects added * * v. 1.2 * Reconnection on faults added @@ -38,48 +38,34 @@ * */ +#include "postgresql_store.h" + +#include "stg/common.h" // str2x, printfd + #include #include -#include #include -#include "postgresql_store.h" -#include "postgresql_store_utils.h" -#include "base_settings.h" - -class POSTGRESQL_STORE_CREATOR -{ -public: - POSTGRESQL_STORE_CREATOR() - : pqStore(new POSTGRESQL_STORE()) - { - }; - ~POSTGRESQL_STORE_CREATOR() - { - delete pqStore; - }; - POSTGRESQL_STORE * GetStore() { return pqStore; }; -private: - POSTGRESQL_STORE * pqStore; -} pqStoreeCreator; - -//----------------------------------------------------------------------------- -BASE_STORE * GetStore() +extern "C" STG::Store* GetStore() { -return pqStoreeCreator.GetStore(); + static POSTGRESQL_STORE plugin; + return &plugin; } //----------------------------------------------------------------------------- POSTGRESQL_STORE::POSTGRESQL_STORE() - : connection(NULL) + : versionString("postgresql_store v.1.3"), + server("localhost"), + database("stargazer"), + user("stg"), + password("123456"), + clientEncoding("KOI8"), + version(0), + retries(3), + connection(NULL), + logger(STG::PluginLogger::get("store_postgresql")) { -server = "localhost"; -database = "stargazer"; -user = "stg"; -password = "123456"; -versionString = "postgresql_store v.1.3"; -pthread_mutex_init(&mutex, NULL); } //----------------------------------------------------------------------------- POSTGRESQL_STORE::~POSTGRESQL_STORE() @@ -88,33 +74,41 @@ if (connection) { PQfinish(connection); } -pthread_mutex_destroy(&mutex); } //----------------------------------------------------------------------------- int POSTGRESQL_STORE::ParseSettings() { -std::vector::iterator i; -string s; +std::vector::iterator i; for(i = settings.moduleParams.begin(); i != settings.moduleParams.end(); ++i) { - s = i->param; - std::transform(s.begin(), s.end(), s.begin(), ToLower()); + if (i->value.empty()) + continue; + std::string s = ToLower(i->param); if (s == "server") { - server = *(i->value.begin()); + server = i->value.front(); } if (s == "database") { - database = *(i->value.begin()); + database = i->value.front(); } if (s == "user") { - user = *(i->value.begin()); + user = i->value.front(); } if (s == "password") { - password = *(i->value.begin()); + password = i->value.front(); + } + if (s == "retries") + { + if (str2x(i->value.front(), retries)) + { + strError = "Invalid 'retries' value"; + printfd(__FILE__, "POSTGRESQL_STORE::ParseSettings(): '%s'\n", strError.c_str()); + return -1; + } } } @@ -137,7 +131,8 @@ if (PQstatus(connection) != CONNECTION_OK) { strError = PQerrorMessage(connection); printfd(__FILE__, "POSTGRESQL_STORE::Connect(): '%s'\n", strError.c_str()); - return 1; + // Will try to connect later + return 0; } if (PQsetClientEncoding(connection, clientEncoding.c_str())) @@ -152,7 +147,12 @@ return CheckVersion(); //----------------------------------------------------------------------------- int POSTGRESQL_STORE::Reset() const { -PQreset(connection); +for (int i = 0; i < retries && PQstatus(connection) != CONNECTION_OK; ++i) + { + struct timespec ts = {1, 0}; + nanosleep(&ts, NULL); + PQreset(connection); + } if (PQstatus(connection) != CONNECTION_OK) { @@ -165,7 +165,7 @@ if (PQsetClientEncoding(connection, clientEncoding.c_str())) { strError = PQerrorMessage(connection); printfd(__FILE__, "POSTGRESQL_STORE::Reset(): '%s'\n", strError.c_str()); - return 1; + return -1; } return CheckVersion(); @@ -223,6 +223,8 @@ if (CommitTransaction()) return -1; } +logger("POSTGRESQL_STORE: Current DB schema version: %d", version); + return 0; } //-----------------------------------------------------------------------------