]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOSQLiteTreeHandler.cpp
Fixed bug when user cancels add directory
[creaImageIO.git] / src2 / creaImageIOSQLiteTreeHandler.cpp
index c35ae61bc64ac33b5eee140997c2c24f7062c150..26a9641d92247dbe21f04aac67008cc4718f5683 100644 (file)
@@ -21,7 +21,6 @@
 //#include <icons/close.xpm>
 
 #include <creaWx.h>
-#include <creaMessageManager.h>
 using namespace crea;
 
 #include <boost/filesystem.hpp>
@@ -37,6 +36,7 @@ namespace creaImageIO
     : mFileName(filename)
   {
     mDB = new CppSQLite3DB;
+       mIsAdding=false;
     GimmickMessage(1,"SQLite version : "
                   <<std::string(mDB->SQLiteVersion())<< std::endl);
   }
@@ -107,13 +107,7 @@ namespace creaImageIO
   {
     return false;
   }
-  //=====================================================================
-
-  //===================================================================== 
-  unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) 
-  { 
-    return 0; 
-  }
+  
   //===================================================================== 
 
   //===================================================================== 
@@ -133,22 +127,63 @@ namespace creaImageIO
   }
   //===================================================================== 
 
-
   //===================================================================== 
   int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
   {
     tree::Node* parent = DBGetParent(attr);
     DBGraftToParent(parent,attr);
+       if(parent->GetLevel()<GetTree().GetNumberOfLevels()-1&&parent->GetLevel()>0)
+       {
+       int nC=GetNumberOfChildren(parent);
+       nC=nC+1;
+       std::stringstream out;
+       out <<nC;
+       SetAttribute(parent,"NumberOfChildren",out.str());
+       }
     return (parent->GetLevel()+1);
+         
   }
   //===================================================================== 
  
 
   //===================================================================== 
-   bool SQLiteTreeHandler::Remove(tree::Node*)
+   bool SQLiteTreeHandler::Remove(tree::Node* node)
    {
-     return false;
+   DBRecursiveRemoveNode(node);
+    //    std::cout << "DELETE"<<std::endl;
+   bool remove=false;
+   tree::Node* parent=node->GetParent();
+    if (parent)
+      {
+       parent->RemoveChildrenFromList(node);
+       int nC=GetNumberOfChildren(parent);
+       nC=nC-1;
+       if(nC>0)
+       {       
+               std::stringstream out;
+               out <<nC;
+               SetAttribute(parent,"NumberOfChildren",out.str());
+       }
+       else
+       {
+               remove=true;
+       }
+
+      }
+    delete node;
+       if(remove&&parent->GetLevel()>0)
+       {
+               Remove(parent);
+       }
+    //    std::cout << "DELETE OK"<<std::endl;
+    return true;
    }
+
+    //========================================================================
+
+  
+  
   //===================================================================== 
 
   //===================================================================== 
@@ -323,22 +358,22 @@ namespace creaImageIO
            
            
            // Add Attribute 'ID' to Description
-           GetTree().GetLevelDescriptor(l).Add
+           GetTree().GetDescriptor().Add
              (AttributeDescriptor( "ID",
                                    "Database Identifier",
                                    0,0,
                                    AttributeDescriptor::PRIVATE
-                                   ));
+                                   ),l);
            
            if (l>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);
              }
            
          }
@@ -374,7 +409,6 @@ namespace creaImageIO
                   << i->GetGroup() << ","
                   << i->GetElement() << ","
                   << i->GetFlags() << ");";
-           
            UPDATEDB(insert.str());
          }
 
@@ -427,7 +461,7 @@ namespace creaImageIO
 
     tree::Descriptor& desc = GetTree().GetDescriptor();
     // clears the existing one
-    desc.GetLevelDescriptorList().clear();
+    desc.Clear();
      
     int nblevel = 0;
     std::string query = "SELECT * FROM LEVELS";
@@ -438,7 +472,7 @@ namespace creaImageIO
       {
        std::string name = q.getStringField(0);
        GimmickMessage(2," * Importing level '"<<name<<"'"<<std::endl);
-       desc.GetLevelDescriptorList().push_back(LevelDescriptor(name));
+       desc.Add(LevelDescriptor(name));
        nblevel++;
        q.nextRow();
       }   
@@ -476,13 +510,13 @@ namespace creaImageIO
            std::string name(q.getStringField(1));
            GimmickMessage(2,"  - Importing attribute '"<<key<<"' '"<<name
                           <<"'"<<std::endl);
-           desc.GetLevelDescriptor(level).Add
+           desc.Add
              (AttributeDescriptor( key, // Key
                                    name, // Name
                                    q.getIntField(2), // Group
                                    q.getIntField(3), // Element 
                                    q.getIntField(4) // Flags
-                                   ));
+                                   ),level);
            if ( key == "ID" ) 
              {
                ID_found = true;
@@ -654,6 +688,7 @@ namespace creaImageIO
     if (node->GetChildrenLoaded()) 
       {
        // Iterate the children 
+
        tree::Node::ChildrenListType::iterator i;
        for (i = node->GetChildrenList().begin();
             i!= node->GetChildrenList().end();
@@ -661,14 +696,18 @@ 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)
       {
@@ -678,8 +717,12 @@ namespace creaImageIO
     CppSQLite3Query q;
     QUERYDB(query,q);
 
+       int p=0;
     while (!q.eof())
       {
+
+       //      std::cout << "DBLoadCh : creating node level "<<level+1<<std::endl;
+
        nbloaded++;
        Node* n = new Node(node);
        for (int fld = 0; fld < q.numFields(); fld++)
@@ -705,9 +748,11 @@ namespace creaImageIO
       }
 
     node->SetChildrenLoaded(true);
+       
     
     //    msw[2].Pause();
     return nbloaded;
+       }
   }
   //=====================================================================
 
@@ -721,6 +766,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 +782,8 @@ namespace creaImageIO
   void SQLiteTreeHandler::DBGraftToParent( tree::Node* parent, 
                                            const AttributeMapType& attr)
   {
-    GimmickMessage(2,"Grafting to parent '"<<parent->GetLabel()
-                  <<"'"<<std::endl);
+    //    std::cout <<"Grafting to parent '"<<parent->GetLabel()
+    //            <<"'"<<std::endl;
 
     for (int level = parent->GetLevel()+1;
         level < GetTree().GetNumberOfLevels();
@@ -745,7 +791,10 @@ namespace creaImageIO
       {
        // Create Node
        tree::Node* child = new tree::Node(parent,attr);
-       
+       GetNumberOfChildren(parent);
+       child->SetChildrenLoaded(true);
+       //      std::cout<<"Number of children "<<parent->GetNumberOfChildren()<<std::endl;
+
        // Set PARENT_ID if necessary 
        if ( parent->GetLevel()>0 )
          child->SetAttribute("PARENT_ID",parent->GetAttribute("ID"));
@@ -812,6 +861,66 @@ namespace creaImageIO
   }
   //===================================================================== 
 
+
+  //=====================================================================
+  void SQLiteTreeHandler::DBRecursiveRemoveNode(Node* node)
+  {
+       
+    std::string query = "DELETE FROM ";
+   
+    query += GetTree().GetLevelDescriptor(node->GetLevel()).GetName();
+    query += " WHERE ID='"+ node->GetAttribute("ID") + "';";
+    UPDATEDB(query);
+       GimmickDebugMessage(2,
+                           " Deleting '"
+                               <<node->GetLabel()<<"' with ID '"
+                           <<node->GetAttribute("ID")
+                           <<"' in level "<< GetTree().GetLevelDescriptor(node->GetLevel()).GetName()
+                           <<std::endl);
+
+    Node::ChildrenListType::iterator i;
+    for (i  = node->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(level<GetTree().GetNumberOfLevels()&& level>0)
+       {
+               std::string query = "SELECT NumberOfChildren FROM ";
+    query += GetTree().GetLevelDescriptor(level).GetName();
+    if (level>0)
+      {
+       query += " WHERE ID='" + n->UnsafeGetAttribute("ID") 
+         + "'";
+      }
+    CppSQLite3Query q;
+    QUERYDB(query,q);
+       
+
+               while (!q.eof())
+               {
+                       for (int fld = 0; fld < q.numFields(); fld++)
+                       {
+                               nb=q.getIntField(fld);  
+                       }
+                       q.nextRow();
+               }
+       }
+       if(nb==0){nb=1;}
+    return nb; 
+  }
+
   /*
   //=====================================================================
   bool SQLiteTreeHandler::DBInsert(Node* alien_node,
@@ -1098,12 +1207,14 @@ namespace creaImageIO
     //    std::cout << " ** Node = "<<i->second<<std::endl;
     return i->second;
   }
   //=====================================================================
 
   //=====================================================================
   bool SQLiteTreeHandler::Remove(Node* node)
   {
-    DBRecursiveRemoveNode(node);
+
+    //DBRecursiveRemoveNode(node);
  
     //    std::cout << "DELETE"<<std::endl;
     if (node->GetParent())
@@ -1114,6 +1225,8 @@ namespace creaImageIO
     //    std::cout << "DELETE OK"<<std::endl;
     return true;
   }
+  
+  
   //========================================================================
 
   //=====================================================================
@@ -1136,6 +1249,7 @@ namespace creaImageIO
        DBRecursiveRemoveNode((*i));
       }
   }
+  
   //=====================================================================
   
   //=====================================================================