]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOSQLiteTreeHandler.cpp
Fixed a bug that didn't let it load on opening. Still exists a bug on adding.
[creaImageIO.git] / src2 / creaImageIOSQLiteTreeHandler.cpp
index 3bea907f3f31abae26fd805192186c6992ef3b59..b91308f12b85442a5f1397b208b8494920083e8c 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,38 @@ namespace creaImageIO
   }
   //===================================================================== 
 
-
   //===================================================================== 
   int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
   {
+       mIsAdding=true;
     tree::Node* parent = DBGetParent(attr);
     DBGraftToParent(parent,attr);
+       mIsAdding=false;
     return (parent->GetLevel()+1);
+         
   }
   //===================================================================== 
  
 
   //===================================================================== 
-   bool SQLiteTreeHandler::Remove(tree::Node*)
+   bool SQLiteTreeHandler::Remove(tree::Node* node)
    {
-     return false;
+   DBRecursiveRemoveNode(node);
+    //    std::cout << "DELETE"<<std::endl;
+    if (node->GetParent())
+      {
+       node->GetParent()->RemoveChildrenFromList(node);
+      }
+    delete node;
+    //    std::cout << "DELETE OK"<<std::endl;
+    return true;
    }
+
+    //========================================================================
+
+  
+  
   //===================================================================== 
 
   //===================================================================== 
@@ -253,7 +263,7 @@ namespace creaImageIO
        return false;
       }
 
-    GimmickMessage(1,"Opening SQLite database '"<<GetFileName()
+    GimmickDebugMessage(1,"Opening SQLite database '"<<GetFileName()
                   <<"' ... OK"<<std::endl);
     return true;
   }
@@ -323,22 +333,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 +384,6 @@ namespace creaImageIO
                   << i->GetGroup() << ","
                   << i->GetElement() << ","
                   << i->GetFlags() << ");";
-           
            UPDATEDB(insert.str());
          }
 
@@ -427,7 +436,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 +447,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 +485,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;
@@ -651,24 +660,31 @@ namespace creaImageIO
     int nbloaded = 0;
     // If children loaded we do not have to do it but we need to recurse
     // in order to load the children's children if necessary, and so on...
-    if (node->GetChildrenLoaded()) 
+    if (node->GetChildrenLoaded()||mIsAdding
       {
        // Iterate the children 
-       tree::Node::ChildrenListType::iterator i;
+
+       /*tree::Node::ChildrenListType::iterator i;
        for (i = node->GetChildrenList().begin();
             i!= node->GetChildrenList().end();
             ++i)
          {
            nbloaded += DBLoadChildren(*i,numberoflevels-1);
-         }
+         }*/
+
        return nbloaded;
+
       }
-    
+       else
+       {
     /// If children not loaded : do it and recurse
+ std::cout<<"Children are not loaded for node:"<<node->GetLabel()<<std::endl;
+ std::cout<<"Children are not loaded for node (pointer):"<<node<<std::endl;
 
     // Query DB
     int level = node->GetLevel();
     std::string query = "SELECT * FROM ";
+       
     query += GetTree().GetLevelDescriptor(level+1).GetName();
     if (level>0)
       {
@@ -678,6 +694,7 @@ namespace creaImageIO
     CppSQLite3Query q;
     QUERYDB(query,q);
 
+       int p=0;
     while (!q.eof())
       {
        nbloaded++;
@@ -705,9 +722,11 @@ namespace creaImageIO
       }
 
     node->SetChildrenLoaded(true);
+       
     
     //    msw[2].Pause();
     return nbloaded;
+       }
   }
   //=====================================================================
 
@@ -721,6 +740,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;
@@ -745,7 +765,7 @@ namespace creaImageIO
       {
        // Create Node
        tree::Node* child = new tree::Node(parent,attr);
-       
+       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 +832,62 @@ 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(GetTree().GetNumberOfLevels()!=(level+1))
+       {
+       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())
+               {
+                       nb++;
+                       q.nextRow();
+               }
+       }
+    return nb; 
+  }
+
   /*
   //=====================================================================
   bool SQLiteTreeHandler::DBInsert(Node* alien_node,
@@ -1098,12 +1174,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 +1192,8 @@ namespace creaImageIO
     //    std::cout << "DELETE OK"<<std::endl;
     return true;
   }
+  
+  
   //========================================================================
 
   //=====================================================================
@@ -1136,6 +1216,7 @@ namespace creaImageIO
        DBRecursiveRemoveNode((*i));
       }
   }
+  
   //=====================================================================
   
   //=====================================================================