====== OpnRecorder ====== **//Inherited from//** NULL **//Inherited by//** NULL **//Friend class//** NULL **//Description//** OpnRecorder用于运行时序列化所有数据操作的工具类,执行功能时,OpnRecorder通过XManager提供的接口,所有数据在执行功能之前的状态和执行之后的状态按照顺序被保存到二进制文件中,这些记录可以通过恢复到功能之前的数据状态完成功能的撤销(undo),在撤销之后,也可以回到功能执行之后的状态完成功能的重做(redo)。当一系列功能都按照这样的规则将所有数据对象的状态都序列化到二进制文件中,每个功能对应其中一段记录,重复前述操作就可以达到无限的undo、redo。 OpnRecorder支持如下数据操作: | 枚举量 | 值 | 说明 | | Opn_Add | 0x0001 | 创建(添加对象) | | Opn_Del | 0x0002 | 删除(销毁对象) | | Opn_Modify | 0x0004 | 修改 | | Opn_Attach | 0x0010 | 绑定从属关系 | | Opn_Detach | 0x0020 | 接触从属关系 | | Opn_Status | 0x0040 | 仅用于文档状态变化 | | Opn_PrevNext | 0x080 | 对象顺序的变化 | | Opn_Renumber | 0x0100 | 对象重编号 | OpnRecorder有如下记录模式: | 枚举量 | 值 | 说明 | | Opn_Silent | 0x00 | 静默,不记录 | | Opn_Record | 0x01 | 正常记录 | | Opn_Undo | 0x02 | 撤销,不记录 | | Opn_Redo | 0x04 | 重做,不记录 | | Opn_Rollback | 0x08 | 回滚,不记录 | | Opn_Commit | 0x10 | 提交,记录 | OpnRecorder的undo、redo机制可以根据需要被激活,也可以忽略单个对象管理器。 **//Members//** * static [[opnrecorder#m_imode|m_iMode]] * static [[opnrecorder#m_benable|m_bEnable]] * int64 [[opnrecorder#m_curopnpos|m_curOpnPos]] * XPath [[opnrecorder#m_strpath|m_strPath]] * XBinaryIO * [[opnrecorder#m_precordio|m_pRecordIO]] * XArrayPool [[opnrecorder#m_itempool|m_ItemPool]] * int [[opnrecorder#m_icommitdepth|m_iCommitDepth]] * int [[opnrecorder#m_iitemrecordnumber|m_iItemRecordNumber]] * ulong [[opnrecorder#m_inextdomainid|m_iNextDomainID]] * XArray [[opnrecorder#m_pdomaintable|m_pDomainTable]] **//Public interface//** * static void [[opnrecorder#setmode|setMode]](int f) * static int [[opnrecorder#getmode|getMode]]() * static void [[opnrecorder#enable|enable]]() * static void [[opnrecorder#disable|disable]]() * static void [[opnrecorder#recover|recover]]() * static bool [[opnrecorder#isenabled|isEnabled]]() * [[opnrecorder#opnrecorder1|OpnRecorder]](const char * path = NULL) * [[opnrecorder#~opnrecorder|~OpnRecorder]]() * void [[opnrecorder#redo|redo]](int64 before) * void [[opnrecorder#undo|undo]](int64 after) * void [[opnrecorder#beginrecord|beginRecord]]() * void [[opnrecorder#copyrecord|copyRecord]](const char * from) * void [[opnrecorder#additemrecord|addItemRecord]]( int opn,int domain,const XItem * data) * void [[opnrecorder#addlinkrecord|addLinkRecord]]( int opn,int domain,) * void [[opnrecorder#addprevnextrecord|addPrevNextRecord]]( int opn, int domain,const XItem * target, const XItem * prev, const XItem * next) * int [[opnrecorder#registerdomainhandler|registerDomainHandler]](XManager * hdl, int hdlID = -1 ) * void [[opnrecorder#registerout|registerOut]](int did) * int [[opnrecorder#getnextdomainhandlerid|getNextDomainHandlerID]]() const * int64 [[opnrecorder#getcurrentposition|getCurrentPosition]]() const * int [[opnrecorder#commit|commit]]() * void [[opnrecorder#rollback|rollback]](int64 after) * void [[opnrecorder#reset|reset]]() * void [[opnrecorder#setpath|setPath]](const char * path) * XBinaryIO * [[opnrecorder#getserializeio|getSerializeIO]]() **//Private interface//** * int [[opnrecorder#stasticrecords|stasticRecords]](const XArrayPool & records, vector * recordPtrs) ---- {{anchor:m_imode}} **int m_iMode** 静态变量,运行模式 {{anchor:m_benable}} **bool m_bEnable** 静态变量,是否激活 {{anchor:m_curopnpos}} **int64 m_curOpnPos** 二进制记录文件的当前记录地址 {{anchor:m_strpath}} **XPath m_strPath** 二进制记录文件的路径 {{anchor:m_precordio}} **XBinaryIO * m_pRecordIO** 二进制记录文件句柄 {{anchor:m_itempool}} **XArrayPool m_ItemPool** 对象记录数组池 {{anchor:m_icommitdepth}} **int m_iCommitDepth** 提交序号 {{anchor:m_iitemrecordnumber}} **int m_iItemRecordNumber** 对象记录数 {{anchor:m_inextdomainid}} **ulong m_iNextDomainID** 下一个域句柄ID(域句柄ID记录了对象管理器句柄在对象管理器句柄数组中的位置序号) {{anchor:m_pdomaintable}} **XArray m_pDomainTable** 对象管理器句柄数组 ---- {{anchor:setmode}} **static void setMode(int f)** *function: 静态函数,设置记录模式 *parameters: - [i]int f: 记录模式 *return value: 无 {{anchor:getmode}} **static int getMode()** *function: 静态函数,获取记录模式 *parameters: NULL *return value: 记录模式 {{anchor:enable}} **static void enable()** *function: 静态函数,激活OpnRecorder *parameters: NULL *return value: {{anchor:disable}} **static void disable()** *function: 静态函数,抑制OpnRecorder *parameters: NULL *return value: {{anchor:recover}} **static void recover()** *function: 静态函数,恢复之前的运行模式 *parameters: NULL *return value: 无 {{anchor:isenabled}} **static bool isEnabled()** *function: 静态函数,判断OpnRecorder是否启用 *parameters: NULL *return value: OpnRecorder启用返回true,否则返回false {{anchor:opnrecorder1}} **OpnRecorder(const char * path = NULL)** *function: 构造函数 *parameters: - [i]const char * path = NULL: 二进制记录文件的路径 *return value: 无 {{anchor:~opnrecorder}} **~OpnRecorder()** *function: 析构函数 *parameters: NULL *return value: 无 {{anchor:redo}} **void redo(int64 before)** *function: 重做,正向从当前记录位置序列化二进制文件中的数据记录直到到达指定终点位置 *parameters: - [i]int64 before: 指定的记录终点 *return value: 无 {{anchor:undo}} **void undo(int64 after)** *function: 撤销,反向从当前记录位置序列化二进制文件中的数据记录直到到达指定终点位置 *parameters: - [i]int64 after: 指定的记录终点 *return value: 无 {{anchor:beginrecord}} **void beginRecord()** *function: 开始记录数据状态 *parameters: NULL *return value: 无 {{anchor:copyrecord}} **void copyRecord(const char * from)** *function: 从另一个记录文件中拷贝记录,用于错误重现 *parameters: - [i]const char * from: 源记录文件路径名 *return value: 无 {{anchor:additemrecord}} **void addItemRecord( int opn,int domain,const XItem * data)** *function: 添加对象操作记录 *parameters: - [i] int opn: 操作码 - [i]int domain: 域ID - [i]const XItem * data: 数据对象 *return value: 无 {{anchor:addlinkrecord}} **void addLinkRecord( int opn,int domain,const XItem * target,const XItem * obj)** *function: 添加对象关系操作记录 *parameters: - [i] int opn: 操作码 - [i] int domain: 域ID - [i] const XItem * target: 主对象 - [i] const XItem * obj: 从对象 *return value: {{anchor:addprevnextrecord}} **void addPrevNextRecord( int opn, int domain,const XItem * target, const XItem * prev, const XItem * next)** *function: 添加对象顺序操作记录 *parameters: - [i] int opn: 操作码 - [i] int domain: 域ID - [i]const XItem * target: 当前对象 - [i] const XItem * prev: 前一个对象 - [i] const XItem * next: 后一个对象 *return value: 无 {{anchor:registerdomainhandler}} **int registerDomainHandler(XManager * hdl, int hdlID = -1 )** *function: 注册域对象管理器句柄 *parameters: - [i]XManager * hdl: 对象管理器句柄 - [i] int hdlID = -1 : 对象管理器句柄的序号(为-1时自动获取最大值) *return value: 返回对象管理器句柄的序号 {{anchor:registerout}} **void registerOut(int did)** *function: 注销序号为did的对象管理器句柄 *parameters: - [i]int did: 对象管理器句柄的序号 *return value: 无 {{anchor:getnextdomainhandlerid}} **int getNextDomainHandlerID() const** *function: 获取下一个对象管理器句柄序号 *parameters: NULL *return value: 下一个对象管理器句柄序号 {{anchor:getcurrentposition}} **int64 getCurrentPosition() const** *function: 获取二进制记录文件的当前记录地址 *parameters: NULL *return value: 当前记录地址 {{anchor:commit}} **int commit()** *function: 提交数据记录 *parameters: NULL *return value: 返回提交数据记录的数目 {{anchor:rollback}} **void rollback(int64 after)** *function: 回滚操作,反向从当前记录位置序列化二进制文件中的数据记录直到到达指定终点位置 *parameters: - [i]int64 after: 指定的记录终点 *return value: 无 {{anchor:reset}} **void reset()** *function: 重置记录数据 *parameters: NULL *return value: 无 {{anchor:setpath}} **void setPath(const char * path)** *function: 重新设置二进制记录文件的路径 *parameters: - [i]const char * path: 路径名 *return value: 无 {{anchor:getserializeio}} **XBinaryIO * getSerializeIO()** *function: 获取二进制记录文件句柄 *parameters: NULL *return value: 二进制记录文件句柄