]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOSQLiteTreeHandler.cpp
correction sur la sélection.
[creaImageIO.git] / src2 / creaImageIOSQLiteTreeHandler.cpp
index 4363e7c0a99de19d39fc44b4e0570f0598a9496d..52042a21a097d8564bbae4950d2ed4ec8890dea8 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);
   }
@@ -143,11 +144,28 @@ 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);
+       int nC = parent->RemoveChildrenFromList(node);
+       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;
    }
@@ -168,6 +186,24 @@ namespace creaImageIO
     return DBSetAttribute(n,key,value);
   }
   //===================================================================== 
+   //===================================================================== 
+  /// Sets an attribute
+  void SQLiteTreeHandler::SetAttribute(const std::string& levelDescriptor, 
+                             const std::string& key,
+                             const std::string& value,
+                                 const std::string& searchParam, 
+                                 const std::string& searchVal)
+  {
+       DBSetAttribute(levelDescriptor,key,value,searchParam, searchVal);
+  }
+  //===================================================================== 
+  /// Deletes a tuple
+  void SQLiteTreeHandler::DeleteTuple(std::string levelDescriptor, 
+                                                               std::string key, std::string value)
+  {
+    DBDelete(levelDescriptor,key,value);
+  }
+  //===================================================================== 
 
 
 
@@ -661,17 +697,19 @@ namespace creaImageIO
       {
        // 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);
-         }*/
+         }
+       node->SetChildrenLoaded(true);
        return nbloaded;
 
       }
-    
+       else
+       {
     /// If children not loaded : do it and recurse
 
     // Query DB
@@ -687,9 +725,12 @@ namespace creaImageIO
     CppSQLite3Query q;
     QUERYDB(query,q);
 
+       int p=0;
     while (!q.eof())
       {
-       //        std::cout<<"Name in q: "<<q.fieldName(3)<<" Value: "<<q.getStringField(3)<<std::endl;
+
+       //      std::cout << "DBLoadCh : creating node level "<<level+1<<std::endl;
+
        nbloaded++;
        Node* n = new Node(node);
        for (int fld = 0; fld < q.numFields(); fld++)
@@ -707,7 +748,7 @@ namespace creaImageIO
        if ( numberoflevels != 1 ) 
          {
            //  msw[2].Pause();
-       //    nbloaded += DBLoadChildren(n, numberoflevels-1);
+           nbloaded += DBLoadChildren(n, numberoflevels-1);
            //      msw[2].Resume();
          }
        // next entry in db
@@ -715,9 +756,11 @@ namespace creaImageIO
       }
 
     node->SetChildrenLoaded(true);
+       
     
     //    msw[2].Pause();
     return nbloaded;
+       }
   }
   //=====================================================================
 
@@ -747,8 +790,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();
@@ -756,7 +799,17 @@ 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 "<<parent->GetNumberOfChildren()<<std::endl;
+           std::stringstream out;
+           out << nc;
+           SetAttribute(parent,"NumberOfChildren",out.str());
+         }
+
        // Set PARENT_ID if necessary 
        if ( parent->GetLevel()>0 )
          child->SetAttribute("PARENT_ID",parent->GetAttribute("ID"));
@@ -814,17 +867,38 @@ 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);
   }
-  //===================================================================== 
 
+  //===================================================================== 
+  /// 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 += "'";
+    UPDATEDB(sql);
+  }
+   //=====================================================================
   void SQLiteTreeHandler::DBRecursiveRemoveNode(Node* node)
   {
        
@@ -850,32 +924,87 @@ namespace creaImageIO
       }
   }
 
+  //=====================================================================
+  void SQLiteTreeHandler::DBDelete(std::string levelDescriptor, std::string key, std::string value)
+  {
+       
+    std::stringstream query;
+       query<<"DELETE FROM "<<levelDescriptor<<" WHERE "<<key<<"='"<<value<<"';";
+    UPDATEDB(query.str());
+       GimmickMessage(1," Deleting: Query: "<<query.str()<<std::endl);
+  }
+
+
+  //===================================================================== 
+  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 "<<key<<" FROM "<<levelDescriptor;
+       if(searchParam!="")
+       {
+               out<<" WHERE "<<searchParam<<"='"<<searchVal<<"'";
+       }
+       
+       CppSQLite3Query q;
+       QUERYDB(out.str(),q);
+       
+       
+       while (!q.eof())
+         {
+           for (int fld = 0; fld < q.numFields(); fld++)
+             {
+                         results<<q.getStringField(fld);
+                         if(searchParam=="")
+                         {
+                                 results<<"#";
+                         }
+             }
+           q.nextRow();
+         }
+       result=results.str();
+      
+  }
   //===================================================================== 
   unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n) 
   { 
-         // Query DB
-       int nb=0;
+    // 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);
+    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())
-               {
-                       nb++;
-                       q.nextRow();
-               }
-       }
+       
+       while (!q.eof())
+         {
+           for (int fld = 0; fld < q.numFields(); fld++)
+             {
+               nb=q.getIntField(fld);  
+             }
+           q.nextRow();
+         }
+      }
+    /*
+    if(nb==0)
+      { 
+       nb=1;
+      }
+    */
     return nb; 
   }