summaryrefslogtreecommitdiff
path: root/server/src/pracrodaopgsql.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2012-01-26 12:08:39 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2012-01-26 12:08:39 +0100
commit4edae3f518353bb21a02fcda2dfcff83c5a72fc3 (patch)
tree7902e2b6af1dabdb5c49b906b8592874bfce407d /server/src/pracrodaopgsql.cc
parente9ff9842e9a8c178f5e17c0cf5dde16db1a0d8fc (diff)
New onCommit scripting system.
Diffstat (limited to 'server/src/pracrodaopgsql.cc')
-rw-r--r--server/src/pracrodaopgsql.cc66
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());
}