X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/a2be5aa7e45c4f8c7561e92a7996170beba66815..7da963e5f936a329b63c308e4031b59390f42a92:/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 d9586b89..80431c0d 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp @@ -40,45 +40,42 @@ #include #include -#include #include -#include "postgresql_store.h" +#include "stg/module_settings.h" +#include "stg/plugin_creator.h" #include "postgresql_store_utils.h" -#include "base_settings.h" +#include "postgresql_store.h" -class POSTGRESQL_STORE_CREATOR +namespace { -public: - POSTGRESQL_STORE_CREATOR() - : pqStore(new POSTGRESQL_STORE()) - { - }; - ~POSTGRESQL_STORE_CREATOR() - { - delete pqStore; - }; - POSTGRESQL_STORE * GetStore() { return pqStore; }; -private: - POSTGRESQL_STORE * pqStore; -} pqStoreeCreator; +PLUGIN_CREATOR pgsc; +} + +extern "C" STORE * GetStore(); //----------------------------------------------------------------------------- -BASE_STORE * GetStore() +STORE * GetStore() { -return pqStoreeCreator.GetStore(); +return pgsc.GetPlugin(); } //----------------------------------------------------------------------------- POSTGRESQL_STORE::POSTGRESQL_STORE() : versionString("postgresql_store v.1.3"), + strError(), server("localhost"), database("stargazer"), user("stg"), password("123456"), + clientEncoding("KOI8"), + settings(), + mutex(), version(0), - connection(NULL) + retries(3), + connection(NULL), + logger(GetPluginLogger(GetStgLogger(), "store_postgresql")) { pthread_mutex_init(&mutex, NULL); } @@ -95,12 +92,11 @@ pthread_mutex_destroy(&mutex); int POSTGRESQL_STORE::ParseSettings() { std::vector::iterator i; -string s; +std::string s; for(i = settings.moduleParams.begin(); i != settings.moduleParams.end(); ++i) { - s = i->param; - std::transform(s.begin(), s.end(), s.begin(), ToLower()); + s = ToLower(i->param); if (s == "server") { server = *(i->value.begin()); @@ -117,6 +113,15 @@ for(i = settings.moduleParams.begin(); i != settings.moduleParams.end(); ++i) { password = *(i->value.begin()); } + if (s == "retries") + { + if (str2x(*(i->value.begin()), retries)) + { + strError = "Invalid 'retries' value"; + printfd(__FILE__, "POSTGRESQL_STORE::ParseSettings(): '%s'\n", strError.c_str()); + return -1; + } + } } clientEncoding = "KOI8"; @@ -138,7 +143,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())) @@ -153,7 +159,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) { @@ -166,7 +177,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(); @@ -224,6 +235,8 @@ if (CommitTransaction()) return -1; } +logger("POSTGRESQL_STORE: Current DB schema version: %d", version); + return 0; } //-----------------------------------------------------------------------------