diff --git a/domain-server/src/BackupSupervisor.cpp b/domain-server/src/BackupSupervisor.cpp index e0f0378fd4..4cb42787ba 100644 --- a/domain-server/src/BackupSupervisor.cpp +++ b/domain-server/src/BackupSupervisor.cpp @@ -104,7 +104,7 @@ void BackupSupervisor::checkForAssetsToDelete() { } void BackupSupervisor::loadBackup(QuaZip& zip) { - _backups.push_back({ zip.getZipName().toStdString(), {}, false }); + _backups.push_back({ zip.getZipName(), {}, false }); auto& backup = _backups.back(); if (!zip.setCurrentFile(MAPPINGS_FILE)) { @@ -171,7 +171,7 @@ void BackupSupervisor::createBackup(QuaZip& zip) { } AssetServerBackup backup; - backup.filePath = zip.getZipName().toStdString(); + backup.filePath = zip.getZipName(); QJsonObject jsonObject; for (const auto& mapping : _currentMappings) { @@ -214,7 +214,7 @@ void BackupSupervisor::recoverBackup(QuaZip& zip) { startOperation(); auto it = find_if(begin(_backups), end(_backups), [&](const std::vector::value_type& value) { - return value.filePath == zip.getZipName().toStdString(); + return value.filePath == zip.getZipName(); }); if (it == end(_backups)) { qCDebug(backup_supervisor) << "Could not find backup"; @@ -235,7 +235,7 @@ void BackupSupervisor::deleteBackup(QuaZip& zip) { } auto it = find_if(begin(_backups), end(_backups), [&](const std::vector::value_type& value) { - return value.filePath == zip.getZipName().toStdString(); + return value.filePath == zip.getZipName(); }); if (it == end(_backups)) { qCDebug(backup_supervisor) << "Could not find backup"; @@ -247,6 +247,44 @@ void BackupSupervisor::deleteBackup(QuaZip& zip) { } void BackupSupervisor::consolidateBackup(QuaZip& zip) { + if (operationInProgress()) { + qCWarning(backup_supervisor) << "There is a backup/restore in progress."; + return; + } + QFileInfo zipInfo(zip.getZipName()); + + auto it = find_if(begin(_backups), end(_backups), [&](const std::vector::value_type& value) { + QFileInfo info(value.filePath); + return info.fileName() == zipInfo.fileName(); + }); + if (it == end(_backups)) { + qCDebug(backup_supervisor) << "Could not find backup" << zip.getZipName(); + return; + } + + for (const auto& mapping : it->mappings) { + const auto& hash = mapping.second; + + QDir assetsDir { _assetsDirectory }; + QFile file { assetsDir.filePath(hash) }; + if (!file.open(QFile::ReadOnly)) { + qCCritical(backup_supervisor) << "Could not open asset file" << file.fileName(); + continue; + } + + QuaZipFile zipFile { &zip }; + static const QString ZIP_ASSETS_FOLDER = "files/"; + if (!zipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(ZIP_ASSETS_FOLDER + hash))) { + qCDebug(backup_supervisor) << "testCreate(): outFile.open()"; + continue; + } + zipFile.write(file.readAll()); + zipFile.close(); + if (zipFile.getZipError() != UNZ_OK) { + qCDebug(backup_supervisor) << "testCreate(): outFile.close(): " << zipFile.getZipError(); + continue; + } + } } diff --git a/domain-server/src/BackupSupervisor.h b/domain-server/src/BackupSupervisor.h index a89be66742..d0f6e52ac6 100644 --- a/domain-server/src/BackupSupervisor.h +++ b/domain-server/src/BackupSupervisor.h @@ -28,7 +28,7 @@ class QuaZip; struct AssetServerBackup { - std::string filePath; + QString filePath; AssetUtils::Mappings mappings; bool corruptedBackup; }; diff --git a/domain-server/src/DomainContentBackupManager.cpp b/domain-server/src/DomainContentBackupManager.cpp index 7c1c7f2cd7..3f9b3f20d8 100644 --- a/domain-server/src/DomainContentBackupManager.cpp +++ b/domain-server/src/DomainContentBackupManager.cpp @@ -308,3 +308,31 @@ void DomainContentBackupManager::backup() { } } } + +void DomainContentBackupManager::consolidate(QString fileName) { + QDir backupDir { _backupDirectory }; + if (backupDir.exists()) { + auto filePath = backupDir.absoluteFilePath(fileName); + + auto copyFilePath = QDir::tempPath() + "/" + fileName; + + auto copySuccess = QFile::copy(filePath, copyFilePath); + if (!copySuccess) { + qCritical() << "Failed to create full backup."; + return; + } + + QuaZip zip(copyFilePath); + if (!zip.open(QuaZip::mdAdd)) { + qCritical() << "Could not open backup archive:" << filePath; + qCritical() << " ERROR:" << zip.getZipError(); + return; + } + + for (auto& handler : _backupHandlers) { + handler.consolidateBackup(zip); + } + + zip.close(); + } +} diff --git a/domain-server/src/DomainContentBackupManager.h b/domain-server/src/DomainContentBackupManager.h index bb1d4f0116..69163b4ead 100644 --- a/domain-server/src/DomainContentBackupManager.h +++ b/domain-server/src/DomainContentBackupManager.h @@ -54,6 +54,7 @@ protected: void persist(); void load(); void backup(); + void consolidate(QString fileName); void removeOldBackupVersions(const BackupRule& rule); bool getMostRecentBackup(const QString& format, QString& mostRecentBackupFileName, QDateTime& mostRecentBackupTime); int64_t getMostRecentBackupTimeInSecs(const QString& format);