X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOSQLiteTreeHandler.cpp;h=3531408532557debd0325133ae74ae7a9435b275;hb=b0843014c5482f70050fab8036c6780172e3b6c9;hp=7d9f7ef4587ffeffbfb42abac854f05dff4666ff;hpb=3e7eac431db6401f86374784eaa66ad276af1bac;p=creaImageIO.git diff --git a/src2/creaImageIOSQLiteTreeHandler.cpp b/src2/creaImageIOSQLiteTreeHandler.cpp index 7d9f7ef..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 { @@ -36,8 +25,8 @@ namespace creaImageIO : mFileName(filename) { mDB = new CppSQLite3DB; - GimmickMessage(1,"SQLite version : " - <SQLiteVersion())<< std::endl); + mIsAdding=false; + //GimmickMessage(1,"SQLite version : " <SQLiteVersion())<< std::endl); } //============================================================= @@ -49,29 +38,6 @@ namespace creaImageIO //============================================================= - //============================================================= - // void SQLiteTreeHandler::Print() const - // { - /* - std::cout << "-> '"<Print(); - } - */ - // } - //============================================================= - - //===================================================================== - /* - bool SQLiteTreeHandler::LocationIsValid() - { - // TO DO - return true; - } - */ //===================================================================== @@ -126,13 +92,13 @@ namespace creaImageIO } //===================================================================== - //===================================================================== int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr ) { tree::Node* parent = DBGetParent(attr); DBGraftToParent(parent,attr); return (parent->GetLevel()+1); + } //===================================================================== @@ -143,18 +109,31 @@ namespace creaImageIO DBRecursiveRemoveNode(node); // std::cout << "DELETE"<GetParent()) - { - node->GetParent()->RemoveChildrenFromList(node); + bool remove=false; + tree::Node* parent=node->GetParent(); + if (parent) + { + int nC = parent->RemoveChildrenFromList(node); + if(nC>0 && parent->GetLevel()>0) + { + std::stringstream out; + out <GetLevel()>0) + { + Remove(parent); + } // std::cout << "DELETE OK"<GetGroup() << "," << i->GetElement() << "," << i->GetFlags() << ");"; - UPDATEDB(insert.str()); } @@ -421,7 +412,7 @@ namespace creaImageIO //===================================================================== bool SQLiteTreeHandler::DBImportTreeDescription() { - GimmickMessage(1,"Importing tree description from database ..." + GimmickMessage(1,"Importing tree description for database ..." <GetKey()); - if ( i != attr.end() ) - { - v = i->second; - } - */ + GetTree().UnsafeSetAttribute( a->GetKey(), "" ); } @@ -547,22 +531,6 @@ namespace creaImageIO } //===================================================================== - - - - - - - - - - - - - - - - //======================================================================== /// std::string& SQLformat(std::string& str) @@ -600,7 +568,7 @@ namespace creaImageIO { continue; } - // std::cout << "("<first<<","<second<<")"<first + "'"; values += "'" + SQLformat(i->second) + "'"; atts += ","; @@ -644,7 +612,6 @@ namespace creaImageIO } //===================================================================== - //===================================================================== int SQLiteTreeHandler::DBLoadChildren(tree::Node* node, int numberoflevels) @@ -661,6 +628,7 @@ namespace creaImageIO if (node->GetChildrenLoaded()) { // Iterate the children + tree::Node::ChildrenListType::iterator i; for (i = node->GetChildrenList().begin(); i!= node->GetChildrenList().end(); @@ -668,9 +636,12 @@ namespace creaImageIO { nbloaded += DBLoadChildren(*i,numberoflevels-1); } + node->SetChildrenLoaded(true); return nbloaded; + } - + else + { /// If children not loaded : do it and recurse // Query DB @@ -680,27 +651,25 @@ 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; QUERYDB(query,q); + int p=0; while (!q.eof()) { + + // std::cout << "DBLoadCh : creating node level "<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 ) { @@ -713,9 +682,11 @@ namespace creaImageIO } node->SetChildrenLoaded(true); + // msw[2].Pause(); return nbloaded; + } } //===================================================================== @@ -745,8 +716,8 @@ namespace creaImageIO void SQLiteTreeHandler::DBGraftToParent( tree::Node* parent, const AttributeMapType& attr) { - GimmickMessage(2,"Grafting to parent '"<GetLabel() - <<"'"<GetLabel() + // <<"'"<GetLevel()+1; level < GetTree().GetNumberOfLevels(); @@ -754,46 +725,27 @@ namespace creaImageIO { // Create Node tree::Node* child = new tree::Node(parent,attr); - + child->SetChildrenLoaded(true); + if (level>1) + { + int nc = GetNumberOfChildren(parent)+1; + + // std::cout<<"Number of children "<GetNumberOfChildren()<GetLevel()>0 ) child->SetAttribute("PARENT_ID",parent->GetAttribute("ID")); // 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++; - */ - } + } } //====================================================================== @@ -812,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); @@ -839,403 +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(GetTree().GetNumberOfLevels()!=(level+1)) + if(node->GetNumberOfChildren()!=0) { - std::string query = "SELECT * FROM "; - query += GetTree().GetLevelDescriptor(level+1).GetName(); - if (level>0) - { - query += " WHERE PARENT_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++) { - nb++; - q.nextRow(); + DBRecursiveRemoveNode((*i)); } } - 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) + void SQLiteTreeHandler::DBDelete(std::string levelDescriptor, std::string key, std::string value) { - // 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); - } - 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) <