##// END OF EJS Templates
Adds "number of operations" and "number of variables" properties for the tests
Adds "number of operations" and "number of variables" properties for the tests

File last commit:

r1164:b6390f556418
r1170:3da18e6983d5
Show More
CatalogueController.cpp
296 lines | 9.6 KiB | text/x-c | CppLexer
/ core / src / Catalogue / CatalogueController.cpp
correction of merge
r1059 #include <Catalogue/CatalogueController.h>
#include <Variable/Variable.h>
#include <CatalogueDao.h>
Add retrieve events impl
r1125 #include <ComparaisonPredicate.h>
#include <CompoundPredicate.h>
#include <DBCatalogue.h>
#include <DBEvent.h>
Add Catalogue methods
r1159 #include <DBEventProduct.h>
Add retrieve events impl
r1125 #include <DBTag.h>
#include <IRequestPredicate.h>
correction of merge
r1059 #include <QMutex>
#include <QThread>
#include <QDir>
#include <QStandardPaths>
Q_LOGGING_CATEGORY(LOG_CatalogueController, "CatalogueController")
Fix the loading of the default database
r1126 namespace {
Add retrieve events impl
r1125
Add Catalogue methods
r1159 static QString REPOSITORY_WORK_SUFFIX = QString{"work"};
static QString REPOSITORY_TRASH_SUFFIX = QString{"trash"};
Add retrieve events impl
r1125 }
correction of merge
r1059 class CatalogueController::CatalogueControllerPrivate {
Add Catalogue methods
r1159
correction of merge
r1059 public:
Add Catalogue methods
r1159 explicit CatalogueControllerPrivate(CatalogueController *parent) : m_Q{parent} {}
correction of merge
r1059 QMutex m_WorkingMutex;
CatalogueDao m_CatalogueDao;
Add retrieve events impl
r1125
Add Catalogue methods
r1159 QStringList m_RepositoryList;
CatalogueController *m_Q;
void copyDBtoDB(const QString &dbFrom, const QString &dbTo);
QString toWorkRepository(QString repository);
QString toSyncRepository(QString repository);
correction of merge
r1059 };
CatalogueController::CatalogueController(QObject *parent)
Add Catalogue methods
r1159 : impl{spimpl::make_unique_impl<CatalogueControllerPrivate>(this)}
correction of merge
r1059 {
qCDebug(LOG_CatalogueController()) << tr("CatalogueController construction")
<< QThread::currentThread();
}
CatalogueController::~CatalogueController()
{
qCDebug(LOG_CatalogueController()) << tr("CatalogueController destruction")
<< QThread::currentThread();
this->waitForFinish();
}
Add Catalogue methods
r1159 QStringList CatalogueController::getRepositories() const
{
return impl->m_RepositoryList;
}
Add retrieve events impl
r1125 void CatalogueController::addDB(const QString &dbPath)
{
QDir dbDir(dbPath);
if (dbDir.exists()) {
auto dirName = dbDir.dirName();
if (std::find(impl->m_RepositoryList.cbegin(), impl->m_RepositoryList.cend(), dirName)
!= impl->m_RepositoryList.cend()) {
qCCritical(LOG_CatalogueController())
<< tr("Impossible to addDB that is already loaded");
}
if (!impl->m_CatalogueDao.addDB(dbPath, dirName)) {
qCCritical(LOG_CatalogueController())
<< tr("Impossible to addDB %1 from %2 ").arg(dirName, dbPath);
}
Fix the loading of the default database
r1126 else {
Add Catalogue methods
r1159 impl->m_RepositoryList << dirName;
impl->copyDBtoDB(dirName, impl->toWorkRepository(dirName));
Add retrieve events impl
r1125 }
}
else {
qCCritical(LOG_CatalogueController()) << tr("Impossible to addDB that not exists: ")
<< dbPath;
}
}
void CatalogueController::saveDB(const QString &destinationPath, const QString &repository)
{
if (!impl->m_CatalogueDao.saveDB(destinationPath, repository)) {
qCCritical(LOG_CatalogueController())
<< tr("Impossible to saveDB %1 from %2 ").arg(repository, destinationPath);
}
}
std::list<std::shared_ptr<DBEvent> >
CatalogueController::retrieveEvents(const QString &repository) const
{
Add Catalogue methods
r1159 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
Add retrieve events impl
r1125 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
Add Catalogue methods
r1159 auto events = impl->m_CatalogueDao.getEvents(impl->toWorkRepository(dbDireName));
Add retrieve events impl
r1125 for (auto event : events) {
eventsShared.push_back(std::make_shared<DBEvent>(event));
}
return eventsShared;
}
std::list<std::shared_ptr<DBEvent> > CatalogueController::retrieveAllEvents() const
{
auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
for (auto repository : impl->m_RepositoryList) {
eventsShared.splice(eventsShared.end(), retrieveEvents(repository));
}
return eventsShared;
}
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 std::list<std::shared_ptr<DBEvent> >
Adaptation to the shared pointers of catalogue controller
r1143 CatalogueController::retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 {
auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
auto events = impl->m_CatalogueDao.getCatalogueEvents(*catalogue);
for (auto event : events) {
eventsShared.push_back(std::make_shared<DBEvent>(event));
}
return eventsShared;
}
Add Catalogue methods
r1159 void CatalogueController::updateEvent(std::shared_ptr<DBEvent> event)
{
event->setRepository(impl->toSyncRepository(event->getRepository()));
impl->m_CatalogueDao.updateEvent(*event);
}
void CatalogueController::removeEvent(std::shared_ptr<DBEvent> event)
{
// Remove it from both repository and repository_work
event->setRepository(impl->toWorkRepository(event->getRepository()));
impl->m_CatalogueDao.removeEvent(*event);
event->setRepository(impl->toSyncRepository(event->getRepository()));
impl->m_CatalogueDao.removeEvent(*event);
}
void CatalogueController::addEvent(std::shared_ptr<DBEvent> event)
{
Adaptation to last version of catalogue controller
r1164 event->setRepository(impl->toWorkRepository(event->getRepository()));
Add Catalogue methods
r1159
impl->m_CatalogueDao.addEvent(*event);
// Call update is necessary at the creation of add Event if it has some tags or some event
// products
if (!event->getEventProducts().empty() || !event->getTags().empty()) {
impl->m_CatalogueDao.updateEvent(*event);
}
}
void CatalogueController::saveEvent(std::shared_ptr<DBEvent> event)
{
impl->m_CatalogueDao.moveEvent(*event, impl->toSyncRepository(event->getRepository()), true);
}
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 std::list<std::shared_ptr<DBCatalogue> >
Add Catalogue methods
r1159 CatalogueController::retrieveCatalogues(const QString &repository) const
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 {
Add Catalogue methods
r1159 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
Add Catalogue methods
r1159 auto catalogues = impl->m_CatalogueDao.getCatalogues(impl->toWorkRepository(dbDireName));
CatalogueController: add few basic methods + commit the one not yet implemented
r1128 for (auto catalogue : catalogues) {
cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
}
return cataloguesShared;
}
Add Catalogue methods
r1159 void CatalogueController::updateCatalogue(std::shared_ptr<DBCatalogue> catalogue)
{
catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
impl->m_CatalogueDao.updateCatalogue(*catalogue);
}
void CatalogueController::removeCatalogue(std::shared_ptr<DBCatalogue> catalogue)
{
// Remove it from both repository and repository_work
catalogue->setRepository(impl->toWorkRepository(catalogue->getRepository()));
impl->m_CatalogueDao.removeCatalogue(*catalogue);
catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
impl->m_CatalogueDao.removeCatalogue(*catalogue);
}
void CatalogueController::saveCatalogue(std::shared_ptr<DBCatalogue> catalogue)
{
impl->m_CatalogueDao.moveCatalogue(*catalogue,
impl->toSyncRepository(catalogue->getRepository()), true);
}
void CatalogueController::saveAll()
{
for (auto repository : impl->m_RepositoryList) {
// Save Event
auto events = this->retrieveEvents(repository);
for (auto event : events) {
this->saveEvent(event);
}
// Save Catalogue
auto catalogues = this->retrieveCatalogues(repository);
for (auto catalogue : catalogues) {
this->saveCatalogue(catalogue);
}
}
}
correction of merge
r1059 void CatalogueController::initialize()
{
qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
<< QThread::currentThread();
impl->m_WorkingMutex.lock();
impl->m_CatalogueDao.initialize();
Fix the loading of the default database
r1126 auto defaultRepositoryLocation
= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QDir defaultRepositoryLocationDir;
if (defaultRepositoryLocationDir.mkpath(defaultRepositoryLocation)) {
defaultRepositoryLocationDir.cd(defaultRepositoryLocation);
auto defaultRepository = defaultRepositoryLocationDir.absoluteFilePath(REPOSITORY_DEFAULT);
Add Catalogue methods
r1159 qCInfo(LOG_CatalogueController()) << tr("Persistant data loading from: ")
<< defaultRepository;
Add retrieve events impl
r1125 this->addDB(defaultRepository);
}
Fix the loading of the default database
r1126 else {
qCWarning(LOG_CatalogueController())
<< tr("Cannot load the persistent default repository from ")
<< defaultRepositoryLocation;
}
qCDebug(LOG_CatalogueController()) << tr("CatalogueController init END");
correction of merge
r1059 }
void CatalogueController::finalize()
{
impl->m_WorkingMutex.unlock();
}
void CatalogueController::waitForFinish()
{
QMutexLocker locker{&impl->m_WorkingMutex};
}
Add Catalogue methods
r1159
void CatalogueController::CatalogueControllerPrivate::copyDBtoDB(const QString &dbFrom,
const QString &dbTo)
{
Adaptation to last version of catalogue controller
r1164 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
auto catalogues = m_CatalogueDao.getCatalogues(dbFrom);
Add Catalogue methods
r1159 for (auto catalogue : catalogues) {
Adaptation to last version of catalogue controller
r1164 cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
Add Catalogue methods
r1159 }
Adaptation to last version of catalogue controller
r1164 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
auto events = m_CatalogueDao.getEvents(dbFrom);
Add Catalogue methods
r1159 for (auto event : events) {
Adaptation to last version of catalogue controller
r1164 eventsShared.push_back(std::make_shared<DBEvent>(event));
}
for (auto catalogue : cataloguesShared) {
m_CatalogueDao.copyCatalogue(*catalogue, dbTo, true);
}
for (auto event : eventsShared) {
Add Catalogue methods
r1159 m_CatalogueDao.copyEvent(*event, dbTo, true);
}
}
QString CatalogueController::CatalogueControllerPrivate::toWorkRepository(QString repository)
{
auto syncRepository = toSyncRepository(repository);
return QString("%1_%2").arg(syncRepository, REPOSITORY_WORK_SUFFIX);
}
QString CatalogueController::CatalogueControllerPrivate::toSyncRepository(QString repository)
{
auto syncRepository = repository;
if (repository.endsWith(REPOSITORY_WORK_SUFFIX)) {
syncRepository.remove(REPOSITORY_WORK_SUFFIX);
}
else if (repository.endsWith(REPOSITORY_TRASH_SUFFIX)) {
syncRepository.remove(REPOSITORY_TRASH_SUFFIX);
}
return syncRepository;
}