X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOSQLiteTreeHandler.cpp;h=3531408532557debd0325133ae74ae7a9435b275;hb=b0843014c5482f70050fab8036c6780172e3b6c9;hp=c35ae61bc64ac33b5eee140997c2c24f7062c150;hpb=4ef5bb7efa72c0d9a016f270b5a56e8302f6e209;p=creaImageIO.git diff --git a/src2/creaImageIOSQLiteTreeHandler.cpp b/src2/creaImageIOSQLiteTreeHandler.cpp index c35ae61..3531408 100644 --- a/src2/creaImageIOSQLiteTreeHandler.cpp +++ b/src2/creaImageIOSQLiteTreeHandler.cpp @@ -1,31 +1,19 @@ #include #include +#include +#include #include "CppSQLite3.h" #include -//#include - -//#include - -//#include - #include -#include "wx/wx.h" -#include -#include - - -//#include - #include -#include +#include using namespace crea; -#include -#include + namespace creaImageIO { @@ -37,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); } //============================================================= @@ -50,29 +38,6 @@ namespace creaImageIO //============================================================= - //============================================================= - // void SQLiteTreeHandler::Print() const - // { - /* - std::cout << "-> '"<Print(); - } - */ - // } - //============================================================= - - //===================================================================== - /* - bool SQLiteTreeHandler::LocationIsValid() - { - // TO DO - return true; - } - */ //===================================================================== @@ -107,13 +72,7 @@ namespace creaImageIO { return false; } - //===================================================================== - - //===================================================================== - unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) - { - return 0; - } + //===================================================================== //===================================================================== @@ -133,22 +92,49 @@ namespace creaImageIO } //===================================================================== - //===================================================================== int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr ) { tree::Node* parent = DBGetParent(attr); DBGraftToParent(parent,attr); return (parent->GetLevel()+1); + } //===================================================================== //===================================================================== - bool SQLiteTreeHandler::Remove(tree::Node*) + bool SQLiteTreeHandler::Remove(tree::Node* node) { - return false; + DBRecursiveRemoveNode(node); + + // std::cout << "DELETE"<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"<1) { // Add Attribute 'PARENT_ID' to Description - GetTree().GetLevelDescriptor(l).Add + GetTree().GetDescriptor().Add (AttributeDescriptor( "PARENT_ID", "Database Parent Identifier", 0,0, AttributeDescriptor::PRIVATE - )); + ),l); } } @@ -355,8 +355,7 @@ namespace creaImageIO command += "Flags int\n"; command += "\n)"; UPDATEDB(command); - - + // Fill the table *_ATTRIBUTES LevelDescriptor::AttributeDescriptorListType::const_iterator i; for (i = GetTree().GetAttributeDescriptorList(l).begin(); @@ -374,7 +373,6 @@ namespace creaImageIO << i->GetGroup() << "," << i->GetElement() << "," << i->GetFlags() << ");"; - UPDATEDB(insert.str()); } @@ -414,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(), "" ); } @@ -540,22 +531,6 @@ namespace creaImageIO } //===================================================================== - - - - - - - - - - - - - - - - //======================================================================== /// std::string& SQLformat(std::string& str) @@ -593,7 +568,7 @@ namespace creaImageIO { continue; } - // std::cout << "("<first<<","<second<<")"<first + "'"; values += "'" + SQLformat(i->second) + "'"; atts += ","; @@ -637,7 +612,6 @@ namespace creaImageIO } //===================================================================== - //===================================================================== int SQLiteTreeHandler::DBLoadChildren(tree::Node* node, int numberoflevels) @@ -654,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(); @@ -661,38 +636,40 @@ namespace creaImageIO { nbloaded += DBLoadChildren(*i,numberoflevels-1); } + node->SetChildrenLoaded(true); return nbloaded; + } - + else + { /// If children not loaded : do it and recurse // Query DB int level = node->GetLevel(); std::string query = "SELECT * FROM "; + 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 ) { @@ -705,9 +682,11 @@ namespace creaImageIO } node->SetChildrenLoaded(true); + // msw[2].Pause(); return nbloaded; + } } //===================================================================== @@ -721,6 +700,7 @@ namespace creaImageIO std::string insert("INSERT INTO "); insert += GetTree().GetLevelDescriptor(n->GetLevel()).GetName(); insert += " " + val + ";"; + UPDATEDB(insert); // Store DB id of newly created node; @@ -736,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(); @@ -745,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++; - */ - } + } } //====================================================================== @@ -803,367 +764,252 @@ 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; } - //===================================================================== - - /* - //===================================================================== - bool SQLiteTreeHandler::DBInsert(Node* alien_node, - UpdateSummary& summary) - { - // 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::string sql = "UPDATE "; + sql += levelDescriptor; + sql += " SET "; + sql += key; + sql += " = '"; + sql += value; + sql += "' WHERE "; + sql += searchParam; + sql += " = '"; + sql += searchVal; + sql += "'"; + std::cout<GetLabel()<<"','" - // << internal_parent << "','"<< parent_id<<"')"<0) - { - node_id = node->UnsafeGetFieldValue("ID"); - return node; - } - // Second : try in DB + + std::string query = "DELETE FROM "; - // 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() ) - { - i->second = j->second; - } - } - - msw[2].Resume(); - if (node->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; + query += GetTree().GetLevelDescriptor(node->GetLevel()).GetName(); + + query += " WHERE ID='"+ node->GetAttribute("ID") + "';"; + + UPDATEDB(query); + GimmickDebugMessage(2, + " Deleting '" + <GetLabel()<<"' with ID '" + <GetAttribute("ID") + <<"' in level "<< GetTree().GetLevelDescriptor(node->GetLevel()).GetName() + <GetNumberOfChildren()!=0) + { + Node::ChildrenListType::iterator i; + for (i = node->GetChildrenList().begin(); + i != node->GetChildrenList().end(); + i++) + { + DBRecursiveRemoveNode((*i)); + } + } + else if(node->GetLevel()GetLevel()+1,node->GetAttribute("ID")); + } } - //===================================================================== //===================================================================== - Node* SQLiteTreeHandler::GetChildrenLike(Node* parent, - Node* alien_node) + void SQLiteTreeHandler::DBRecursiveRemoveNode(int level, std::string parentId) { - Node::ChildrenListType::iterator i; - for (i = parent->GetChildrenList().begin(); - i != parent->GetChildrenList().end(); - i++) - { - Node::Type type = alien_node->GetType(); - bool ok = true; - for (int j=0; - jGetFieldValue(SQLiteTreeHandlerStructure:: - QueryField(type,j).key ) != - (*i)->GetFieldValue(SQLiteTreeHandlerStructure:: - QueryField(type,j).key ) ) + for (int fld = 0; fld < q.numFields(); fld++) { - ok = false; - break; + result<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); + //===================================================================== + 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 "<GetLevel(); - Node::ChildrenListType::iterator i; - for (i = node->GetChildrenList().begin(); - i != node->GetChildrenList().end(); - i++) + if(level0) { - DBRecursiveRemoveNode((*i)); + std::string query = "SELECT NumberOfChildren FROM "; + query += GetTree().GetLevelDescriptor(level).GetName(); + if (level>0) + { + query += " WHERE ID='" + n->GetAttribute("ID") + + "'"; + } + CppSQLite3Query q; + QUERYDB(query,q); + + + while (!q.eof()) + { + for (int fld = 0; fld < q.numFields(); fld++) + { + nb=q.getIntField(fld); + } + q.nextRow(); + } } - } - //===================================================================== - - //===================================================================== - 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")+"'"; + /* + if(nb==0) + { + nb=1; } - query += ";"; - - // std::cout << "**SQL = "<< query << std::endl; - - CppSQLite3Query q; - QUERYDB(query,q); - - // std::cout << "**RES = "<< q.getIntField(0) <1) + { + std::stringstream out; + std::stringstream results; + out<<"SELECT PARENT_ID FROM "<