diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-01-26 12:08:39 +0100 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-01-26 12:08:39 +0100 |
commit | 4edae3f518353bb21a02fcda2dfcff83c5a72fc3 (patch) | |
tree | 7902e2b6af1dabdb5c49b906b8592874bfce407d /server/src/pracrodaopgsql.cc | |
parent | e9ff9842e9a8c178f5e17c0cf5dde16db1a0d8fc (diff) |
New onCommit scripting system.
Diffstat (limited to 'server/src/pracrodaopgsql.cc')
-rw-r--r-- | server/src/pracrodaopgsql.cc | 66 |
1 files changed, 66 insertions, 0 deletions
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()); } |