From 93500a9656dffde57ab32410642c2dd74098b9f8 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 12 Nov 2009 10:02:54 +0000 Subject: Make database connection shared among threads and make is thread safe. --- server/src/database.h | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'server/src/database.h') diff --git a/server/src/database.h b/server/src/database.h index 396dda4..f253ba5 100644 --- a/server/src/database.h +++ b/server/src/database.h @@ -32,7 +32,7 @@ #include "pracrodao.h" #include "transaction.h" #include "template.h" - +#include "mutex.h" #include "debug.h" class Database { @@ -42,22 +42,31 @@ public: // Make a commit to the db void commitTransaction(std::string user, std::string patientid, Macro ¯o, Fields &fields, time_t now = time(NULL)) { + if(!dao) return; + mutex.lock(); PRACRO_DEBUG(db, "%s, %s, %s,...\n", user.c_str(), patientid.c_str(), macro.attributes["name"].c_str()); - if(dao) dao->commitTransaction(user, patientid, macro, fields, now); + dao->commitTransaction(user, patientid, macro, fields, now); + mutex.unlock(); } // Get a list of values from the db Values getValues(std::string patientid, Fieldnames &fieldnames, time_t oldest = 0) { + if(!dao) return Values(); + mutex.lock(); PRACRO_DEBUG(db, "%s, <%u fieldnames>, %ld\n", patientid.c_str(), fieldnames.size(), oldest); - if(dao) return dao->getLatestValues(patientid, NULL, fieldnames, oldest); - else return Values(); + Values values = dao->getLatestValues(patientid, NULL, fieldnames, oldest); + mutex.unlock(); + return values; } // Check if a macro has been committed. bool checkMacro(std::string patientid, std::string macro, time_t oldest = 0) { PRACRO_DEBUG(db, "%s, %s, %ld\n", patientid.c_str(), macro.c_str(), oldest); if(!dao) return false; - return dao->nrOfCommits(patientid, macro, oldest) > 0; + mutex.lock(); + bool res = dao->nrOfCommits(patientid, macro, oldest) > 0; + mutex.unlock(); + return res; } // Get latest resume of a given macro @@ -66,7 +75,9 @@ public: if(!dao) return ""; Fieldnames fn; fn.push_back("journal.resume"); + mutex.lock(); Values v = dao->getLatestValues(patientid, ¯o, fn, oldest); + mutex.unlock(); Values::iterator i = v.find("journal.resume"); if(i != v.end()) return i->second.value; else return ""; @@ -75,13 +86,17 @@ public: void addFieldname(std::string name, std::string description) { if(!dao) return; + mutex.lock(); dao->addFieldname(name, description); + mutex.unlock(); } void delFieldname(std::string name) { if(!dao) return; + mutex.lock(); dao->delFieldname(name); + mutex.unlock(); } std::vector getFieldnames() @@ -90,11 +105,15 @@ public: std::vector fieldnames; return fieldnames; } - return dao->getFieldnames(); + mutex.lock(); + std::vector fieldnames = dao->getFieldnames(); + mutex.unlock(); + return fieldnames; } private: PracroDAO *dao; + Mutex mutex; }; #endif/*__PRACRO_DATABASE_H__*/ -- cgit v1.2.3