diff options
Diffstat (limited to 'server/src/database.cc')
-rw-r--r-- | server/src/database.cc | 286 |
1 files changed, 9 insertions, 277 deletions
diff --git a/server/src/database.cc b/server/src/database.cc index 9406e1e..74579c1 100644 --- a/server/src/database.cc +++ b/server/src/database.cc @@ -1,4 +1,5 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ /*************************************************************************** * database.cc * @@ -30,288 +31,19 @@ #include <stdlib.h> #include "debug.h" +#include "pracrodaopgsql.h" -Database::Database(std::string hostname, std::string user, std::string password) -#ifndef WITHOUT_DB - : c("host=" + hostname + " user=" + user + " password=" + password + " dbname=pracro") -#endif/*WITHOUT_DB*/ +Database::Database(std::string _backend, std::string _host, std::string _port, std::string _user, std::string _passwd, std::string _dbname) { -} - -Database::~Database() -{ -} - -void Database::commit(std::string user, - std::string cpr, - Macro &_macro, - Fields &fields, - time_t now) -{ - if(fields.size() == 0) return; - - std::string version = _macro.attributes["version"]; - std::string macro = _macro.attributes["name"]; - std::stringstream timestamp; timestamp << now; - -#ifndef WITHOUT_DB - std::string ts; - try { - pqxx::work W(c); - ts = "INSERT INTO transactions VALUES (" - " '" + W.esc(cpr) + "', " - " '" + W.esc(macro) + "', " - " '" + W.esc(version) + "', " - " '" + W.esc(timestamp.str()) + "', " - " '" + W.esc(user) + "' " - ")" - ; - pqxx::result R = W.exec(ts); - std::stringstream oid; - oid << R.inserted_oid(); - - if(fields.size() > 0) { - // field table lookup - ts = "SELECT name FROM fieldnames WHERE name IN ( "; - std::map< std::string, std::string >::iterator i = fields.begin(); - ts += "'" + W.esc(i->first) + "'"; - i++; - while(i != fields.end()) { - ts += ", '" + W.esc(i->first) + "'"; - i++; - } - ts += ")"; - R = W.exec(ts); - PRACRO_DEBUG(db, "Database::commit: input fields: %d, output fields: %lu\n", fields.size(), R.size()); - - pqxx::result::const_iterator ri = R.begin(); - // Store known fields - while(ri != R.end()) { - pqxx::result::tuple t = *ri; - std::string name = t[0].c_str(); - - PRACRO_DEBUG(db, "Storing: %s with value %s\n", name.c_str(), fields[name].c_str()); - - ts = "INSERT INTO fields VALUES (" - " '" + W.esc(oid.str()) + "', " - " '" + W.esc(name) + "', " - " '" + W.esc(fields[name]) + "'" - ")" - ; - W.exec(ts); - ri++; - } - } - W.commit(); - } catch(std::exception &e) { - PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), ts.c_str()); - } -#else -#ifdef WITH_DEBUG - std::map< std::string, std::string >::iterator i = fields.begin(); - while(i != fields.end()) { - PRACRO_DEBUG(db, "Storing field '%s': '%s'\n", i->first, i->second); - i++; - } -#endif/*WITH_DEBUG*/ -#endif/*WITHOUT_DB*/ -} - -void Database::putResume(std::string user, - std::string cpr, - Macro &_macro, - std::string resume, - time_t now, - bool store_in_journal) -{ - std::string version = _macro.attributes["version"]; - std::string macro = _macro.attributes["name"]; - std::stringstream timestamp; timestamp << now; - -#ifndef WITHOUT_DB - std::string ts; - try { - pqxx::work W(c); - ts = "INSERT INTO journal VALUES (" - "'" + W.esc(cpr) + "', " - "'" + W.esc(macro) + "', " - "'" + W.esc(version) + "', " - "'" + W.esc(timestamp.str()) + "', " - "'" + W.esc(user) + "', " - "'" + W.esc(resume)+"'" - ")"; - pqxx::result R = W.exec(ts); - W.commit(); - } catch(std::exception &e) { - PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), ts.c_str()); + dao = NULL; + if(_backend == "pgsql") { + PRACRO_DEBUG(db, "construct(%s, %s, %s, %s, %s)\n", _host.c_str(), _port.c_str(), _user.c_str(), _passwd.c_str(), _dbname.c_str()); + dao = new PracroDAOPgsql(_host, _port, _user, _passwd, _dbname); } -#else -#ifdef WITH_DEBUG - PRACRO_DEBUG(db, "INSERT INTO journal VALUES ('%s', '%s', '%s', '%s', '%s', '%s')\n", - cpr.c_str(), - macro.c_str(), - version.c_str(), - timestamp.str().c_str(), - user.c_str(), - resume.c_str() - ); -#endif/*WITH_DEBUG*/ -#endif } - -std::string Database::getResume(std::string cpr, - std::string macro, - time_t oldest) -{ - std::string resume; - -#ifndef WITHOUT_DB - std::string query; - try { - pqxx::work W(c); - /* FIXME: argument 'oldest' is not used anywhere */ - query = "SELECT journal FROM journal" - " WHERE cpr = '" + W.esc(cpr) + "'" - " AND macro = '" + W.esc(macro) + "'" - " ORDER BY timestamp" - ; - pqxx::result R = W.exec(query); - pqxx::result::const_iterator ri = R.begin(); - /* FIXME: This will only get the *last* entry of the journal in var resume due to '=' and not '+=' */ - while(ri != R.end()) { - pqxx::result::tuple t = *ri; - resume = t[0].c_str(); - ri++; - } - } catch (std::exception &e) { - PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), query.c_str()); - } -#else -#ifdef WITH_DEBUG - PRACRO_DEBUG(db, "SELECT journal FROM journal WHERE cpr = '%s' AND macro = '%s' ORDER BY timestamp", cpr.c_str(), macro.c_str()); -#endif/*WITH_DEBUG*/ -#endif/*WITHOUT_DB*/ - - return resume; -} - - -Values Database::getValues(std::string cpr, - Fieldnames &fields, - time_t oldest) -{ - Values values; - -#ifndef WITHOUT_DB - std::string query; - std::stringstream soldest; soldest << oldest; - try { - pqxx::work W(c); - query = "SELECT f.name, f.value, t.timestamp FROM fields f JOIN transactions t ON t.oid = f.transaction " - " WHERE t.cpr = '" + W.esc(cpr) + "' " - " AND t.timestamp >= " + soldest.str(); - if(fields.size() > 0) { - std::vector< std::string >::iterator i = fields.begin(); - query += " AND f.name IN ('" + W.esc(*i) + "'"; - i++; - while(i != fields.end()) { - query += ", '" + W.esc(*i) + "'"; - i++; - } - query += ')'; - } - query += " ORDER BY t.timestamp "; - pqxx::result R = W.exec(query); - pqxx::result::const_iterator ri = R.begin(); - while(ri != R.end()) { - pqxx::result::tuple t = *ri; - Value v; - v.value = t[1].c_str(); - v.timestamp = atol(t[2].c_str()); - if(values.find(t[0].c_str()) == values.end() || - (values.find(t[0].c_str()) != values.end() && - values[t[0].c_str()].timestamp <= v.timestamp) ) { - values[t[0].c_str()] = v; - } - ri++; - } - } catch (std::exception &e) { - PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), query.c_str()); - } -#else -#ifdef WITH_DEBUG - PRACRO_DEBUG(db, "getValues(%s, <fields...>, %ld) -- not implemented without database...\n", cpr.c_str(), oldest); -#endif/*WITH_DEBUG*/ -#endif/*WITHOUT_DB*/ - - return values; -} - -bool Database::checkMacro(std::string cpr, - std::string macro, - time_t oldest) -{ -#ifndef WITHOUT_DB - std::string query; - std::stringstream soldest; soldest << oldest; - try { - pqxx::work W(c); - query = "SELECT oid FROM transactions" - " WHERE cpr = '" + W.esc(cpr) + "'" - " AND macro = '" + W.esc(macro) + "'" - " AND timestamp >= " + soldest.str() + "" - " ORDER BY timestamp" - ; - pqxx::result R = W.exec(query); - return R.size() != 0; - } catch(std::exception &e) { - PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), query.c_str()); - } -#else -#ifdef WITH_DEBUG - PRACRO_DEBUG(db, "SELECT oid FROM transactions WHERE cpr = '%s' AND macro = '%s' AND timestamp >= %ld ORDER BY timestamp\n", - cpr.c_str(), macro.c_str(), oldest); -#endif/*WITH_DEBUG*/ -#endif/*WITHOUT_DB*/ - - return false; -} - - - - -#ifdef TEST_DATABASE - -int main() +Database::~Database() { - Database db("localhost", "pracro", "pracro"); - - time_t now = time(NULL); - /* - Macro macro; - macro.attributes["name"] = "testmacro"; - macro.attributes["version"] = "1.0"; - - Fields fields; - fields["themeaning"] = "42"; - fields["microsoft"] = "waste of money"; - - db.commit("testuser", "1505050505", macro, fields, now); - - std::vector< std::string > fieldnames; - fieldnames.push_back("microsoft"); - fieldnames.push_back("themeaning"); - - Values results = db.getValues("1505050505", fieldnames, now); - Values::iterator i = results.begin(); - while(i != results.end()) { - Value v = i->second; - printf("%s -> %s (%u)\n", i->first.c_str(), v.value.c_str(), (unsigned int)v.timestamp); - i++; - } - */ - printf(db.getResume("1505050505", "B.2.5", now - 60 * 60 * 24).c_str()); + if(dao) delete dao; } -#endif/*TEST_DATABASE*/ |