From 4edae3f518353bb21a02fcda2dfcff83c5a72fc3 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 26 Jan 2012 12:08:39 +0100 Subject: New onCommit scripting system. --- server/src/pracrodaopgsql.cc | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'server/src/pracrodaopgsql.cc') diff --git a/server/src/pracrodaopgsql.cc b/server/src/pracrodaopgsql.cc index f9a773f..db0a9aa 100644 --- a/server/src/pracrodaopgsql.cc +++ b/server/src/pracrodaopgsql.cc @@ -228,6 +228,7 @@ void PracroDAOPgsql::commitTransaction(std::string sessionid, } +//#define NEW Values PracroDAOPgsql::getLatestValues(std::string sessionid, std::string patientid, Macro *macro, @@ -261,6 +262,70 @@ Values PracroDAOPgsql::getLatestValues(std::string sessionid, } pqxx::work W(*conn); + +#ifdef NEW + + // Do not search for nothing... + if(fieldnames.size() == 0) return values; + + std::string names; + std::vector< std::string >::iterator fni = fieldnames.begin(); + while(fni != fieldnames.end()) { + if(names != "") names += " OR "; + names += "name='" + W.esc(*fni) + "'"; + fni++; + } + + std::string macros; + if(macro) { + macros += " AND macro='" + macro->name + "'"; + if(macro->version != "") + macros += " AND t.version='" + macro->version + "'"; + } + + uncom = uncom; + query = "SELECT uid FROM commits WHERE patientid='"+patientid+"' AND" + " \"timestamp\">="+soldest.str()+" AND" + " (status='committed' OR uid="+sessionid+");"; + DEBUG(sql, "Query: %s\n", query.c_str()); + pqxx::result commits = W.exec(query); + pqxx::result::const_iterator ci = commits.begin(); + while(ci != commits.end()) { + std::string cid = (*ci)[0].c_str(); + + query = "SELECT uid, \"timestamp\" FROM transactions WHERE cid="+cid+ + macros+";"; + DEBUG(sql, "Query: %s\n", query.c_str()); + pqxx::result transactions = W.exec(query); + pqxx::result::const_iterator ti = transactions.begin(); + while(ti != transactions.end()) { + std::string tid = (*ti)[0].c_str(); + time_t timestamp = atol((*ti)[1].c_str()); + + query = "SELECT name, value FROM fields WHERE" + " transaction="+tid+" AND ("+ names +");"; + DEBUG(sql, "Query: %s\n", query.c_str()); + pqxx::result fields = W.exec(query); + DEBUG(sql, "Results: %lu\n", fields.size()); + pqxx::result::const_iterator fi = fields.begin(); + while(fi != fields.end()) { + std::string name = (*fi)[0].c_str(); + if(values.find(name) == values.end() || + values[name].timestamp <= timestamp) { + Value v; + v.value = (*fi)[1].c_str(); + v.timestamp = timestamp; + values[name] = v; + } + fi++; + } + + ti++; + } + + ci++; + } +#else/*NEW*/ std::string namecond; if(fieldnames.size() > 0) { @@ -318,6 +383,7 @@ Values PracroDAOPgsql::getLatestValues(std::string sessionid, values[(*ri)[0].c_str()] = v; ri++; } +#endif/*NEW*/ } catch (std::exception &e) { ERR_LOG(db, "Query failed: %s: %s\n", e.what(), query.c_str()); } -- cgit v1.2.3