##// END OF EJS Templates
Check unsaved data on close
Check unsaved data on close

File last commit:

r1294:af6db233f5d0
r1294:af6db233f5d0
Show More
CatalogueController.cpp
393 lines | 12.7 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);
}
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 }
}
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));
}
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()
{
unthread the catalogue controller
r1291 <<<<<<< HEAD
correction of merge
r1097 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
<< QThread::currentThread();
impl->m_WorkingMutex.lock();
unthread the catalogue controller
r1291 =======
qCDebug(LOG_CatalogueController())
<< tr("CatalogueController init") << QThread::currentThread();
>>>>>>> 286decc... unthread the catalogue controller
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 Catalogue methods
r1191 qCInfo(LOG_CatalogueController()) << tr("Persistant data loading from: ")
<< defaultRepository;
Add retrieve events impl
r1158 this->addDB(defaultRepository);
}
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();
}
}