Browse Source

Modification de la table publi.

Ajout des id dans la table result
Renvoi d'un arraystring pour les idresult
Modification de la macro _W pour MSW
Errortest sur l'access denied du proxy
Debut du fetch et du parsing
master
Maxime Wack 11 years ago
parent
commit
ce1d6175aa
6 changed files with 210 additions and 39 deletions
  1. +41
    -3
      CosMoS/bdd.cpp
  2. +4
    -2
      CosMoS/bdd.h
  3. +1
    -1
      CosMoS/misc.h
  4. +158
    -31
      CosMoS/recherche.cpp
  5. +4
    -0
      CosMoS/recherche.h
  6. +2
    -2
      Sante_Pub.workspace

+ 41
- 3
CosMoS/bdd.cpp View File

@@ -27,7 +27,7 @@ void class_bdd::createEmpty(const wxString& path)
rc += sqlite3_open_v2(_C(path), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
rc += sqlite3_exec(db, "CREATE TABLE Consult(id INTEGER PRIMARY KEY ASC, n_dossier INTEGER, nom VARCHAR(50), prenom VARCHAR(50), responsable VARCHAR(100), consultant VARCHAR(50), theme TEXT, etablissement VARCHAR(100), travail VARCHAR(50), date_cs DATE, publi_prevue BOOLEAN, service VARCHAR(100));", NULL, NULL, NULL);
rc += sqlite3_exec(db, "CREATE TABLE Result(id INTEGER PRIMARY KEY ASC, publi BOOLEAN DEFAULT 0, publi_CHU BOOLEAN DEFAULT 0, cs_associe BOOLEAN DEFAULT 0, nb_result INTEGER DEFAULT 0, id_result TEXT DEFAULT \"\");", NULL, NULL, NULL);
rc += sqlite3_exec(db, "CREATE TABLE Publi(id INTEGER PRIMARY KEY, titre TEXT, auteurs TEXT, abstract TEXT, revue TEXT, lien VARCHAR(50), date_publi DATE);", NULL, NULL, NULL);
rc += sqlite3_exec(db, "CREATE TABLE Publi(id INTEGER PRIMARY KEY, titre TEXT, auteurs TEXT, abstract TEXT, revue TEXT, lien VARCHAR(50), date_publi TEXT);", NULL, NULL, NULL);
rc += sqlite3_exec(db, "CREATE TABLE Correc(orig TEXT PRIMARY KEY, dest TEXT);", NULL, NULL, NULL);
if (rc)
{
@@ -328,12 +328,50 @@ void class_bdd::modnbresult(const wxString& id, int nbresults)
sqlite3_exec(db, "UPDATE Result SET nb_result=" + _itoW(nbresults) + " WHERE id=" + id + ";", NULL, NULL, NULL);
}

wxString class_bdd::getidresult(const wxString& id)
wxArrayString class_bdd::getidresult(const wxString& id, bool stripped)
{
sqlite3_prepare_v2(db, "SELECT id_result FROM Result WHERE id=" + id + ";", -1, &stmt, NULL);
sqlite3_step(stmt);
wxString out = _W(sqlite3_column_text(stmt, 0));
wxString list = _W(sqlite3_column_text(stmt, 0));
sqlite3_finalize(stmt);
wxArrayString out;
while (list.Length() > 0)
{
if (stripped)
out.Add(list.BeforeFirst(',').AfterLast('!'));
else
out.Add(list.BeforeFirst(','));
list = list.AfterFirst(',');
}
return out;
}

void class_bdd::addidresult(const wxString& id, const wxString& idresult)
{
sqlite3_prepare_v2(db, "SELECT id_result FROM Result Where id=" + id + ";", -1, &stmt, NULL);
sqlite3_step(stmt);
wxString list = _W(sqlite3_column_text(stmt, 0));
sqlite3_finalize(stmt);
if (list.Length() > 0)
list = idresult + "," + list;
else
list = idresult;
sqlite3_exec(db, "UPDATE Result SET id_result=\"" + list + "\" WHERE id=" + id + ";", NULL, NULL, NULL);
}

bool class_bdd::publiexists(const wxString& id)
{
sqlite3_prepare_v2(db, "SELECT * FROM Publi WHERE id=" + id + ";", -1, &stmt, NULL);
if (sqlite3_step(stmt) == SQLITE_DONE)
return false;
else
return true;
}

void class_bdd::addpubli(wxString titre, wxString auteurs, wxString abstract, wxString revue, wxString lien, wxString date)
{
}

+ 4
- 2
CosMoS/bdd.h View File

@@ -37,9 +37,11 @@ class class_bdd
int nbresult(const wxString& id);
void modnbresult(const wxString& id, int nbresults);
wxString getidresult(const wxString& id);
wxArrayString getidresult(const wxString& id, bool stripped=false);
void addidresult(const wxString& id, const wxString& idresult);
bool publiexists(const wxString& id);
void addpubli(wxString titre, wxString auteurs, wxString abstract, wxString revue, wxString lien, wxString date);
};

#endif //__bdd__

+ 1
- 1
CosMoS/misc.h View File

@@ -11,7 +11,7 @@
#elif defined( __WXMSW__ )
#define slash "\\"
#define _C(string) (const char*) string.c_str() // wxString -> char*
#define _W(string) wxString::FromAscii(string) // char* -> wxString
#define _W(string) string // char* -> wxString
#endif
#define _itoW(integer) wxString::Format("%i",integer) // int -> wxString



+ 158
- 31
CosMoS/recherche.cpp View File

@@ -25,22 +25,22 @@ void class_recherche::start()
bool firstpass = true;
wxArrayInt selection = grid->GetSelectedRows();
if (selection.GetCount() == 0)
for (int s=0; s < grid->GetNumberRows(); s++)
selection.Add(s);
for (int i=0; i < grid->GetNumberRows(); i++)
selection.Add(i);
for (int j=0; j < configuration->getnbrule(); j++)
{
if (configuration->getrule(j).inuse)
{
wxProgressDialog progress_dialog("Recherche", _T("Recherche avec la règle «") + configuration->getrule(j).name + "»", selection.GetCount(), NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
for (int i=0; i < (int)selection.GetCount(); i++)
wxProgressDialog progress_dialog("Recherche", _T("Recherche avec la règle «") + configuration->getrule(j).name + _T("»"), selection.GetCount(), NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
for (unsigned int i=0; i < selection.GetCount(); i++)
{
if (firstpass || (grid->GetCellValue(selection[i], 0) == "0"))
{
go (selection[i], configuration->getrule(j));
}
if (!progress_dialog.Update(i))
break;
if (!progress_dialog.Update(i))
break;
}
}
firstpass = false;
@@ -49,28 +49,135 @@ void class_recherche::start()

void class_recherche::go(int row, rule regle)
{
//TODO: coloration de la grille pour les consults avec nouveaux résultats
wxString id = grid->GetCellValue(row, 13);
wxString requete = build(row, regle);
esearch(requete);
parsesearch();
wxString temp = bdd->getidresult(grid->GetCellValue(row, 13));
wxArrayString idresultbdd, tofetch;
while (temp.Length() > 0)
wxArrayString idresultbdd = bdd->getidresult(id, true);
wxArrayString temp;
if (idresult.GetCount() > 0)
{
idresultbdd.Add(temp.BeforeFirst(',').AfterLast('!'));
temp = temp.AfterFirst(',');
for (int i=(int)idresult.GetCount()-1; i >= 0; i--)
{
if (idresultbdd.Index(idresult[i]) == wxNOT_FOUND)
{
temp.Add(idresult[i]);
bdd->addidresult(id, idresult[i]);
}
}
idresult = temp;
bdd->modnbresult(id, bdd->nbresult(id) + idresult.GetCount());
grid->SetCellValue(row, 0, _itoW(bdd->nbresult(id)));
temp.Clear();
for (unsigned int i=0; i < idresult.GetCount(); i++)
if (!(bdd->publiexists(idresult[i])))
temp.Add(idresult[i]);
idresult = temp;
if (idresult.GetCount() > 0)
{
efetch();
parsefetch();
}
}
for (int i=0; i < (int)idresult.GetCount(); i++)
if (idresultbdd.Index(idresult[i]) != wxNOT_FOUND)
tofetch.Add(idresult[i]);
}

void class_recherche::parsefetch()
{
XMLDocument* doc = new XMLDocument;
doc->Parse(curldata.content);
idresult = tofetch;
XMLElement* parcours = doc->RootElement();
parcours = parcours->FirstChildElement("PubmedArticle");
do
{
wxString titre, auteurs, abstract, revue, lien, date;
parcours = parcours->FirstChildElement("MedlineCitation"); //MedlineCitation
lien << "http://www.ncbi.nlm.nih.gov/pubmed/" << parcours->FirstChildElement("PMID")->GetText();// PMID
parcours = parcours->FirstChildElement("Article"); // Article
parcours = parcours->FirstChildElement("Journal"); // Journal
parcours = parcours->FirstChildElement("JournalIssue"); // JournalIssue
parcours = parcours->FirstChildElement("PubDate"); // PubDate
date << parcours->FirstChildElement("Month")->GetText(); // *Month
date << " " << parcours->FirstChildElement("Year")->GetText(); // *Year
parcours = parcours->Parent()->ToElement(); // JournalIssue
revue << parcours->NextSiblingElement("ISOAbbreviation")->GetText(); // *ISOAbbreviation
parcours = parcours->Parent()->ToElement(); // Journal
titre << parcours->NextSiblingElement("ArticleTitle")->GetText(); // *ArticleTitle
parcours = parcours->NextSiblingElement("Abstract"); // Abstract
XMLElement* parcoursabstract = parcours->FirstChildElement("AbstractText"); // AbstractText
do
{
abstract << parcoursabstract->FirstAttribute()->Value() << " :\n";
abstract << parcoursabstract->GetText() << "\n";
parcoursabstract=parcoursabstract->NextSiblingElement("AbstractText");
}while(parcoursabstract);
parcours = parcours->NextSiblingElement("AuthorList"); // AuthorList
XMLElement* parcoursauteurs = parcours->FirstChildElement("Author"); // Author
do
{
auteurs << parcoursauteurs->FirstChildElement("LastName")->GetText();
auteurs << " " << parcoursauteurs->FirstChildElement("ForeName")->GetText() << ",";
parcoursauteurs=parcoursauteurs->NextSiblingElement("Author");
}while(parcoursauteurs);
auteurs = auteurs.BeforeLast(',');
parcours = parcours->Parent()->Parent()->Parent()->ToElement()->NextSiblingElement("PubmedArticle");
bdd->addpubli(titre, auteurs, abstract, revue, lien, date);
wxMessageBox(titre + "\n" + abstract);
}while(parcours);
efetch();
delete(doc);
if (curldata.content)
free (curldata.content);
}

void class_recherche::efetch()
{
bool accessdenied = false;
do
{
wxString requete = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=";
for (unsigned int i=0; i < idresult.GetCount(); i++)
requete << idresult[i] << ",";
requete = requete.BeforeLast(',');
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete));
if (configuration->IsUseproxy())
{
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl()));
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport());
}
else
curl_easy_setopt (curlhandle, CURLOPT_PROXY, "");
curldata.content = (char*) malloc(1);
curldata.size = 0;
if (curlhandle)
curl_easy_perform(curlhandle);
//wxMessageBox(curldata.content);
if (wxString(curldata.content).Left(6) == "<HTML>")
{
accessdenied = true;
time_t timer = time(NULL);
wxProgressDialog progress_dialog("Erreur proxy", _T("En attente du proxy"), 300, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME);
while (time(NULL) < (timer + 300))
progress_dialog.Update(time(NULL) - timer);
progress_dialog.Update(300);
if (curldata.content)
free (curldata.content);
}
}while (accessdenied);
}

void class_recherche::parsesearch()
@@ -98,25 +205,45 @@ void class_recherche::parsesearch()
parcours = parcours->Parent()->ToElement();
}
delete(doc);
if (curldata.content)
free (curldata.content);
}

void class_recherche::esearch(wxString requete)
{
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete));
if (configuration->IsUseproxy())
bool accessdenied = false;
do
{
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl()));
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport());
}
else
curl_easy_setopt (curlhandle, CURLOPT_PROXY, "");
curldata.content = (char*) malloc(1);
curldata.size = 0;
if (curlhandle)
curl_easy_perform(curlhandle);
curl_easy_setopt (curlhandle, CURLOPT_URL, _C(requete));
if (configuration->IsUseproxy())
{
curl_easy_setopt (curlhandle, CURLOPT_PROXY, _C(configuration->GetProxyurl()));
curl_easy_setopt (curlhandle, CURLOPT_PROXYPORT, configuration->GetProxyport());
}
else
curl_easy_setopt (curlhandle, CURLOPT_PROXY, "");
curldata.content = (char*) malloc(1);
curldata.size = 0;
if (curlhandle)
curl_easy_perform(curlhandle);
//wxMessageBox(curldata.content);
if (wxString(curldata.content).Left(6) == "<HTML>")
{
accessdenied = true;
time_t timer = time(NULL);
wxProgressDialog progress_dialog("Erreur proxy", _T("En attente du proxy"), 300, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME);
while (time(NULL) < (timer + 300))
progress_dialog.Update(time(NULL) - timer);
progress_dialog.Update(300);
if (curldata.content)
free (curldata.content);
}
}while (accessdenied);
}

wxString class_recherche::build(int row, rule regle)


+ 4
- 0
CosMoS/recherche.h View File

@@ -1,9 +1,12 @@
#ifndef __recherche__
#define __recherche__

#pragma GCC diagnostic ignored "-Wunused-function"

#include <wx/msgdlg.h>
#include <wx/grid.h>
#include <curl/curl.h>
#include <ctime>
#include "bdd.h"
#include "config.h"
#include "tinyxml2.h"
@@ -32,6 +35,7 @@ private:
void esearch(wxString requete);
void parsesearch();
void efetch();
void parsefetch();
wxString build(int row, rule regle);
wxString parsedemandeur(wxString nom, wxString prenom, int op);
wxString parseresponsable(wxString responsable, int op);


+ 2
- 2
Sante_Pub.workspace View File

@@ -23,14 +23,14 @@
<Project Name="testcurl" ConfigName="Debug"/>
<Project Name="testsqlite" ConfigName="Debug"/>
</WorkspaceConfiguration>
<WorkspaceConfiguration Name="Release" Selected="yes">
<WorkspaceConfiguration Name="Release" Selected="no">
<Project Name="COSMOS" ConfigName="Release"/>
<Project Name="CosMoS" ConfigName="Release"/>
<Project Name="grid" ConfigName="Release"/>
<Project Name="testcurl" ConfigName="Release"/>
<Project Name="testsqlite" ConfigName="Release"/>
</WorkspaceConfiguration>
<WorkspaceConfiguration Name="Debug_WIN" Selected="no">
<WorkspaceConfiguration Name="Debug_WIN" Selected="yes">
<Project Name="CosMoS" ConfigName="Debug_WIN"/>
<Project Name="grid" ConfigName="Debug_WIN"/>
<Project Name="testcurl" ConfigName="Debug_WIN"/>


Loading…
Cancel
Save