X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOSQLiteTreeHandler.cpp;h=3531408532557debd0325133ae74ae7a9435b275;hb=b0843014c5482f70050fab8036c6780172e3b6c9;hp=aec51554f68406d87bd679cebf989b9770b542cf;hpb=57608b6038aaf31b21948e6244aeb814f0bb7cbd;p=creaImageIO.git diff --git a/src2/creaImageIOSQLiteTreeHandler.cpp b/src2/creaImageIOSQLiteTreeHandler.cpp index aec5155..3531408 100644 --- a/src2/creaImageIOSQLiteTreeHandler.cpp +++ b/src2/creaImageIOSQLiteTreeHandler.cpp @@ -1,30 +1,19 @@ #include #include +#include +#include #include "CppSQLite3.h" #include -//#include - -//#include - -//#include - #include -#include "wx/wx.h" -#include -#include - - -//#include - #include +#include using namespace crea; -#include -#include + namespace creaImageIO { @@ -37,8 +26,7 @@ namespace creaImageIO { mDB = new CppSQLite3DB; mIsAdding=false; - GimmickMessage(1,"SQLite version : " - <SQLiteVersion())<< std::endl); + //GimmickMessage(1,"SQLite version : " <SQLiteVersion())<< std::endl); } //============================================================= @@ -50,29 +38,6 @@ namespace creaImageIO //============================================================= - //============================================================= - // void SQLiteTreeHandler::Print() const - // { - /* - std::cout << "-> '"<Print(); - } - */ - // } - //============================================================= - - //===================================================================== - /* - bool SQLiteTreeHandler::LocationIsValid() - { - // TO DO - return true; - } - */ //===================================================================== @@ -132,14 +97,6 @@ namespace creaImageIO { tree::Node* parent = DBGetParent(attr); DBGraftToParent(parent,attr); - if(parent->GetLevel()GetLevel()>0) - { - int nC=GetNumberOfChildren(parent); - nC=nC+1; - std::stringstream out; - out <GetLevel()+1); } @@ -156,14 +113,12 @@ namespace creaImageIO tree::Node* parent=node->GetParent(); if (parent) { - parent->RemoveChildrenFromList(node); - int nC=GetNumberOfChildren(parent); - nC=nC-1; - if(nC>0) + int nC = parent->RemoveChildrenFromList(node); + if(nC>0 && parent->GetLevel()>0) { std::stringstream out; out <GetKey()); - if ( i != attr.end() ) - { - v = i->second; - } - */ + GetTree().UnsafeSetAttribute( a->GetKey(), "" ); } @@ -574,22 +531,6 @@ namespace creaImageIO } //===================================================================== - - - - - - - - - - - - - - - - //======================================================================== /// std::string& SQLformat(std::string& str) @@ -627,7 +568,7 @@ namespace creaImageIO { continue; } - // std::cout << "("<first<<","<second<<")"<first + "'"; values += "'" + SQLformat(i->second) + "'"; atts += ","; @@ -671,7 +612,6 @@ namespace creaImageIO } //===================================================================== - //===================================================================== int SQLiteTreeHandler::DBLoadChildren(tree::Node* node, int numberoflevels) @@ -711,7 +651,7 @@ namespace creaImageIO query += GetTree().GetLevelDescriptor(level+1).GetName(); if (level>0) { - query += " WHERE PARENT_ID='" + node->UnsafeGetAttribute("ID") + query += " WHERE PARENT_ID='" + node->GetAttribute("ID") + "'"; } CppSQLite3Query q; @@ -729,13 +669,7 @@ namespace creaImageIO { n->UnsafeSetAttribute(q.fieldName(fld),q.getStringField(fld)); } - /* - // Index - TypeId ti; - ti.type = type; - ti.id = n->GetFieldValue("ID"); - mTypeIdToNodeMap[ti] = n; - */ + // recurse if ( numberoflevels != 1 ) { @@ -791,9 +725,16 @@ namespace creaImageIO { // Create Node tree::Node* child = new tree::Node(parent,attr); - GetNumberOfChildren(parent); child->SetChildrenLoaded(true); - // std::cout<<"Number of children "<GetNumberOfChildren()<1) + { + int nc = GetNumberOfChildren(parent)+1; + + // std::cout<<"Number of children "<GetNumberOfChildren()<GetLevel()>0 ) @@ -801,39 +742,10 @@ namespace creaImageIO // Insert in DB DBInsert(child); - /* - std::string val; - SQLAppendAttributesValues(child,val); - std::string insert("INSERT INTO "); - insert += GetTree().GetLevelDescriptor(child->GetLevel()).GetName(); - insert += " " + val + ";"; - UPDATEDB(insert); - // Store DB id of newly created node; - long lastrow = mDB->lastRowId(); - std::stringstream ri; - ri << mDB->lastRowId(); - child->SetAttribute("ID",ri.str()); - */ // Down one level parent = child; - - /* - // Insert in TypeId map - TypeId ti; - ti.type = node->GetType(); - ti.id = node_id; - mTypeIdToNodeMap[ti] = node; - // std::cout << "== Insert TypeId ("<GetType()==Node::Patient) summary.added_patients++; - if (node->GetType()==Node::Study) summary.added_studies++; - if (node->GetType()==Node::Series) summary.added_series++; - if (node->GetType()==Node::Image) summary.added_images++; - */ - } + } } //====================================================================== @@ -852,23 +764,48 @@ namespace creaImageIO sql += GetTree().GetLevelDescriptor(n->GetLevel()).GetName(); sql += " SET "; sql += key; - sql += "='"; + sql += " = '"; sql += value; - sql += "' WHERE ID="; + sql += "' WHERE ID = '"; sql += n->GetAttribute("ID"); + sql +="'"; // sql += " LIMIT 1"; UPDATEDB(sql); + return true; } - //===================================================================== + //===================================================================== + /// Sets an attribute of a Node + void SQLiteTreeHandler::DBSetAttribute(const std::string& levelDescriptor, + const std::string& key, + const std::string& value, + const std::string& searchParam, + const std::string& searchVal) + { - //===================================================================== + std::string sql = "UPDATE "; + sql += levelDescriptor; + sql += " SET "; + sql += key; + sql += " = '"; + sql += value; + sql += "' WHERE "; + sql += searchParam; + sql += " = '"; + sql += searchVal; + sql += "'"; + std::cout<GetLevel()).GetName(); + + query += GetTree().GetLevelDescriptor(node->GetLevel()).GetName(); + query += " WHERE ID='"+ node->GetAttribute("ID") + "';"; UPDATEDB(query); @@ -879,405 +816,200 @@ namespace creaImageIO <<"' in level "<< GetTree().GetLevelDescriptor(node->GetLevel()).GetName() <GetChildrenList().begin(); - i != node->GetChildrenList().end(); - i++) - { - DBRecursiveRemoveNode((*i)); - } - } - //===================================================================== - unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) - { - // Query DB - int nb=0; - int level = n->GetLevel(); - - if(level0) + if(node->GetNumberOfChildren()!=0) { - std::string query = "SELECT D1111_0011 FROM "; - query += GetTree().GetLevelDescriptor(level).GetName(); - if (level>0) - { - query += " WHERE ID='" + n->UnsafeGetAttribute("ID") - + "'"; - } - CppSQLite3Query q; - QUERYDB(query,q); - - - while (!q.eof()) + Node::ChildrenListType::iterator i; + for (i = node->GetChildrenList().begin(); + i != node->GetChildrenList().end(); + i++) { - for (int fld = 0; fld < q.numFields(); fld++) - { - nb=q.getIntField(fld); - } - q.nextRow(); + DBRecursiveRemoveNode((*i)); } } - if(nb==0){nb=1;} - return nb; + else if(node->GetLevel()GetLevel()+1,node->GetAttribute("ID")); + } } - /* //===================================================================== - bool SQLiteTreeHandler::DBInsert(Node* alien_node, - UpdateSummary& summary) + void SQLiteTreeHandler::DBRecursiveRemoveNode(int level, std::string parentId) { - // std::cout << "SQLiteTreeHandler::Insert('"<GetLabel() - // <<"')"<GetLabel()<<"'" - // << std::endl; - // Load the patients if not already done - DBLoadChildren(this,Node::Patient); - - parent_id = ""; - Node* parent = this; - - // The chain of ancestors - std::deque chain; - Node* cur = alien_node->GetParent(); - for (int type=Node::Patient; - typeGetType();++type) - { - chain.push_front(cur); - cur = cur->GetParent(); - } - - // create the nodes if do not exist - std::deque::iterator i; - for (i=chain.begin();i!=chain.end();++i) - { - // std::cout << " cur = '"<<(*i)->GetLabel()<<"'"<GetType()+1); - - parent_id = cur_id; - } - return parent; - } - //===================================================================== - - - - //===================================================================== - void SQLiteTreeHandler::DBRecursiveGetOrCreateNode(Node* alien_node, - Node* parent, - const std::string& parent_id, - UpdateSummary& summary) - { - // std::cout << "SQLiteTreeHandler::RecursiveGetOrCreateNode('" - // <GetLabel() - // <<"','"<GetChildrenList().begin(); - i != alien_node->GetChildrenList().end(); - i++) - { - DBRecursiveGetOrCreateNode((*i),new_node,new_id,summary); - } + + std::stringstream query; + query<<"DELETE FROM "<GetLabel()<<"','" - // << internal_parent << "','"<< parent_id<<"')"<0) - { - node_id = node->UnsafeGetFieldValue("ID"); - return node; - } - // Second : try in DB - - // Does not exist : Create new one - node = new Node(alien_node->GetType(),this,internal_parent); - node->SetChildrenLoaded(true); - // Copy fields values from alien - Node::FieldValueMapType::iterator i,j; - for (i = node->GetFieldValueMap().begin(); - i != node->GetFieldValueMap().end(); - i++) - { - j = alien_node->GetFieldValueMap().find(i->first); - if (j != alien_node->GetFieldValueMap().end() ) + //===================================================================== + void SQLiteTreeHandler::GetAttribute(std::string levelDescriptor, + std::string searchParam, + std::string searchVal, + std::string key, + std::string& result) + { + std::stringstream out; + std::stringstream results; + out<<"SELECT "<second = j->second; + for (int fld = 0; fld < q.numFields(); fld++) + { + results<GetType()!=Node::Patient) - node->SetFieldValue("PARENT_ID",parent_id); - - // Insert in DB - std::string val; - BuildSQLFieldsValues(node,val); - std::string insert("INSERT INTO "); - insert += std::string(SQLiteTreeHandlerStructure::Table(node->GetType())) - + " " + val + ";"; - // std::cout << "** SQL = '"<lastRowId(); - std::stringstream ri; - ri << mDB->lastRowId(); - node_id = ri.str(); - // std::cout << "LastRowId='"<lastRowId()<<"' vs '"<SetFieldValue("ID",node_id); - // Insert in TypeId map - TypeId ti; - ti.type = node->GetType(); - ti.id = node_id; - mTypeIdToNodeMap[ti] = node; - // std::cout << "== Insert TypeId ("<GetType()==Node::Patient) summary.added_patients++; - if (node->GetType()==Node::Study) summary.added_studies++; - if (node->GetType()==Node::Series) summary.added_series++; - if (node->GetType()==Node::Image) summary.added_images++; - - return node; + result=results.str(); + } - //===================================================================== + //===================================================================== + unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) + { + // Query DB + int nb=0; + int level = n->GetLevel(); - //===================================================================== - Node* SQLiteTreeHandler::GetChildrenLike(Node* parent, - Node* alien_node) - { - Node::ChildrenListType::iterator i; - for (i = parent->GetChildrenList().begin(); - i != parent->GetChildrenList().end(); - i++) + if(level0) { - Node::Type type = alien_node->GetType(); - bool ok = true; - for (int j=0; - j0) { - if ( - alien_node->GetFieldValue(SQLiteTreeHandlerStructure:: - QueryField(type,j).key ) != - (*i)->GetFieldValue(SQLiteTreeHandlerStructure:: - QueryField(type,j).key ) ) - { - ok = false; - break; - } + query += " WHERE ID='" + n->GetAttribute("ID") + + "'"; } - if (ok) + CppSQLite3Query q; + QUERYDB(query,q); + + + while (!q.eof()) { - return (*i); + for (int fld = 0; fld < q.numFields(); fld++) + { + nb=q.getIntField(fld); + } + q.nextRow(); } } - return 0; - } - //===================================================================== - - //===================================================================== - std::string SQLiteTreeHandler::DBGetNodeId(Node* node, - const std::string& parent_id) - { - // std::cout << "SQLiteTreeHandler::DBGetNodeId('"<GetLabel() - // <<"','"<GetType(); - - std::string table = SQLiteTreeHandlerStructure::Table(type); - std::string where = "WHERE "; - - if (type!=Node::Patient) - { - where += "PARENT_ID='" + parent_id - //node->GetFieldValue("PARENT_ID") - + "' AND "; - } - - for (int i=0;iGetParent()) - { - node->GetParent()->RemoveChildrenFromList(node); + /* + if(nb==0) + { + nb=1; } - delete node; - // std::cout << "DELETE OK"<GetLabel()<<"')"<GetType()); - query += " WHERE ID='"+ node->GetFieldValue("ID") + "';"; - - UPDATEDB(query); + while(level>1) + { + std::stringstream out; + std::stringstream results; + out<<"SELECT PARENT_ID FROM "<GetChildrenList().begin(); - i != node->GetChildrenList().end(); - i++) - { - DBRecursiveRemoveNode((*i)); - } } - - //===================================================================== - - //===================================================================== - int SQLiteTreeHandler::DBQueryNumberOfChildren(Node* node) - { - std::string query = "SELECT COUNT (ID) FROM "; - query += SQLiteTreeHandlerStructure::Table(node->GetType()+1); - if (node->GetType() != Node::Database) - { - query += " WHERE PARENT_ID='"+ node->GetFieldValue("ID")+"'"; - } - query += ";"; - - // std::cout << "**SQL = "<< query << std::endl; - - CppSQLite3Query q; - QUERYDB(query,q); - - // std::cout << "**RES = "<< q.getIntField(0) <