You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmData/nmNumericalSaveSession.h

112 lines
4.2 KiB
C++

#ifndef NMNUMERICALSAVESESSION_H
#define NMNUMERICALSAVESESSION_H
#include "nmData_global.h"
#include "nmNumericalResultPersistence.h"
#include <QMap>
#include <QSet>
#include <QString>
class nmDataAnalyzeManager;
/** @brief 根清单中的一个数值分析窗口条目。 */
struct NM_DATA_EXPORT nmNumericalSavedWindow
{
/** @brief 成果业务标识。 */
QString m_sResultId;
/** @brief 数值分析窗口的稳定标识。 */
QString m_sWindowId;
/** @brief 相对于成果根目录的窗口主 JSON 引用。 */
nmNumericalFileReference m_oMainJson;
};
/**
* @brief 跨窗口 v3 保存会话,负责新代次、根清单发布和失败中止。
*
* 一个实例一次只能处理一个代次。析构时若尚未成功提交,会自动中止,
* 防止下一轮保存复用未完成状态。
*/
class NM_DATA_EXPORT nmNumericalSaveSession
{
public:
/** @brief 创建尚未开始的保存会话。 */
nmNumericalSaveSession();
/** @brief 未提交的会话在析构时自动删除本代次临时目录。 */
~nmNumericalSaveSession();
/**
* @brief 开始一个全窗口保存代次。
* @param bPreserveExistingWindows 单窗口兼容保存时保留旧清单其他窗口。
*/
bool begin(const QString& sResultRootDirectory,
const QString& sResultId,
bool bPreserveExistingWindows = false,
QString* pError = NULL);
/** @brief 将一个 Manager 的完整 v3 载荷写入当前代次。 */
bool saveWindowGeneration(const QString& sWindowId,
nmDataAnalyzeManager* pDataManager,
QString* pError = NULL);
/** @brief 校验全部窗口后原子发布根清单并清理未引用旧代次。 */
bool commit(QString* pError = NULL);
/** @brief 中止当前会话并删除尚未发布的本代次目录。 */
void abort();
/** @brief 返回会话是否已经开始且尚未结束。 */
bool isActive() const;
/** @brief 返回本次保存生成的唯一代次标识。 */
QString generationId() const;
/** @brief 返回成果根目录。 */
QString resultRootDirectory() const;
/** @brief 从已发布根清单解析并校验指定窗口的主 JSON。 */
static bool resolveWindowMainJson(
const QString& sResultRootDirectory,
const QString& sWindowId,
QString& sWindowDirectory,
QString& sMainJsonPath,
nmNumericalFileReference* pMainReference = NULL,
QString* pError = NULL);
/**
* @brief 校验已发布根清单,并查询清单是否明确引用指定窗口。
* @param bContainsWindow 返回窗口是否存在;不存在不是成果损坏。
*/
static bool containsPublishedWindow(
const QString& sResultRootDirectory,
const QString& sWindowId,
bool& bContainsWindow,
QString* pError = NULL);
/** @brief 只校验根清单结构、窗口唯一性和全部主 JSON 哈希。 */
static bool validatePublishedManifest(
const QString& sResultRootDirectory,
QString* pError = NULL);
private:
/** @brief 禁止复制保存会话。 */
nmNumericalSaveSession(const nmNumericalSaveSession&);
/** @brief 禁止赋值保存会话。 */
nmNumericalSaveSession& operator=(const nmNumericalSaveSession&);
private:
/** @brief 会话是否已开始。 */
bool m_bActive;
/** @brief 根清单是否已经成功发布。 */
bool m_bCommitted;
/** @brief 回滚清单失败时保留新代次,避免根清单形成悬空引用。 */
bool m_bKeepGenerationOnAbort;
/** @brief 成果业务标识。 */
QString m_sResultId;
/** @brief 成果根目录。 */
QString m_sResultRootDirectory;
/** @brief 当前保存代次 UUID。 */
QString m_sGenerationId;
/** @brief 当前代次的绝对目录。 */
QString m_sGenerationDirectory;
/** @brief 按窗口标识保存的新旧主 JSON 引用。 */
QMap<QString, nmNumericalSavedWindow> m_mapWindows;
/** @brief 本轮已经写入并完成全引用链校验的窗口标识。 */
QSet<QString> m_setValidatedWindowIds;
};
#endif // NMNUMERICALSAVESESSION_H