]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOSQLiteTreeHandler.cpp
Added attribute selection functionality.
[creaImageIO.git] / src2 / creaImageIOSQLiteTreeHandler.cpp
index aec51554f68406d87bd679cebf989b9770b542cf..596a92a17492e963abea3cabcd061ccb084549e4 100644 (file)
@@ -132,14 +132,6 @@ namespace creaImageIO
   {
     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,"D1111_0011",out.str());
-       }
     return (parent->GetLevel()+1);
          
   }
@@ -156,14 +148,12 @@ namespace creaImageIO
    tree::Node* parent=node->GetParent();
     if (parent)
       {
-       parent->RemoveChildrenFromList(node);
-       int nC=GetNumberOfChildren(parent);
-       nC=nC-1;
-       if(nC>0)
+       int nC = parent->RemoveChildrenFromList(node);
+       if(nC>0 && parent->GetLevel()>0)
        {       
                std::stringstream out;
                out <<nC;
-               SetAttribute(parent,"D1111_0011",out.str());
+               SetAttribute(parent,"NumberOfChildren",out.str());
        }
        else
        {
@@ -179,10 +169,6 @@ namespace creaImageIO
     //    std::cout << "DELETE OK"<<std::endl;
     return true;
    }
-
-    //========================================================================
-
-  
   
   //===================================================================== 
 
@@ -196,6 +182,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);
+  }
+  //===================================================================== 
 
 
 
@@ -791,9 +795,16 @@ 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;
+       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 )
@@ -852,17 +863,39 @@ 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 += "'";
+       std::cout<<sql<<std::endl;
+    UPDATEDB(sql);
+  }
+   //=====================================================================
   void SQLiteTreeHandler::DBRecursiveRemoveNode(Node* node)
   {
        
@@ -879,48 +912,202 @@ namespace creaImageIO
                            <<"' 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));
-      }
+
+       if(node->GetNumberOfChildren()!=0)
+       {
+               Node::ChildrenListType::iterator i;
+               for (i  = node->GetChildrenList().begin();
+               i != node->GetChildrenList().end();
+               i++)
+               {
+               DBRecursiveRemoveNode((*i));
+               }
+       }
+       else if(node->GetLevel()<GetTree().GetNumberOfLevels()-1)
+       {
+               DBRecursiveRemoveNode(node->GetLevel()+1,node->GetAttribute("ID"));
+    }
   }
 
+  //=====================================================================
+  void SQLiteTreeHandler::DBRecursiveRemoveNode(int level, std::string parentId)
+  {
+    std::stringstream out;
+       std::stringstream result;
+       out<<"SELECT ID FROM "<<GetTree().GetLevelDescriptor(level).GetName()<<" WHERE PARENT_ID='"<<parentId<<"'";
+               
+       CppSQLite3Query q;
+       QUERYDB(out.str(),q);
+       
+       while (!q.eof())
+         {
+           for (int fld = 0; fld < q.numFields(); fld++)
+             {
+                         result<<q.getStringField(fld)<<"#";
+             }
+           q.nextRow();
+         }
+         std::string res=result.str();
+         size_t ini=0;
+         size_t fin=0;
+         while(fin<res.size()-1)
+         {
+          fin=res.find('#',ini);
+          DBDelete(GetTree().GetLevelDescriptor(level).GetName(),"ID",res.substr(ini,fin-ini));
+         if(level<GetTree().GetNumberOfLevels()-1)
+         {
+               DBRecursiveRemoveNode(level+1,res.substr(ini,fin-ini));
+         } 
+          ini=fin+1;
+         }
+         
+    
+  }
+
+  //=====================================================================
+  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());
+       GimmickDebugMessage(2," 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(level<GetTree().GetNumberOfLevels()&& level>0)
-       {
-               std::string query = "SELECT D1111_0011 FROM ";
-    query += GetTree().GetLevelDescriptor(level).GetName();
-    if (level>0)
+
+    if(level<GetTree().GetNumberOfLevels()&& level>0)
       {
-       query += " WHERE ID='" + n->UnsafeGetAttribute("ID") 
-         + "'";
-      }
-    CppSQLite3Query q;
-    QUERYDB(query,q);
+       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; 
+  }
+
+  //===================================================================== 
+  void SQLiteTreeHandler::GetTopLevelNodeId(const std::string& searchParam, const std::string& searchValue, std::string& parent_id) 
+  {
+         int level=GetTree().GetNumberOfLevels()-1;
+         std::string sp=searchParam.c_str();
+         std::string sv=searchValue.c_str();
 
+         while(level>1)
+         {
+               std::stringstream out;
+               std::stringstream results;
+               out<<"SELECT PARENT_ID FROM "<<GetTree().GetLevelDescriptor(level).GetName();
+               out<<" WHERE "<<sp<<"='"<<sv<<"'";      
+               CppSQLite3Query q;
+               QUERYDB(out.str(),q);
+               
+               
                while (!q.eof())
                {
                        for (int fld = 0; fld < q.numFields(); fld++)
                        {
-                               nb=q.getIntField(fld);  
+                               results<<q.getStringField(fld);
                        }
                        q.nextRow();
                }
-       }
-       if(nb==0){nb=1;}
-    return nb; 
+               level=level-1;
+               sp="ID";
+               sv=results.str();
+         }
+         parent_id=sv;
+
   }
 
+  //=====================================================================
+  void SQLiteTreeHandler::RemoveEntries(const std::string i_table, 
+               const std::string i_attribute, 
+               const std::string i_operand, 
+               const std::string i_val)
+    {
+        std::stringstream query;
+               query<<"DELETE  FROM "<<i_table<<" WHERE "<<i_attribute<<" "<<i_operand<<" '"<<i_val<<"'";
+        UPDATEDB(query.str());
+       }
+
+       //=====================================================================
+  void SQLiteTreeHandler::BeginTransaction()
+    {
+               std::stringstream out;
+               out<<"begin transaction;";
+        UPDATEDB(out.str());
+       }
+
+       //=====================================================================
+  void SQLiteTreeHandler::EndTransaction()
+    {
+       std::stringstream out;
+               out<<"commit transaction;";
+        UPDATEDB(out.str());
+       }
+
   /*
   //=====================================================================
   bool SQLiteTreeHandler::DBInsert(Node* alien_node,