]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOTimestampDatabaseHandler.cpp
Added functionality of timestamp and maintenance databases when using multiple sources
[creaImageIO.git] / src2 / creaImageIOTimestampDatabaseHandler.cpp
index be586d8cdf5f924ac80e5792f1d6c724cca27259..167224be19496f29074a278b5c30343f542a8fb2 100644 (file)
@@ -169,6 +169,7 @@ namespace creaImageIO
                command += ",\nLastModified datetext";
                command += ",\nLastRead datetext";
                command += ",\nTopLevelNodeId text";
+               command += ",\nReferencedDB text";
                command += ",\nconstraint FK_PARENT foreign key (PARENT_ID) references ";
                command += "FILES";
                command += "(ID) on delete restrict on update restrict";
@@ -182,7 +183,7 @@ namespace creaImageIO
 
 
   //=====================================================================
-  void TimestampDatabaseHandler::CleanName(std::string& str) const
+  void TimestampDatabaseHandler::CleanPath(std::string& str) const
   {
         size_t pos;
         do
@@ -195,56 +196,55 @@ namespace creaImageIO
      }
      while ((int)pos!=-1);
   }
-
-
   //=====================================================================
 
   bool TimestampDatabaseHandler::AddDirectory(const std::string& parent,
                                                                                   const std::string& path, 
                                                                                   const time_t lastModif, 
-                                                                                  const time_t lastRead)
+                                                                                  const time_t lastRead,
+                                                                                  const std::string& refdb)
   {
         bool valid=false;
         std::string par=parent.c_str();
         std::string pat=path.c_str();
-        CleanName(par);
-        CleanName(pat);
+        CleanPath(par);
+        CleanPath(pat);
 
-        std::string pathId=IsIndexed(pat);
+        std::string pathId=IsIndexed(pat,refdb);
         //Case: It is a root parent
         if(parent.compare("")==0)
         {
                 if(pathId.compare("")==0)
                 {
-                       AddFile(pat,lastModif,lastRead);
+                       AddFile(pat,lastModif,lastRead,refdb);
                        valid=true;
                 }
                 else
                 {
-                        valid=CheckTimestamp(pathId, lastModif);
+                        valid=CheckTimestamp(pathId, lastModif, refdb);
                 }
         }
         else 
         {
-                std::string parentId=IsIndexed(par);
+                std::string parentId=IsIndexed(par,refdb);
                 //Case: Parent is not in database
                 if(parentId.compare("")==0)
                {
-                       AddFile(par,lastModif,lastRead);
-                       parentId=IsIndexed(par);
+                       AddFile(par,lastModif,lastRead,refdb);
+                       parentId=IsIndexed(par,refdb);
                }
 
                //Case path is not in database
                if(pathId.compare("")==0)
                {
-                   AddFile(parentId,pat,lastModif,lastRead);
+                   AddFile(parentId,pat,lastModif,lastRead,refdb);
                        valid=true;
                }
                //Parent and path are in the database
                else
                {
                        SetAttribute("PARENT_ID",parentId,"ID", pathId);
-                       valid=CheckTimestamp(pathId, lastModif);
+                       valid=CheckTimestamp(pathId, lastModif, refdb);
                }
         }
         return valid;
@@ -253,11 +253,11 @@ namespace creaImageIO
 
   //=====================================================================
 
-  void TimestampDatabaseHandler::AddFile(const std::string& path, const time_t lastModif, const time_t lastRead)
+  void TimestampDatabaseHandler::AddFile(const std::string& path, const time_t lastModif, const time_t lastRead,  const std::string& refdb)
   {
        std::stringstream out;
-       out<<"INSERT INTO FILES (PARENT_ID,PATH,LastModified,LastRead) VALUES(0,'"<<path<<"',";
-       out<<lastModif<<","<<lastRead<<");";
+       out<<"INSERT INTO FILES (PARENT_ID,PATH,LastModified,LastRead,ReferencedDB) VALUES(0,'"<<path<<"',";
+       out<<lastModif<<","<<lastRead<<",'"<<refdb<<"');";
     UPDATETIMESTAMPDB(out.str());
        
   }
@@ -267,20 +267,21 @@ namespace creaImageIO
   void TimestampDatabaseHandler::AddFile(const std::string& parentId, 
                                                                                 const std::string& path, 
                                                                                 const time_t lastModif, 
-                                                                                const time_t lastRead)
+                                                                                const time_t lastRead,  
+                                                                                const std::string& refdb)
   {
        std::stringstream out;
-       out<<"INSERT INTO FILES (PARENT_ID,PATH,LastModified,LastRead) VALUES("<<parentId<<",'"<<path<<"',";
-       out<<lastModif<<","<<lastRead<<");";
+       out<<"INSERT INTO FILES (PARENT_ID,PATH,LastModified,LastRead,ReferencedDB) VALUES("<<parentId<<",'"<<path<<"',";
+       out<<lastModif<<","<<lastRead<<",'"<<refdb<<"');";
     UPDATETIMESTAMPDB(out.str());
   }
 
   //=====================================================================
-  std::string TimestampDatabaseHandler::IsIndexed(const std::string& path)
+  std::string TimestampDatabaseHandler::IsIndexed(const std::string& path, const std::string& refdb)
   {
        std::stringstream out;
        std::stringstream result;
-       out<<"SELECT ID FROM FILES WHERE PATH='"<<path<<"'";
+       out<<"SELECT ID FROM FILES WHERE PATH='"<<path<<"' AND REFERENCEDDB='"<<refdb<<"';";
                
        CppSQLite3Query q;
        QUERYTIMESTAMPDB(out.str(),q);
@@ -306,8 +307,8 @@ namespace creaImageIO
   {
        std::string av=attValue.c_str();
        std::string sv=searchValue.c_str();
-       CleanName(av);
-       CleanName(sv);
+       CleanPath(av);
+       CleanPath(sv);
 
        std::string sql = "UPDATE FILES SET ";
     sql += attName;
@@ -322,7 +323,7 @@ namespace creaImageIO
   }
  
   //=====================================================================
-  void TimestampDatabaseHandler::RemoveNode(const std::string& searchAtt, const tree::Node* node)
+  void TimestampDatabaseHandler::RemoveNode(const std::string& searchAtt, const tree::Node* node, const std::string& refdb)
   {
          int n=node->GetNumberOfChildren();
          if(n>0)
@@ -331,26 +332,26 @@ namespace creaImageIO
                  std::vector<tree::Node*>::iterator it;
                  for(it=children.begin();it!=children.end();++it)
                  {
-                         RemoveNode(searchAtt,(*it));
+                         RemoveNode(searchAtt,(*it),refdb);
                  }
          }
          else if(node->GetLevel()==3)
          {
-                 RemoveFile(searchAtt,node->GetAttribute("FullFileName"));
+                 RemoveFile(searchAtt,node->GetAttribute("FullFileName"),refdb);
          }
          else
          {
-                 DBRemove("TopLevelNodeId",node->GetAttribute("ID"));
+                 DBRemove("TopLevelNodeId",node->GetAttribute("ID"),refdb);
          }
 
 
   }
   //=====================================================================
-  void TimestampDatabaseHandler::RemoveFile(const std::string& searchAtt, const std::string& searchVal)
+  void TimestampDatabaseHandler::RemoveFile(const std::string& searchAtt, const std::string& searchVal, const std::string& refdb )
   {
          
          std::stringstream result;
-         std::string sel="SELECT PARENT_ID FROM FILES WHERE "+searchAtt+"='"+searchVal+"'";
+         std::string sel="SELECT PARENT_ID FROM FILES WHERE "+searchAtt+"='"+searchVal+"' AND REFERENCEDDB='"+refdb+"';";
                
          CppSQLite3Query q;
          QUERYTIMESTAMPDB(sel,q);
@@ -363,7 +364,7 @@ namespace creaImageIO
              }
            q.nextRow();
          }
-         DBRemove(searchAtt,searchVal);
+         DBRemove(searchAtt,searchVal,refdb);
          
                  int nChildren=0;
                  sel="SELECT ID FROM FILES WHERE PARENT_ID='"+result.str()+"'";
@@ -378,27 +379,27 @@ namespace creaImageIO
                        {
                                if(!result.str().compare("0"))
                                {
-                               RemoveFile("ID",result.str());
+                               RemoveFile("ID",result.str(),refdb);
                                }
                                else
                                {
-                               DBRemove("ID",result.str());
+                               DBRemove("ID",result.str(),refdb);
                                }
                        }
   }
 
   //=====================================================================
-  void TimestampDatabaseHandler::DBRemove(const std::string& searchAtt, const std::string& searchVal)
+  void TimestampDatabaseHandler::DBRemove(const std::string& searchAtt, const std::string& searchVal, const std::string& refdb)
   {
        
-    std::string query = "DELETE FROM FILES WHERE "+searchAtt+"='"+ searchVal + "';";
+    std::string query = "DELETE FROM FILES WHERE "+searchAtt+"='"+ searchVal + "' AND REFERENCEDDB='"+refdb+"';";
     UPDATETIMESTAMPDB(query);
   }
 
    //=====================================================================
-  bool TimestampDatabaseHandler::CheckTimestamp(const std::string pathId, const time_t lastModif)
+  bool TimestampDatabaseHandler::CheckTimestamp(const std::string pathId, const time_t lastModif, const std::string& refdb)
   {
-       std::string sel="SELECT LastModified FROM FILES WHERE ID='"+pathId+"';";
+       std::string sel="SELECT LastModified FROM FILES WHERE ID='"+pathId+"' AND REFERENCEDDB='"+refdb+"';";
        CppSQLite3Query q;
        QUERYTIMESTAMPDB(sel,q);
        double timestamp;