#include <creaImageIOGimmick.h>
#include <creaImageIOSystem.h>
-
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
: mImageAdder(0)
{
RegisterGimmickMessageTypes();
+ mSettings=0;
+ mSynchronizer=0;
}
//==============================================================
//==============================================================
Gimmick::~Gimmick()
{
-
+ if(mSettings!=0)
+ {
+ mSettings->writeSettingsFile();
+ delete mSettings;
+ }
+ if(mSynchronizer!=0)
+ {
+ delete mSynchronizer;
+ }
}
//==============================================================
//==============================================================
void Gimmick::Initialize()
{
+ std::string i_nameDB = "Local database";
// Create the UserSettings dir if does not exist
CreateUserSettingsDirectory();
// Sets the current directory to the home dir
mCurrentDirectory = GetHomeDirectory();
- mSynchronizer=0;
+ mSynchronizer= new Synchronizer(GetUserSettingsDirectory());
- // Create local database handler
- mLocalDatabase = new SQLiteTreeHandler(GetLocalDatabasePath());
- // Add it to the TreeHandlerMap
- mTreeHandlerMap["Local database"] = mLocalDatabase;
- // Create or open local database
- if (! boost::filesystem::exists( GetLocalDatabasePath() ) )
- {
- std::string mess = "Local database '";
- mess += GetLocalDatabasePath();
- mess += "' does not exist : creating it";
- GimmickMessage(1,mess<<std::endl);
-
- // CREATING DEFAULT DB STRUCTURE
- mLocalDatabase->GetTree().GetDescriptor().CreateDefault();
+ mSettings = new Settings(mCurrentDirectory);
- if ( ! mLocalDatabase->Create(true) )
- {
- GimmickError("ERROR CREATING '"<<GetLocalDatabasePath()<<"'");
- }
- mLocalDatabase->SetAttribute(0,"Name","Local database");
- }
- else
- {
- /// Open and test it
- GimmickMessage(1,"Opening local database '"
- <<GetLocalDatabasePath()<<"' "
- <<std::endl);
- if ( ! mLocalDatabase->Open(true) )
- {
- GimmickError("ERROR OPENING '"<<GetLocalDatabasePath()<<"'");
- }
-
- }
+ std::string dbpath = GetLocalDatabasePath();
+ // Create or open local database
+ mLocalDatabase = createDB(i_nameDB, mCurrentDirectory + "\\.gimmick\\localdatabase_Descriptor.txt", dbpath);
+ // Add it to the TreeHandlerMap
+ mTreeHandlerMap[i_nameDB] = mLocalDatabase;
+
+ //Add additional DB from user Settings
+ addDBSettings();
// Creates files and directories database
mTimestampDatabase = new TimestampDatabaseHandler(GetTimestampDatabasePath());
}
}
- //================================================================
+
+ ///////////////////////////////////////////////////////////////////////
+ // add DB to TreeHandler Map //
+ // @param i_name : DB name //
+ // @param i_location : DB location //
+ // return : - //
+ ///////////////////////////////////////////////////////////////////////
+ void Gimmick::addDB(const std::string &i_name,
+ const std::string &i_location)
+ {
+ if(mTreeHandlerMap.find(i_name) == mTreeHandlerMap.end())
+ {
+ mTreeHandlerMap[i_name] = new SQLiteTreeHandler(i_location);
+ mTreeHandlerMap[i_name]->Open(true);
+ mSettings->addDB(i_location);
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // create a DB from a attributes descriptor file for medical images //
+ // @param i_name : DB name //
+ // @param i_locDesc : location of descriptor file //
+ // @param i_locDB : location of DB //
+ // return : the SQLiteTreeHandler object on DB //
+ /////////////////////////////////////////////////////////////////////////
+ SQLiteTreeHandler *Gimmick::createDB(const std::string &i_name,
+ const std::string &i_locDesc,
+ const std::string &i_locDB)
+ {
+ SQLiteTreeHandler *sqlTreeH = new SQLiteTreeHandler(i_locDB);
+ // Create or open local database
+ if (! boost::filesystem::exists(i_locDB) )
+ {
+ std::string mess = "Local database '";
+ mess += i_locDB;
+ mess += "' does not exist : creating it";
+ GimmickMessage(1,mess<<std::endl);
+
+ // CREATING DB STRUCTURE
+ sqlTreeH->GetTree().GetDescriptor().createDescriptorfromFile(i_locDesc);
+ if ( ! sqlTreeH->Create(true) )
+ {
+ GimmickError("ERROR CREATING '"<<i_locDB<<"'");
+ }
+ sqlTreeH->SetAttribute(0,"Name",i_name);
+ }
+ else
+ {
+ /// Open and test it
+ GimmickMessage(1,"Opening local database '" <<i_locDB<< "' " << std::endl);
+ if ( !sqlTreeH->Open(true) )
+ {
+ GimmickError("ERROR OPENING '"<<i_locDB<<"'");
+ }
+ }
+ return sqlTreeH;
+ }
//==============================================================
void Gimmick::Finalize()
{
- delete mLocalDatabase;
+
+ // delete SQLiteTreeHandler Object
+ for( TreeHandlerMapType::const_iterator it = mTreeHandlerMap.begin();
+ it!= mTreeHandlerMap.end(); ++it)
+ {
+ delete it->second;
+ }
delete mTimestampDatabase;
}
//==============================================================
{
GimmickMessage(2,"Adding files to '"<<d<<"'"<<std::endl);
+ mImageAdder.SetCurrentDatabase(d);
mImageAdder.SetTreeHandler(GetTreeHandler(d));
mImageAdder.SetTimestampHandler(mTimestampDatabase);
+ mImageAdder.SetSynchronizer(mSynchronizer);
mImageAdder.AddFiles(filenames);
-
+
}
//========================================================================
<<recurse<<std::endl);
TreeHandler * handler=GetTreeHandler(d);
+ mImageAdder.SetCurrentDatabase(d);
mImageAdder.SetTreeHandler(handler);
mImageAdder.SetTimestampHandler(mTimestampDatabase);
- mImageAdder.AddDirectory(f,recurse);
- //Synchronize(true, handler);
-
+ mImageAdder.SetSynchronizer(mSynchronizer);
+ mImageAdder.AddDirectory(f,recurse);
}
//========================================================================
+ //========================================================================
+ void Gimmick::RemoveFile(const std::string& d,
+ tree::Node* node)
+ {
+ mImageAdder.SetCurrentDatabase(d);
+ mImageAdder.SetSynchronizer(mSynchronizer);
+ mTimestampDatabase->RemoveNode("PATH",node,d);
+ mImageAdder.RemoveFile(node);
+ }
+ //========================================================================
+
//========================================================================
- void Gimmick::Synchronize(bool update, TreeHandler* handler)
+ void Gimmick::CopyFiles(const std::vector<std::string>& filenames, const std::string& d )
{
- GimmickMessage(4,"Synchronizing. Update:"<<update<<std::endl);
- if(mSynchronizer==0)
- {
- mSynchronizer=new Synchronizer(handler);
- }
- else
- {
- mSynchronizer->SetTreeHandler(handler);
- }
- mSynchronizer->Synchronize(update);
+ TreeHandler * handler=GetTreeHandler(d);
+ mImageAdder.SetCurrentDatabase(d);
+ mImageAdder.SetTreeHandler(handler);
+ mImageAdder.SetTimestampHandler(mTimestampDatabase);
+ mImageAdder.SetSynchronizer(mSynchronizer);
+ mImageAdder.CopyFiles(filenames, mSettings->getValue(SETTINGS_COPY_PATH));
+ }
+ //========================================================================
+
+ std::string Gimmick::Synchronize(const std::string& d, bool repair, bool checkAttributes)
+ {
+ TreeHandler * handler=GetTreeHandler(d);
+ mImageAdder.SetCurrentDatabase(d);
+ mImageAdder.SetTreeHandler(handler);
+ mImageAdder.SetTimestampHandler(mTimestampDatabase);
+ mImageAdder.SetSynchronizer(mSynchronizer);
+ return mImageAdder.Synchronize(repair, checkAttributes);
}
//========================================================================
GetTreeHandler(d)->GetTree().Print();
}
//========================================================================
+ /////////////////////////////////////////////////////////////////////////
+ // add DB from Settings file //
+ // @param : - //
+ // return : - //
+ /////////////////////////////////////////////////////////////////////////
+ void Gimmick::addDBSettings()
+ {
+ std::string pathSettings = mSettings->getValue(SETTINGS_DBPATH);
+
+ // split to find all paths
+ std::vector<std::string> paths;
+ std::string separator = ";";
+ std::string::size_type last_pos = pathSettings.find_first_not_of(separator);
+ //find first separator
+ std::string::size_type pos = pathSettings.find_first_of(separator, last_pos);
+ while(std::string::npos != pos || std::string::npos != last_pos)
+ {
+ paths.push_back(pathSettings.substr(last_pos, pos - last_pos));
+ last_pos = pathSettings.find_first_not_of(separator, pos);
+ pos = pathSettings.find_first_of(separator, last_pos);
+ }
+
+ std::vector<std::string>::iterator it_path = paths.begin();
+ for(; it_path != paths.end(); ++it_path)
+ {
+ pos = it_path->find_last_of("\\");
+ last_pos = it_path->find_last_of(".");
+ std::string name = it_path->substr(pos +1, last_pos -pos-1 );
+ addDB(name, it_path->c_str());
+ }
+ }
+
}