diff options
Diffstat (limited to 'server/src/artefact.cc')
-rw-r--r-- | server/src/artefact.cc | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/server/src/artefact.cc b/server/src/artefact.cc index 836e5a9..cc29b77 100644 --- a/server/src/artefact.cc +++ b/server/src/artefact.cc @@ -30,13 +30,71 @@ #include "debug.h" #include "configuration.h" +#include "queryparser.h" + Artefact::Artefact() { #ifndef WITHOUT_PENTOMINOS PRACRO_DEBUG(artefact, "Creating artefact connection %s : %d", - Conf::artefact_addr.c_str(), Conf::artefact_port) - socket.connect(Conf::artefact_addr, Conf::artefact_port); + Conf::artefact_addr.c_str(), Conf::artefact_port); #endif/*WITHOUT_PENTOMINOS*/ + + atfh = atf_init(); + if(!atfh) PRACRO_ERR(artefact, "Out of memory!\n"); + + conn = atf_connect(atfh, + Conf::artefact_addr.c_str(), + Conf::artefact_port, + Conf::artefact_use_ssl); +} + +Artefact::~Artefact() +{ + atf_disconnect(conn); + atf_close(atfh); +} + +QueryResult Artefact::exec(Query &query, + std::string patientid, + std::string user) +{ + QueryParser parser; + + atf_transaction_t *trans = atf_new_transaction(conn, patientid.c_str()); + atf_querylist_t *qlist = atf_new_querylist(trans, user.c_str()); + + atf_id id = atf_add_query(qlist, + query.attributes["class"].c_str(), + 0/*oldest*/, "xml"/*replyformat*/); + + atf_reply_t *reply = atf_commit(trans, NULL, qlist); + + atf_status_t status = atf_get_reply_status(reply, id); + + switch(status) { + case ATF_STATUS_OK: + { + size_t bufsize = atf_get_reply_size(reply, id); + char *buf = new char[bufsize]; + + ssize_t size = atf_get_reply_data(reply, id, buf, size); + parser.parse(buf, size); + + delete[] buf; + } + break; + + case ATF_STATUS_ERROR: + PRACRO_ERR(artefact, "Error in artefact query.\n"); + break; + } + + atf_free_reply(reply); + + atf_free_querylist(qlist); + atf_free_transaction(trans); + + return parser.result; } |