From eb91a2967ed18aa24166f13a635091e2193aecc0 Mon Sep 17 00:00:00 2001 From: deva Date: Mon, 25 Apr 2011 06:27:08 +0000 Subject: Initial version of praxisd communications class. --- server/configure.in | 5 + server/getdata/Makefile.am | 9 +- server/getdata/getdata.cc | 54 +++++--- server/src/Makefile.am | 2 + server/src/praxisd.cc | 317 +++++++++++++++++++++++++++++++++++++++++++++ server/src/praxisd.h | 141 ++++++++++++++++++++ 6 files changed, 508 insertions(+), 20 deletions(-) create mode 100644 server/src/praxisd.cc create mode 100644 server/src/praxisd.h diff --git a/server/configure.in b/server/configure.in index 63a7111..dc7856c 100644 --- a/server/configure.in +++ b/server/configure.in @@ -219,6 +219,11 @@ LIBS="$tmp_LIBS" AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_LIBS) +dnl ====================== +dnl Check for cURL library +dnl ====================== +PKG_CHECK_MODULES(CURL, libcurl >= 7.9.5) + AC_OUTPUT( Makefile src/Makefile diff --git a/server/getdata/Makefile.am b/server/getdata/Makefile.am index 8cd960f..c0e6f09 100644 --- a/server/getdata/Makefile.am +++ b/server/getdata/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = getdata +bin_PROGRAMS = getdata convertdata getdata_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) @@ -7,6 +7,13 @@ getdata_CXXFLAGS = $(PQXX_CXXFLAGS) $(CONFIG_CXXFLAGS) getdata_SOURCES = \ getdata.cc +convertdata_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) + +convertdata_CXXFLAGS = $(PQXX_CXXFLAGS) $(CONFIG_CXXFLAGS) + +convertdata_SOURCES = \ + convertdata.cc + EXTRA_DIST = ################ diff --git a/server/getdata/getdata.cc b/server/getdata/getdata.cc index b051de0..717d1a9 100644 --- a/server/getdata/getdata.cc +++ b/server/getdata/getdata.cc @@ -28,22 +28,16 @@ #include #include #include +/* +Commits: + patientid | template | version | timestamp | uid | status + +Transactions: + macro | version | timestamp | user | uid | cid -enum { - PATIENTID = 0, - MACRO = 1, - VERSION = 2, - TIMESTAMP = 3, - USER = 4, - UID = 5, - TEMPLATE = 6 -}; - -enum { - TRANSACTION = 0, - NAME = 1, - VALUE = 2 -}; +Fields: + transaction | name | value +*/ #define SEP "\t" @@ -62,6 +56,32 @@ std::string escape(std::string str) int main() { + std::vector fields; + fields.push_back("visus.egen_korr.mangler.odxt"); + fields.push_back("visus.egen_korr.kontrast.odxt"); + fields.push_back("visus.egen_korr.snellen.odxt"); + fields.push_back("visus.egen_korr.etdrs.odxt"); + fields.push_back("visus.egen_korr.korr.sf.odxt"); + fields.push_back("visus.egen_korr.korr.cyl.odxt"); + fields.push_back("visus.egen_korr.korr.grader.odxt"); + fields.push_back("visus.egen_korr.st_hul.odxt"); + fields.push_back("visus.egen_korr.st_hul.snellen.odxt"); + fields.push_back("visus.egen_korr.st_hul.etdrs.odxt"); + fields.push_back("visus.egen_korr.mangler.osin"); + fields.push_back("visus.egen_korr.kontrast.osin"); + fields.push_back("visus.egen_korr.snellen.osin"); + fields.push_back("visus.egen_korr.etdrs.osin"); + fields.push_back("visus.egen_korr.korr.sf.osin"); + fields.push_back("visus.egen_korr.korr.cyl.osin"); + fields.push_back("visus.egen_korr.korr.grader.osin"); + fields.push_back("visus.egen_korr.st_hul.osin"); + fields.push_back("visus.egen_korr.st_hul.snellen.osin"); + fields.push_back("visus.egen_korr.st_hul.etdrs.osin"); + fields.push_back("visus.egen_korr.ou"); + fields.push_back("visus.egen_korr.kontrast.ou"); + fields.push_back("visus.egen_korr.snellen.ou"); + fields.push_back("visus.egen_korr.etdrs.ou"); + std::string like = "ref"; std::string host = "localhost"; @@ -76,11 +96,7 @@ int main() pqxx::connection conn(cs); pqxx::work W(conn); - // transactions: - // patientid | macro | version | timestamp | user | uid | template - // fields: - // transaction | name | value std::map fieldnames; int idx = 0; diff --git a/server/src/Makefile.am b/server/src/Makefile.am index 003148e..ccbc63b 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -44,6 +44,7 @@ pracrod_SOURCES = \ pracrodao.cc \ pracrodaopgsql.cc \ pracrodaotest.cc \ + praxisd.cc \ queryhandlerpentominos.cc \ queryhandlerpracro.cc \ queryparser.cc \ @@ -101,6 +102,7 @@ EXTRA_DIST = \ pracrodao.h \ pracrodaopgsql.h \ pracrodaotest.h \ + praxisd.h \ queryhandler.h \ queryhandlerpentominos.h \ queryhandlerpracro.h \ diff --git a/server/src/praxisd.cc b/server/src/praxisd.cc new file mode 100644 index 0000000..b4b0a88 --- /dev/null +++ b/server/src/praxisd.cc @@ -0,0 +1,317 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * praxisd.cc + * + * Tue Apr 19 09:00:29 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "praxisd.h" + +static std::string strtime(bool with_sec = true) +{ + std::string ret; + + time_t epoch = time(NULL); + struct tm t; + localtime_r(&epoch, &t); + char buf[32]; + snprintf(buf, sizeof(buf), "%04d-%02d-%02d", + t.tm_year + 1900, t.tm_mon + 1, t.tm_mday); + ret = buf; + + if(with_sec) { + snprintf(buf, sizeof(buf), "%02d:%02d:%02d", + t.tm_hour, t.tm_min, t.tm_sec); + ret += " "; + ret += buf; + } + + return ret; +} + +static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) +{ + std::string *str = (std::string*)userp; + str->append((char*)buffer, size * nmemb); + return size * nmemb; +} + +Praxisd::Praxisd(std::string h, int port) +{ + ch = curl_easy_init(); + host = h; + + curl_easy_setopt(ch, CURLOPT_PORT, port); + curl_easy_setopt(ch, CURLOPT_FAILONERROR, 1L); + curl_easy_setopt(ch, CURLOPT_TIMEOUT, 150L); + curl_easy_setopt(ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_easy_setopt(ch, CURLOPT_CONNECTTIMEOUT, 15L); + curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(ch, CURLOPT_USERAGENT, "libpraxisd"); + curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(ch, CURLOPT_FILETIME, 1L); + curl_easy_setopt(ch, CURLOPT_HEADER, 0L); +} + +Praxisd::~Praxisd() +{ + curl_easy_cleanup(ch); +} + +// Get Journal By CPR +std::string Praxisd::journal_get_by_cpr(std::string cpr) +{ + std::string journal; + + std::string uri = host + "/praxisd/1.0/journal/get_by_cpr?cpr=" + cpr; + curl_easy_setopt(ch, CURLOPT_URL, uri.c_str()); + + curl_easy_setopt(ch, CURLOPT_POST, 0L); + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &journal); + + CURLcode errornum = curl_easy_perform(ch); + if(errornum != CURLE_OK) { + printf("Ouch %d\n", errornum); + } + + time_t time; + errornum = curl_easy_getinfo(ch, CURLINFO_FILETIME, &time); + + return journal; +} + +time_t Praxisd::journal_last_changed(std::string cpr) +{ + std::string journal; + + std::string uri = host + "/praxisd/1.0/journal/get_by_cpr?cpr=" + cpr; + curl_easy_setopt(ch, CURLOPT_URL, uri.c_str()); + + curl_easy_setopt(ch, CURLOPT_POST, 0L); + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &journal); + + CURLcode errornum = curl_easy_perform(ch); + if(errornum != CURLE_OK) { + printf("Ouch %d\n", errornum); + } + + time_t time; + errornum = curl_easy_getinfo(ch, CURLINFO_FILETIME, &time); + + return time; +} + + +void Praxisd::journal_add(std::string cpr, std::string entry) +{ + std::string xml; + xml += "\n"; + xml += " "+entry+"\n"; + xml += "\n"; + + curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, (long)xml.length()); + curl_easy_setopt(ch, CURLOPT_POSTFIELDS, xml.c_str()); + curl_easy_setopt(ch, CURLOPT_POST, 1L); + + struct curl_slist *slist = NULL; + // Unset 'Expect' header, set by CURLOPT_POSTFIELDS + slist = curl_slist_append(slist, "Expect:"); + slist = curl_slist_append(slist, "Content-Type: text/xml"); + slist = curl_slist_append(slist, "Connection: keep-alive"); + curl_easy_setopt(ch, CURLOPT_HTTPHEADER, slist); + + std::string uri = host + "/praxisd/1.0/journal/add"; + curl_easy_setopt(ch, CURLOPT_URL, uri.c_str()); + + std::string reply; + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &reply); + + CURLcode errornum = curl_easy_perform(ch); + if(errornum != CURLE_OK) { + printf("Ouch: %d %s\n", errornum, reply.c_str()); + } +} + +void Praxisd::add_sogeord(std::string cpr, std::string sogeord, + std::string sogetxt) +{ + + std::string datestr = strtime(false); + + std::string xml; + xml += "\n"; + xml += " \n"; + xml += " "+ + sogetxt+"\n"; + xml += " \n"; + xml += "\n"; + + curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, (long)xml.length()); + curl_easy_setopt(ch, CURLOPT_POSTFIELDS, xml.c_str()); + curl_easy_setopt(ch, CURLOPT_POST, 1L); + + struct curl_slist *slist = NULL; + // Unset 'Expect' header, set by CURLOPT_POSTFIELDS + slist = curl_slist_append(slist, "Expect:"); + slist = curl_slist_append(slist, "Content-Type: text/xml"); + slist = curl_slist_append(slist, "Connection: keep-alive"); + curl_easy_setopt(ch, CURLOPT_HTTPHEADER, slist); + + std::string uri = host + "/praxisd/1.0/patient/add_sogeord"; + curl_easy_setopt(ch, CURLOPT_URL, uri.c_str()); + + std::string reply; + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &reply); + + CURLcode errornum = curl_easy_perform(ch); + if(errornum != CURLE_OK) { + printf("Ouch: %d %s\n", errornum, reply.c_str()); + } +} + +#define DOTAG(x) if(name == #x) str = &p.x; +#include "saxparser.h" +class PatientParser : public SAXParser { +public: + PatientParser(Praxisd::patient_t &_p) : p(_p) { str = NULL; } + + void characterData(std::string &data) + { + if(str) *str += data; + } + + void startTag(std::string name, std::map attr) + { + DOTAG(fornavne); + DOTAG(efternavn); + DOTAG(stilling); + DOTAG(gade); + DOTAG(by); + DOTAG(telefonnumre); + DOTAG(sikringsgr); + DOTAG(amtsnr); + DOTAG(sygekontor); + DOTAG(henvnr); + DOTAG(frilinie1); + DOTAG(frilinie2); + DOTAG(frilinie3); + DOTAG(frilinie4); + DOTAG(frilinie5); + DOTAG(ydernr); + DOTAG(created); + DOTAG(donottouch); + DOTAG(visus); + DOTAG(labkort); + DOTAG(medkort); + DOTAG(jlock); + DOTAG(unknown1); + DOTAG(henvdato); + DOTAG(aarhund); + DOTAG(fakturadato); + DOTAG(fakturabelob); + DOTAG(betaldato); + DOTAG(betalbelob); + DOTAG(jdato); + DOTAG(unknown250); + DOTAG(unknown251); + DOTAG(jtime); + if(name == "sogeords") {} // do nothing + if(name == "sogeord") { + Praxisd::sogeord_t s; + if(attr.find("sogenr") != attr.end()) s.sogenr = attr["sogenr"]; + if(attr.find("sogedatpo") != attr.end()) s.sogedato = attr["sogedato"]; + p.sogeord.push_back(s); + str = &p.sogeord[p.sogeord.size() - 1].sogetxt; + } + } + + void endTag(std::string name) + { + str = NULL; + } + +private: + std::string *str; + Praxisd::patient_t &p; +}; + +Praxisd::patient_t Praxisd::patient_get_by_cpr(std::string cpr) +{ + patient_t p; + + std::string xml; + + std::string uri = host + "/praxisd/1.0/patient/get_by_cpr?cpr=" + cpr; + curl_easy_setopt(ch, CURLOPT_URL, uri.c_str()); + + curl_easy_setopt(ch, CURLOPT_POST, 0L); + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &xml); + + CURLcode errornum = curl_easy_perform(ch); + if(errornum != CURLE_OK) { + printf("Ouch %d\n", errornum); + } + + PatientParser parser(p); + parser.parse(xml.data(), xml.length()); + + return p; +} + +#ifdef TEST_PRAXISD +//deps: saxparser.cc debug.cc log.cc +//cflags: $(CURL_CFLAGS) $(EXPAT_CFLAGS) -I.. +//libs: $(CURL_LIBS) $(EXPAT_LIBS) +#include "test.h" + +#define NL "\r\n" +#define CPR "1505050505" + +TEST_BEGIN; + +Praxisd p("http://localhost", 10000); + +std::string j = p.journal_get_by_cpr(CPR); +TEST_NOTEQUAL(j, "", "Did we get a journal?"); + +std::string more = "less is more... much much more."; +p.journal_add(CPR, more); + +time_t changed = p.journal_last_changed(CPR); +TEST_EQUAL_INT(changed, time(NULL), "Changed just now?"); + +Praxisd::patient_t patient = p.patient_get_by_cpr(CPR); +TEST_EQUAL_STR(patient.fornavne, "Kristian", "Who are you?"); + +/* +std::string exp = j + more + NL; +std::string j2 = p.journal_get_by_cpr(CPR); +TEST_EQUAL_INT(exp.length(), j2.length(), "Compare lengths"); +TEST_EQUAL_STR(exp, j2, "Did we correctly append to the journal?"); +*/ + +p.add_sogeord(CPR, "CA0003", "Nolder"); + +TEST_END; + +#endif/*TEST_PRAXISD*/ diff --git a/server/src/praxisd.h b/server/src/praxisd.h new file mode 100644 index 0000000..c0f6666 --- /dev/null +++ b/server/src/praxisd.h @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * praxisd.h + * + * Tue Apr 19 09:00:29 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __PRACRO_PRAXISD_H__ +#define __PRACRO_PRAXISD_H__ + +#include +#include + +#include + +#include + +class Praxisd { +public: + Praxisd(std::string host, int port); + ~Praxisd(); + + time_t journal_last_changed(std::string cpr); + + // Get Journal By CPR + std::string journal_get_by_cpr(std::string cpr); + + // Get Patient By CPR + typedef struct { + std::string sogenr; + std::string sogedato; + std::string sogetxt; + } sogeord_t; + + typedef struct { + std::string cpr; + std::string fornavne; + std::string efternavn; + std::string stilling; + std::string gade; + std::string by; + std::string telefonnumre; + std::string sikringsgr; + std::string amtsnr; + std::string sygekontor; + std::string henvnr; + std::string frilinie1; + std::string frilinie2; + std::string frilinie3; + std::string frilinie4; + std::string frilinie5; + std::vector sogeord; + std::string ydernr; + std::string created; + std::string donottouch; + std::string visus; + std::string labkort; + std::string medkort; + std::string jlock; + std::string unknown1; + std::string henvdato; + std::string aarhund; + std::string fakturadato; + std::string fakturabelob; + std::string betaldato; + std::string betalbelob; + std::string jdato; + std::string unknown250; + std::string unknown251; + std::string jtime; + } patient_t; + patient_t patient_get_by_cpr(std::string cpr); + +#if 0 + // Get Diverse From Sogenr + typedef struct {} diverse_t; + std::vector diverse_get_all_by_sogenr(std::string sogenr); + + // Get Aftale All by Date and Calendar + typedef struct {} aftale_t; + std::vector aftale_get_all_by_date_and_calendar(int cal, int year, + int month, int day); + + // Get Aftale All by CPR + std::vector aftale_get_all_by_cpr(std::string cpr); + + // Authenticate + bool authenticate(std::string user, std::string pass); + + // Get Name by UserID + std::string user_get_name_by_id(std::string user); + + // Get All Docmenu by CPR + typedef struct {} docmenu_t; + std::vector docmenu_get_all_by_cpr(std::string cpr); + + // Get Docmenu by Name and CPR + std::string docmenu_get_by_cpr_and_name(std::string cpr, std::string name); +#endif + + // POST: + // Add To Journal + void journal_add(std::string cpr, std::string entry); + + // Update Patient + + // Add Sogeord to Patient + void add_sogeord(std::string cpr, std::string sogeord, std::string sogetxt); + + // Update Aftale + // Add Aftale + // Delete Aftale + // Add File to Docmenu + // Delete File from Docmenu + +private: + CURL *ch; + std::string host; +}; + +#endif/*__PRACRO_PRAXISD_H__*/ -- cgit v1.2.3