Index: src/libchcore/TTaskManagerSerializer.cpp =================================================================== diff -u -N -rb1ecc12ba4c1f2a7b4acd6e82fc4193535e55ff0 -r1342b18babc7e88850e74f46cb473a737a68f28a --- src/libchcore/TTaskManagerSerializer.cpp (.../TTaskManagerSerializer.cpp) (revision b1ecc12ba4c1f2a7b4acd6e82fc4193535e55ff0) +++ src/libchcore/TTaskManagerSerializer.cpp (.../TTaskManagerSerializer.cpp) (revision 1342b18babc7e88850e74f46cb473a737a68f28a) @@ -26,6 +26,10 @@ #include "TTaskSerializer.h" #include "TTaskInfo.h" #include +#include +#include +#include +#include BEGIN_CHCORE_NAMESPACE @@ -44,12 +48,14 @@ void TTaskManagerSerializer::Setup() { + if(m_bSetupExecuted) + return; + TSQLiteDatabasePtr spDatabase = GetDatabase(); TSQLiteTransaction tTransaction(spDatabase); // check version of the database TSerializerVersion tVersion(spDatabase); - tVersion.Setup(); // if version is 0, then this is the fresh database with (almost) no tables inside if(tVersion.GetVersion() == 0) @@ -69,8 +75,7 @@ void TTaskManagerSerializer::Store(const TTaskInfoContainer& tTasksInfo) { - if(!m_bSetupExecuted) - Setup(); + Setup(); TSQLiteDatabasePtr spDatabase(GetDatabase()); TSQLiteTransaction tTransaction(spDatabase); @@ -98,11 +103,16 @@ for(size_t stIndex = 0; stIndex < tTasksInfo.GetCount(); ++stIndex) { const TTaskInfoEntry& rEntry = tTasksInfo.GetAt(stIndex); + + // store as relative path if possible + TSmartPath pathRelative(rEntry.GetTaskSerializeLocation()); + pathRelative.MakeRelativePath(m_pathTasksDir); + if(rEntry.IsAdded()) { tStatement.BindValue(1, rEntry.GetTaskID()); tStatement.BindValue(2, rEntry.GetOrder()); - tStatement.BindValue(3, rEntry.GetTaskPath().ToString()); + tStatement.BindValue(3, pathRelative.ToString()); tStatement.Step(); } } @@ -119,9 +129,12 @@ const TTaskInfoEntry& rEntry = tTasksInfo.GetAt(stIndex); if(rEntry.IsModified()) { + TSmartPath pathRelative(rEntry.GetTaskSerializeLocation()); + pathRelative.MakeRelativePath(m_pathTasksDir); + tStatement.BindValue(1, rEntry.GetTaskID()); tStatement.BindValue(2, rEntry.GetOrder()); - tStatement.BindValue(3, rEntry.GetTaskPath().ToString()); + tStatement.BindValue(3, pathRelative.ToString()); tStatement.Step(); } } @@ -132,8 +145,7 @@ void TTaskManagerSerializer::Load(TTaskInfoContainer& tTasksInfo) { - if(!m_bSetupExecuted) - Setup(); + Setup(); tTasksInfo.Clear(); @@ -147,9 +159,10 @@ { taskid_t tTaskID = boost::numeric_cast(tStatement.GetUInt64(0)); int iOrder = tStatement.GetInt(1); - TString strPath = tStatement.GetText(2); + TSmartPath pathTask = PathFromWString(tStatement.GetText(2)); + pathTask.MakeAbsolutePath(m_pathTasksDir); - tTasksInfo.Add(tTaskID, PathFromWString(strPath), iOrder, TTaskPtr()); + tTasksInfo.Add(tTaskID, pathTask, iOrder, TTaskPtr()); } } @@ -161,10 +174,39 @@ return m_spDatabase; } -chcore::ITaskSerializerPtr TTaskManagerSerializer::CreateTaskSerializer(const TSmartPath& pathSerialize) +chcore::ITaskSerializerPtr TTaskManagerSerializer::CreateExistingTaskSerializer(const TSmartPath& pathSerialize) { - TTaskSerializerPtr spTaskSerializer(new TTaskSerializer(pathSerialize)); + TSmartPath pathReal = pathSerialize; + if(pathSerialize.IsEmpty()) + pathReal = m_pathTasksDir + PathFromString(TString(_T("Task-") + GetUuid() + _T(".sqlite"))); + + TTaskSerializerPtr spTaskSerializer(new TTaskSerializer(pathReal)); return spTaskSerializer; } +chcore::ITaskSerializerPtr TTaskManagerSerializer::CreateNewTaskSerializer(const TString& strTaskUuid) +{ + TString strRealTaskUuid = strTaskUuid; + if(strRealTaskUuid.IsEmpty()) + strRealTaskUuid = GetUuid(); + + TSmartPath pathReal = m_pathTasksDir + PathFromString(TString(_T("Task-") + strRealTaskUuid + _T(".sqlite"))); + + TTaskSerializerPtr spTaskSerializer(new TTaskSerializer(pathReal)); + return spTaskSerializer; +} + +TString TTaskManagerSerializer::GetUuid() +{ + boost::uuids::random_generator gen; + boost::uuids::uuid u = gen(); + return boost::lexical_cast(u).c_str(); +} + +void TTaskManagerSerializer::RemoveTaskSerializer(const ITaskSerializerPtr& spTaskSerializer) +{ + TSmartPath pathTask = spTaskSerializer->GetLocation(); + DeleteFile(pathTask.ToString()); +} + END_CHCORE_NAMESPACE