]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOSynchron.cpp
move directory
[creaImageIO.git] / src / creaImageIOSynchron.cpp
diff --git a/src/creaImageIOSynchron.cpp b/src/creaImageIOSynchron.cpp
new file mode 100644 (file)
index 0000000..0955ffa
--- /dev/null
@@ -0,0 +1,451 @@
+#include <creaImageIOSynchron.h>
+#include <creaImageIOSystem.h>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
+
+
+//namespace fs = boost::filesystem;
+
+//=====================================================================
+
+namespace creaImageIO
+{
+
+    //=====================================================================
+    #define QUERYSYNCDB(QUER,RES)                                      \
+    try                                                                        \
+    {                                                                  \
+       RES = mDB->execQuery(QUER.c_str());                             \
+    }                                                                  \
+    catch (CppSQLite3Exception& e)                                     \
+    {                                                                  \
+      GimmickError("SQLite query '"<<QUER<<"' Error : "                        \
+                  << e.errorCode() << ":"                              \
+                  << e.errorMessage() );                               \
+    }                                                                                                                                     
+   //=====================================================================
+    #define UPDATESYNCDB(UP)                                           \
+    try                                                                        \
+    {                                                                  \
+      mDB->execDML(UP.c_str());                                                \
+    }                                                                  \
+    catch (CppSQLite3Exception& e)                                     \
+    {                                                                  \
+      GimmickError("SQLite update '"<<UP<<"' Error : "                 \
+                  << e.errorCode() << ":"                              \
+                  << e.errorMessage() );                               \
+    }                          
+   //=====================================================================
+
+    Synchronizer::Synchronizer(const std::string& path)
+    {
+               pathDB = path + "maintenance_database.db3";
+               mDB = new CppSQLite3DB;
+               Initialize();
+    }
+
+   //=====================================================================
+    Synchronizer::~Synchronizer()
+    {
+       delete mDB;
+    }
+
+       //=====================================================================
+       void Synchronizer::Initialize()
+       {    
+               if (!boost::filesystem::exists(pathDB)) 
+               {
+                       CreateDB();
+               }
+    
+               // OPENING
+               else
+               {
+               try
+               {
+               mDB->open(pathDB.c_str());
+               }
+               catch (CppSQLite3Exception& e)
+               {
+               GimmickError("Opening '"<<pathDB<<"' : "
+                    << e.errorCode() << ":" 
+                    << e.errorMessage());
+               }
+               }
+               // get the ADD operations List 
+               //UpdateAddList(pathDB);
+       }
+
+   //=====================================================================
+    void Synchronizer::CreateDB()
+    {
+               mDB->open(pathDB.c_str());
+        // CREATING TABLES
+       std::string command;
+       command = "CREATE TABLE ";
+       command += "ADD_OPS";
+       command += "\n(\nADD_KEY INTEGER PRIMARY KEY";
+       command += ",\nPATH text";
+       command += ",\nRECURSIVE boolean";
+       command += ",\nFILES_ADDED int";
+       command += ",\nREFERENCEDDB text";
+       command += "\n)";
+       UPDATESYNCDB(command);
+
+       command = "CREATE TABLE ";
+       command += "IGNORED_FILES";
+       command += "\n(\nID INTEGER PRIMARY KEY";
+       command += ",\nADD_KEY integer";
+       command += ",\nPATH text";
+       command += ",\nREMOVE boolean";
+       command += ",\nTIME datetext";
+       command += "\n)";
+       UPDATESYNCDB(command);
+    }
+
+       //=====================================================================
+       void Synchronizer::CleanName(std::string& str) const
+       {
+               size_t pos;
+               do
+               {
+                       pos = str.find('\\');
+                       if (pos!=-1)  
+                       {
+                               str.replace(pos, 1, "/");
+                       }
+               }
+               while (pos!=-1);
+       }
+
+       //=====================================================================
+    void Synchronizer::GetFileList(std::vector<AddList> & list, const std::string& refdb)
+    {
+       CleanList(refdb);
+       list=mAddList;
+    }
+
+       //=====================================================================
+   void Synchronizer::GetIgnoredFiles(const std::string& key, std::vector<std::string> &ignoreList)
+   {
+        ignoreList=GetIgnoreList(key);
+   }
+
+//=====================================================================
+    void Synchronizer::UpdateAddList(const std::string& refdb)
+    {
+        std::string query = "SELECT * FROM ADD_OPS WHERE REFERENCEDDB = '"+refdb+"';";
+        CppSQLite3Query res;
+        QUERYSYNCDB(query, res);
+       while (!res.eof())
+        {
+           AddList temp = AddList(res);
+            mAddList.push_back(temp);
+           res.nextRow();
+        }
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // remove an entry of the DB
+    //@param i_table : table where to do the remove
+    // @param i_key : the add_key reference (one entry to remove for ADD_OP table, many for IGNORED_FILES table
+    //@result : -
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    void Synchronizer::RemoveEntry(const std::string i_table, const std::string i_key)
+    {
+        std::string query = "DELETE  FROM " + i_table + " WHERE ADD_KEY = '" + i_key +"'";
+        UPDATESYNCDB(query);
+    }
+
+       /////////////////////////////////////////////////////////////////////////////////////////////////
+    // remove several entries of the DB
+    // @param i_table : table where to do the remove
+    // @param i_attribute: attribute to match
+    // @param i_operand : operand to use
+    // @param i_val : the reference
+    //@result : -
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    void Synchronizer::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<<"'";
+        UPDATESYNCDB(query.str());
+       }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // clean DataBase if an operation has no child anymore
+       // @param refdb: the database segement to clean
+    // @result : -
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    void Synchronizer::CleanList(const std::string& refdb)
+    {
+       mAddList.clear();
+       UpdateAddList(refdb);
+        std::vector<AddList>::iterator it_add = mAddList.begin();
+        for(;it_add <mAddList.end(); ++it_add)
+        {
+                if(it_add->nbFiles == "0")
+                {
+                       RemoveEntry("ADD_OPS", it_add->key);
+                       RemoveEntry("IGNORED_FILES", it_add->key);
+
+                }
+        }
+               mAddList.clear();
+               UpdateAddList(refdb);
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // Inserts a new add operation in the database
+    // @param path: the path of the directory that was added
+    // @param recursive: shows if the action was called recursively or not
+    // @param nChildren: the number of files affected by the operation
+    // @param refdb: the referenced database
+    // @result : The operation has been added
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+       void Synchronizer::InsertAddOp(const std::string& path, const std::string& recursive, const std::string& nChildren, const std::string& refdb)
+       {
+               std::string insert;
+               std::string pat=path.c_str();
+               CleanName(pat);
+               insert="INSERT INTO ADD_OPS (PATH,RECURSIVE,FILES_ADDED,REFERENCEDDB) VALUES('";
+               insert+=pat+"','";
+               insert+=recursive+"',";
+               insert+=nChildren+",'";
+               insert+=refdb+"');";
+               UPDATESYNCDB(insert);
+       }
+
+       /////////////////////////////////////////////////////////////////////////////////////////////////
+    // Inserts a new ignored file in the database
+       // @param add_key: the key of the add_op to which it corresponds
+    // @param path: the path of the directory that was added
+       // @param remove: shows if the file was removed or not
+       // @param time: the time in which the file was removed
+    // @result : The file has been inserted
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+
+       void Synchronizer::InsertIgnoreFile(const std::string& addKey, const std::string& path, const std::string& remove, const std::string& time, const std::string& refdb )
+       {
+               std::string pat=path.c_str();
+               CleanName(pat);
+               std::string id=GetAttribute("ID","IGNORED_FILES","PATH",pat,refdb);
+               if(id.compare("")==0)
+               {
+                       std::string insert;
+                       insert="INSERT INTO IGNORED_FILES (ADD_KEY,PATH,REMOVE,TIME) VALUES('";
+                       insert+=addKey+"','";
+                       insert+=pat+"','";
+                       insert+=remove+"',";
+                       insert+=time+");";
+                       UPDATESYNCDB(insert);
+               }
+               else
+               {
+                       //Gets the add key
+                       std::string ak=GetAttribute("ADD_KEY","IGNORED_FILES","ID",id,refdb);
+                       //gets the parent database to check if the file has been added to the current database
+                       std::string parentDB=GetAttribute("*","ADD_OPS","ADD_KEY",ak,refdb);
+                       //If there is no such entry, add it
+                       if(parentDB.compare("")==0)
+                       {
+                               std::string insert;
+                               insert="INSERT INTO IGNORED_FILES (ADD_KEY,PATH,REMOVE,TIME) VALUES('";
+                               insert+=addKey+"','";
+                               insert+=pat+"','";
+                               insert+=remove+"',";
+                               insert+=time+");";
+                               UPDATESYNCDB(insert);
+                       }
+                       else
+                       {
+                               //Sets the new add key attribute for the file
+                               SetAttribute("ADD_KEY","IGNORED_FILES",addKey,"ID", id,refdb);
+                               //Sets the new remove attribute for the file
+                               SetAttribute("REMOVE","IGNORED_FILES",remove,"ID", id,refdb);
+                               //Sets the new time attribute for the file
+                               SetAttribute("TIME","IGNORED_FILES",time,"ID", id,refdb);
+                       }
+               }
+       }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // get the files name to ignore for a add operation synchronization
+    // @param : the add key
+    //@result : list (path) of ignore files
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    std::vector<std::string> Synchronizer::GetIgnoreList(const std::string &i_key)
+    {
+        mIgnoreList.clear();
+        std::vector<std::string> i_names;
+       std::string query = "SELECT * FROM IGNORED_FILES WHERE ADD_KEY = ";
+       query+=i_key;
+        CppSQLite3Query res;
+        QUERYSYNCDB(query, res);
+       while (!res.eof())
+        {
+               RemoveList temp = RemoveList(res);
+               if(temp.remove.compare("0")==0)
+               {
+                   mIgnoreList.push_back(temp);
+               }
+               res.nextRow();
+        }
+        std::vector<RemoveList>::iterator it;
+
+        for(it = mIgnoreList.begin();it != mIgnoreList.end(); ++it)
+        {
+            i_names.push_back((*it).path);
+        }
+       return i_names;
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // Gets the required attribute in the required table
+    // @param attribute: the attribute to look for
+    // @param table: the table to look in
+    // @param searchParam: the search parameter
+    // @param searchValue: the search value
+    // @result : required attribute
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    std::string Synchronizer::GetAttribute(const std::string& attribute, 
+                                       const std::string& table, 
+                                       const std::string& searchParam,
+                                       const std::string& searchValue, 
+                                       const std::string& refdb)
+    {
+        std::stringstream query;
+       std::string result;
+       std::string sVal=searchValue.c_str();
+       CleanName(sVal);
+       query<<"SELECT "<<attribute<<" FROM "<<table<<" WHERE "<<searchParam<<" = '"<<sVal;
+       if(table.compare("ADD_OPS")==0)
+       {
+               query<<"' AND REFERENCEDDB = '"<<refdb<<"';";
+       }
+       else
+       {
+               query<<"';";
+       }
+        CppSQLite3Query res;
+        QUERYSYNCDB(query.str(), res);
+       while (!res.eof())
+        {
+               result=res.getStringField(0);
+               res.nextRow();
+        }
+       return result;
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // Sets the attribute value in the required table and column
+    // @param attribute: the attribute to look for
+    // @param table: the table to look in
+    // @param value: the value to set
+    // @param searchParam: the search parameter
+    // @param searchValue: the search value
+    // @result : attribute value changed
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    void Synchronizer::SetAttribute(const std::string& attribute, 
+                               const std::string& table, 
+                               const std::string& value,
+                               const std::string& searchParam,
+                               const std::string& searchValue,
+                               const std::string& refdb)
+    {
+       std::string val=value.c_str();
+       std::string sVal=searchValue.c_str();
+       CleanName(val);
+       CleanName(sVal);
+       std::string sql = "UPDATE ";
+       sql+=table;
+       sql+=" SET ";
+       sql += attribute;
+       sql += " = '";
+       sql += val;
+       sql += "' WHERE ";
+       sql += searchParam;
+       sql += " = '";
+       sql += sVal;
+       if(table.compare("ADD_OPS")==0)
+       {
+               sql += "' AND REFERENCEDDB = '";
+               sql += refdb;
+       }
+       sql += "';";
+       UPDATESYNCDB(sql);
+    }
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+    // get the files name to ignore for a add operation synchronization
+    // @param : the add key
+    //@result : list (path) of ignore files
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+       void Synchronizer::GetList(const std::string i_db)
+    {
+               mList.clear();
+        std::vector<std::string> i_names;
+               std::vector<std::string> keys;
+               CppSQLite3Query res;
+               std::string query ="SELECT ADD_KEY, REFERENCEDDB FROM  ADD_OPS";
+               QUERYSYNCDB(query, res);
+               keys.clear();
+               while (!res.eof())
+        {
+                       std::string key(res.getStringField(0));
+                       std::string db(res.getStringField(1));
+                       if (db == i_db)
+                       {
+                               keys.push_back(key);
+                       }
+                       res.nextRow();
+               }
+               query = "SELECT PATH, REMOVE FROM IGNORED_FILES WHERE";
+               if(keys.size() > 0)
+               {
+                       for (int i=0; i < keys.size(); i++)
+                       {
+                               query += " ADD_KEY = " + keys[i];
+                               query += " AND";
+                       }
+                       query = query.substr(0,query.size() - 4);
+               }
+               else 
+               {
+                       query += " ADD_KEY = -1";
+               }
+        QUERYSYNCDB(query, res);
+               while (!res.eof())
+        {
+               std::string file(res.getStringField(0));
+               std::string ignore(res.getStringField(1));
+               mList[file] = ignore == "0"? true : false;
+               res.nextRow();
+        }
+    }
+
+       bool Synchronizer::isIndexed(const std::string filename)
+       {
+               bool valid = true;
+               std::string name(filename);
+               boost::algorithm::replace_all( name,"\\" , "/");
+               std::map <std::string, bool>::iterator it_list = mList.begin();
+               for(;it_list != mList.end(); it_list++)
+               {
+                       if(it_list->first == name)
+                       {
+                               valid = false;
+                               break;
+                       }
+               }
+               return valid;
+       }
+}
+
+