]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOSQLiteTreeHandler.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOSQLiteTreeHandler.cpp
index 7d9f7ef4587ffeffbfb42abac854f05dff4666ff..26a9641d92247dbe21f04aac67008cc4718f5683 100644 (file)
@@ -36,6 +36,7 @@ namespace creaImageIO
     : mFileName(filename)
   {
     mDB = new CppSQLite3DB;
+       mIsAdding=false;
     GimmickMessage(1,"SQLite version : "
                   <<std::string(mDB->SQLiteVersion())<< std::endl);
   }
@@ -126,13 +127,21 @@ 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);
+         
   }
   //===================================================================== 
  
@@ -143,11 +152,30 @@ namespace creaImageIO
    DBRecursiveRemoveNode(node);
  
     //    std::cout << "DELETE"<<std::endl;
-    if (node->GetParent())
+   bool remove=false;
+   tree::Node* parent=node->GetParent();
+    if (parent)
       {
-       node->GetParent()->RemoveChildrenFromList(node);
+       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;
    }
@@ -381,7 +409,6 @@ namespace creaImageIO
                   << i->GetGroup() << ","
                   << i->GetElement() << ","
                   << i->GetFlags() << ");";
-           
            UPDATEDB(insert.str());
          }
 
@@ -661,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();
@@ -668,9 +696,12 @@ namespace creaImageIO
          {
            nbloaded += DBLoadChildren(*i,numberoflevels-1);
          }
+       node->SetChildrenLoaded(true);
        return nbloaded;
+
       }
-    
+       else
+       {
     /// If children not loaded : do it and recurse
 
     // Query DB
@@ -686,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++)
@@ -713,9 +748,11 @@ namespace creaImageIO
       }
 
     node->SetChildrenLoaded(true);
+       
     
     //    msw[2].Pause();
     return nbloaded;
+       }
   }
   //=====================================================================
 
@@ -745,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();
@@ -754,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"));
@@ -848,34 +888,36 @@ namespace creaImageIO
       }
   }
 
-  //=====================================================================
-
   //===================================================================== 
   unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) 
   { 
          // Query DB
        int nb=0;
     int level = n->GetLevel();
-       if(GetTree().GetNumberOfLevels()!=(level+1))
+       
+       if(level<GetTree().GetNumberOfLevels()&& level>0)
        {
-       std::string query = "SELECT * FROM ";
-    query += GetTree().GetLevelDescriptor(level+1).GetName();
+               std::string query = "SELECT NumberOfChildren FROM ";
+    query += GetTree().GetLevelDescriptor(level).GetName();
     if (level>0)
       {
-       query += " WHERE PARENT_ID='" + n->UnsafeGetAttribute("ID") 
+       query += " WHERE ID='" + n->UnsafeGetAttribute("ID") 
          + "'";
       }
-
     CppSQLite3Query q;
     QUERYDB(query,q);
        
 
                while (!q.eof())
                {
-                       nb++;
+                       for (int fld = 0; fld < q.numFields(); fld++)
+                       {
+                               nb=q.getIntField(fld);  
+                       }
                        q.nextRow();
                }
        }
+       if(nb==0){nb=1;}
     return nb; 
   }