##// END OF EJS Templates
Fixes the refresh of data that was not working all the time
Fixes the refresh of data that was not working all the time

File last commit:

r1315:7185ea8182da merge
r1324:c436df4b66de
Show More
CatalogueController.cpp
462 lines | 15.5 KiB | text/x-c | CppLexer
/ core / src / Catalogue / CatalogueController.cpp
correction of merge
r1097 #include <Catalogue/CatalogueController.h>
#include <Variable/Variable.h>
#include <CatalogueDao.h>
Add retrieve events impl
r1158 #include <ComparaisonPredicate.h>
#include <CompoundPredicate.h>
#include <DBCatalogue.h>
#include <DBEvent.h>
Add Catalogue methods
r1191 #include <DBEventProduct.h>
Add retrieve events impl
r1158 #include <DBTag.h>
#include <IRequestPredicate.h>
Drop of events on a catalogue
r1285 #include <QDataStream>
correction of merge
r1097 #include <QMutex>
#include <QThread>
#include <QDir>
#include <QStandardPaths>
Q_LOGGING_CATEGORY(LOG_CatalogueController, "CatalogueController")
Fix the loading of the default database
r1159 namespace {
Add retrieve events impl
r1158
Addd save methods. Fix bug with work repository suffix handling
r1279 static QString REPOSITORY_WORK_SUFFIX = QString{"_work"};
static QString REPOSITORY_TRASH_SUFFIX = QString{"_trash"};
Add retrieve events impl
r1158 }
correction of merge
r1097 class CatalogueController::CatalogueControllerPrivate {
Add Catalogue methods
r1191
correction of merge
r1097 public:
Add Catalogue methods
r1191 explicit CatalogueControllerPrivate(CatalogueController *parent) : m_Q{parent} {}
correction of merge
r1097 CatalogueDao m_CatalogueDao;
Add retrieve events impl
r1158
Add Catalogue methods
r1191 QStringList m_RepositoryList;
CatalogueController *m_Q;
store events with changes in the catalogue controller
r1292 QSet<QString> m_EventKeysWithChanges;
QString eventUniqueKey(const std::shared_ptr<DBEvent> &event) const;
Add Catalogue methods
r1191 void copyDBtoDB(const QString &dbFrom, const QString &dbTo);
QString toWorkRepository(QString repository);
QString toSyncRepository(QString repository);
Addd save methods. Fix bug with work repository suffix handling
r1279 void savAllDB();
void saveEvent(std::shared_ptr<DBEvent> event, bool persist = true);
void saveCatalogue(std::shared_ptr<DBCatalogue> catalogue, bool persist = true);
correction of merge
r1097 };
CatalogueController::CatalogueController(QObject *parent)
Add Catalogue methods
r1191 : impl{spimpl::make_unique_impl<CatalogueControllerPrivate>(this)}
correction of merge
r1097 {
qCDebug(LOG_CatalogueController()) << tr("CatalogueController construction")
<< QThread::currentThread();
}
CatalogueController::~CatalogueController()
{
qCDebug(LOG_CatalogueController()) << tr("CatalogueController destruction")
<< QThread::currentThread();
}
Add Catalogue methods
r1191 QStringList CatalogueController::getRepositories() const
{
return impl->m_RepositoryList;
}
Add retrieve events impl
r1158 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
r1159 else {
Add Catalogue methods
r1191 impl->m_RepositoryList << dirName;
impl->copyDBtoDB(dirName, impl->toWorkRepository(dirName));
Add retrieve events impl
r1158 }
}
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
r1191 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
Add retrieve events impl
r1158 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
Add Catalogue methods
r1191 auto events = impl->m_CatalogueDao.getEvents(impl->toWorkRepository(dbDireName));
Add retrieve events impl
r1158 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
r1161 std::list<std::shared_ptr<DBEvent> >
Adaptation to the shared pointers of catalogue controller
r1176 CatalogueController::retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const
CatalogueController: add few basic methods + commit the one not yet implemented
r1161 {
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
r1191 void CatalogueController::updateEvent(std::shared_ptr<DBEvent> event)
{
Addd save methods. Fix bug with work repository suffix handling
r1279 event->setRepository(impl->toWorkRepository(event->getRepository()));
Add Catalogue methods
r1191
store events with changes in the catalogue controller
r1292 auto uniqueId = impl->eventUniqueKey(event);
impl->m_EventKeysWithChanges.insert(uniqueId);
Add Catalogue methods
r1191 impl->m_CatalogueDao.updateEvent(*event);
}
Add missing methods
r1282 void CatalogueController::updateEventProduct(std::shared_ptr<DBEventProduct> eventProduct)
{
impl->m_CatalogueDao.updateEventProduct(*eventProduct);
}
Add Catalogue methods
r1191 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);
connect remove event button
r1296 impl->savAllDB();
Add Catalogue methods
r1191 }
void CatalogueController::addEvent(std::shared_ptr<DBEvent> event)
{
Adaptation to last version of catalogue controller
r1196 event->setRepository(impl->toWorkRepository(event->getRepository()));
Add Catalogue methods
r1191
Update addEvent method to handle correctly DBEventProduct creation
r1278 auto eventTemp = *event;
impl->m_CatalogueDao.addEvent(eventTemp);
Add Catalogue methods
r1191
// 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()) {
Update addEvent method to handle correctly DBEventProduct creation
r1278
auto eventProductsTemp = eventTemp.getEventProducts();
auto eventProductTempUpdated = std::list<DBEventProduct>{};
for (auto eventProductTemp : eventProductsTemp) {
eventProductTemp.setEvent(eventTemp);
eventProductTempUpdated.push_back(eventProductTemp);
}
eventTemp.setEventProducts(eventProductTempUpdated);
impl->m_CatalogueDao.updateEvent(eventTemp);
Add Catalogue methods
r1191 }
Discard an added event remove it now.
r1314
// update event parameter
auto uniqIdPredicate = std::make_shared<ComparaisonPredicate>(
QString{"uniqId"}, event->getUniqId(), ComparaisonOperation::EQUALEQUAL);
auto workRepositoryPredicate = std::make_shared<ComparaisonPredicate>(
QString{"repository"}, impl->toWorkRepository(event->getRepository()),
ComparaisonOperation::EQUALEQUAL);
auto workPred = std::make_shared<CompoundPredicate>(CompoundOperation::AND);
workPred->AddRequestPredicate(uniqIdPredicate);
workPred->AddRequestPredicate(workRepositoryPredicate);
auto workEvent = impl->m_CatalogueDao.getEvent(workPred);
*event = workEvent;
Merge branch 'develop' of...
r1315
register an added event as "modified" in the catalogue controller
r1313 auto uniqueId = impl->eventUniqueKey(event);
impl->m_EventKeysWithChanges.insert(uniqueId);
Add Catalogue methods
r1191 }
void CatalogueController::saveEvent(std::shared_ptr<DBEvent> event)
{
Addd save methods. Fix bug with work repository suffix handling
r1279 impl->saveEvent(event, true);
store events with changes in the catalogue controller
r1292 impl->m_EventKeysWithChanges.remove(impl->eventUniqueKey(event));
}
Discard an added event remove it now.
r1314 void CatalogueController::discardEvent(std::shared_ptr<DBEvent> event, bool &removed)
Add discard method for event
r1298 {
auto uniqIdPredicate = std::make_shared<ComparaisonPredicate>(
QString{"uniqId"}, event->getUniqId(), ComparaisonOperation::EQUALEQUAL);
Fix bug in discard method to handle repository
r1299 auto syncRepositoryPredicate = std::make_shared<ComparaisonPredicate>(
Add discard method for event
r1298 QString{"repository"}, impl->toSyncRepository(event->getRepository()),
ComparaisonOperation::EQUALEQUAL);
Fix bug in discard method to handle repository
r1299 auto syncPred = std::make_shared<CompoundPredicate>(CompoundOperation::AND);
syncPred->AddRequestPredicate(uniqIdPredicate);
syncPred->AddRequestPredicate(syncRepositoryPredicate);
Add discard method for event
r1298
Fix bug in discard method to handle repository
r1299 auto workRepositoryPredicate = std::make_shared<ComparaisonPredicate>(
QString{"repository"}, impl->toWorkRepository(event->getRepository()),
ComparaisonOperation::EQUALEQUAL);
auto workPred = std::make_shared<CompoundPredicate>(CompoundOperation::AND);
workPred->AddRequestPredicate(uniqIdPredicate);
workPred->AddRequestPredicate(workRepositoryPredicate);
auto syncEvent = impl->m_CatalogueDao.getEvent(syncPred);
Discard an added event remove it now.
r1314 if (!syncEvent.getUniqId().isNull()) {
removed = false;
impl->m_CatalogueDao.copyEvent(syncEvent, impl->toWorkRepository(event->getRepository()),
true);
auto workEvent = impl->m_CatalogueDao.getEvent(workPred);
*event = workEvent;
impl->m_EventKeysWithChanges.remove(impl->eventUniqueKey(event));
}
else {
removed = true;
// Since the element wasn't in sync repository. Discard it means remove it
event->setRepository(impl->toWorkRepository(event->getRepository()));
impl->m_CatalogueDao.removeEvent(*event);
}
Add discard method for event
r1298 }
store events with changes in the catalogue controller
r1292 bool CatalogueController::eventHasChanges(std::shared_ptr<DBEvent> event) const
{
return impl->m_EventKeysWithChanges.contains(impl->eventUniqueKey(event));
Add Catalogue methods
r1191 }
CatalogueController: add few basic methods + commit the one not yet implemented
r1161 std::list<std::shared_ptr<DBCatalogue> >
Add Catalogue methods
r1191 CatalogueController::retrieveCatalogues(const QString &repository) const
CatalogueController: add few basic methods + commit the one not yet implemented
r1161 {
Add Catalogue methods
r1191 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
CatalogueController: add few basic methods + commit the one not yet implemented
r1161 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
Add Catalogue methods
r1191 auto catalogues = impl->m_CatalogueDao.getCatalogues(impl->toWorkRepository(dbDireName));
CatalogueController: add few basic methods + commit the one not yet implemented
r1161 for (auto catalogue : catalogues) {
cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
}
return cataloguesShared;
}
Add Catalogue methods
r1191 void CatalogueController::updateCatalogue(std::shared_ptr<DBCatalogue> catalogue)
{
Addd save methods. Fix bug with work repository suffix handling
r1279 catalogue->setRepository(impl->toWorkRepository(catalogue->getRepository()));
Add Catalogue methods
r1191
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)
{
Addd save methods. Fix bug with work repository suffix handling
r1279 impl->saveCatalogue(catalogue, true);
Add Catalogue methods
r1191 }
void CatalogueController::saveAll()
{
for (auto repository : impl->m_RepositoryList) {
// Save Event
auto events = this->retrieveEvents(repository);
for (auto event : events) {
Addd save methods. Fix bug with work repository suffix handling
r1279 impl->saveEvent(event, false);
Add Catalogue methods
r1191 }
// Save Catalogue
auto catalogues = this->retrieveCatalogues(repository);
for (auto catalogue : catalogues) {
Addd save methods. Fix bug with work repository suffix handling
r1279 impl->saveCatalogue(catalogue, false);
Add Catalogue methods
r1191 }
}
Addd save methods. Fix bug with work repository suffix handling
r1279
impl->savAllDB();
store events with changes in the catalogue controller
r1292 impl->m_EventKeysWithChanges.clear();
Add Catalogue methods
r1191 }
Check unsaved data on close
r1294 bool CatalogueController::hasChanges() const
{
return !impl->m_EventKeysWithChanges.isEmpty(); // TODO: catalogues
}
Drop of events on a catalogue
r1285 QByteArray
CatalogueController::mimeDataForEvents(const QVector<std::shared_ptr<DBEvent> > &events) const
{
auto encodedData = QByteArray{};
QMap<QString, QVariantList> idsPerRepository;
for (auto event : events) {
idsPerRepository[event->getRepository()] << event->getUniqId();
}
QDataStream stream{&encodedData, QIODevice::WriteOnly};
stream << idsPerRepository;
return encodedData;
}
QVector<std::shared_ptr<DBEvent> >
CatalogueController::eventsForMimeData(const QByteArray &mimeData) const
{
auto events = QVector<std::shared_ptr<DBEvent> >{};
QDataStream stream{mimeData};
QMap<QString, QVariantList> idsPerRepository;
stream >> idsPerRepository;
for (auto it = idsPerRepository.cbegin(); it != idsPerRepository.cend(); ++it) {
auto repository = it.key();
auto allRepositoryEvent = retrieveEvents(repository);
for (auto uuid : it.value()) {
for (auto repositoryEvent : allRepositoryEvent) {
if (uuid.toUuid() == repositoryEvent->getUniqId()) {
events << repositoryEvent;
}
}
}
}
return events;
}
correction of merge
r1097 void CatalogueController::initialize()
{
Add discard method for event
r1298 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
<< QThread::currentThread();
Fix merge problem
r1297
correction of merge
r1097 impl->m_CatalogueDao.initialize();
Fix the loading of the default database
r1159 auto defaultRepositoryLocation
= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QDir defaultRepositoryLocationDir;
if (defaultRepositoryLocationDir.mkpath(defaultRepositoryLocation)) {
defaultRepositoryLocationDir.cd(defaultRepositoryLocation);
auto defaultRepository = defaultRepositoryLocationDir.absoluteFilePath(REPOSITORY_DEFAULT);
Add fix for default repository init
r1310
Add Catalogue methods
r1191 qCInfo(LOG_CatalogueController()) << tr("Persistant data loading from: ")
<< defaultRepository;
Add fix for default repository init
r1310
QDir dbDir(defaultRepository);
impl->m_RepositoryList << REPOSITORY_DEFAULT;
if (dbDir.exists()) {
auto dirName = dbDir.dirName();
if (impl->m_CatalogueDao.addDB(defaultRepository, dirName)) {
impl->copyDBtoDB(dirName, impl->toWorkRepository(dirName));
}
}
else {
qCInfo(LOG_CatalogueController()) << tr("Initialisation of Default repository detected")
<< defaultRepository;
}
Add retrieve events impl
r1158 }
Fix the loading of the default database
r1159 else {
qCWarning(LOG_CatalogueController())
<< tr("Cannot load the persistent default repository from ")
<< defaultRepositoryLocation;
}
qCDebug(LOG_CatalogueController()) << tr("CatalogueController init END");
correction of merge
r1097 }
store events with changes in the catalogue controller
r1292 QString CatalogueController::CatalogueControllerPrivate::eventUniqueKey(
const std::shared_ptr<DBEvent> &event) const
{
return event->getUniqId().toString().append(event->getRepository());
}
Add Catalogue methods
r1191 void CatalogueController::CatalogueControllerPrivate::copyDBtoDB(const QString &dbFrom,
const QString &dbTo)
{
Add saveEvent action
r1280 // auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
Adaptation to last version of catalogue controller
r1196 auto catalogues = m_CatalogueDao.getCatalogues(dbFrom);
Add saveEvent action
r1280 auto events = m_CatalogueDao.getEvents(dbFrom);
Add Catalogue methods
r1191 for (auto catalogue : catalogues) {
Add saveEvent action
r1280 m_CatalogueDao.copyCatalogue(catalogue, dbTo, true);
Add Catalogue methods
r1191 }
for (auto event : events) {
Add saveEvent action
r1280 m_CatalogueDao.copyEvent(event, dbTo, true);
Add Catalogue methods
r1191 }
}
QString CatalogueController::CatalogueControllerPrivate::toWorkRepository(QString repository)
{
auto syncRepository = toSyncRepository(repository);
Addd save methods. Fix bug with work repository suffix handling
r1279 return QString("%1%2").arg(syncRepository, REPOSITORY_WORK_SUFFIX);
Add Catalogue methods
r1191 }
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;
}
Addd save methods. Fix bug with work repository suffix handling
r1279
void CatalogueController::CatalogueControllerPrivate::savAllDB()
{
for (auto repository : m_RepositoryList) {
auto defaultRepositoryLocation
= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
m_CatalogueDao.saveDB(defaultRepositoryLocation, repository);
}
}
void CatalogueController::CatalogueControllerPrivate::saveEvent(std::shared_ptr<DBEvent> event,
bool persist)
{
Add saveEvent action
r1280 m_CatalogueDao.copyEvent(*event, toSyncRepository(event->getRepository()), true);
Addd save methods. Fix bug with work repository suffix handling
r1279 if (persist) {
savAllDB();
}
}
void CatalogueController::CatalogueControllerPrivate::saveCatalogue(
std::shared_ptr<DBCatalogue> catalogue, bool persist)
{
Add saveEvent action
r1280 m_CatalogueDao.copyCatalogue(*catalogue, toSyncRepository(catalogue->getRepository()), true);
Addd save methods. Fix bug with work repository suffix handling
r1279 if (persist) {
savAllDB();
}
}