# 版本与数据库配置 **本文档中引用的文件** - [version_info.txt](file://version_info.txt) - [database_modify.xml](file://database_modify.xml) - [DB\数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) - [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp) - [h\UpdateDataBase.h](file://h/UpdateDataBase.h) - [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp) - [h\checkupdate.h](file://h/checkupdate.h) ## 目录 1. [版本控制机制](#版本控制机制) 2. [数据库变更管理](#数据库变更管理) 3. [XML与文本格式对比](#xml与文本格式对比) 4. [系统升级流程](#系统升级流程) 5. [部署与维护建议](#部署与维护建议) ## 版本控制机制 `version_info.txt` 文件是系统版本控制的核心元数据文件,其主要作用是存储当前软件的版本信息,支持自动更新功能。该文件位于安装目录中,其内容结构简单,仅包含一个版本号字段。 根据文件内容分析,当前版本号为 `2.4.1`。该版本号在系统启动时被读取,并与服务器端的最新版本进行比对,以判断是否需要执行更新操作。 版本比对逻辑主要在 `checkupdate.cpp` 文件中实现。系统通过 `GetGeoMativeVersion()` 函数从可执行文件的资源中提取版本信息,并通过 HTTP 请求从服务器获取最新的版本号(`GeomativeVersion.txt`)。如果本地版本低于服务器版本,则触发更新流程。 版本控制流程如下: 1. 系统启动时读取 `version_info.txt` 中的版本号 2. 通过 HTTP 请求获取服务器端最新版本号 3. 比较本地与远程版本号 4. 若本地版本较旧,则提示用户更新或自动下载更新包 5. 更新完成后,更新本地版本信息 该机制确保了软件能够及时获取最新功能和安全补丁,同时避免了不必要的更新操作。 **本节来源** - [version_info.txt](file://version_info.txt) - [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp) - [h\checkupdate.h](file://h/checkupdate.h) ## 数据库变更管理 `database_modify.xml` 文件是数据库结构变更管理的核心配置文件,采用 XML 格式存储数据库的变更历史。该文件详细记录了数据库表结构的增删改操作,包括字段属性、主键、索引、外键等元数据信息。 ### XML结构分析 该文件采用分层结构,根节点为 `current_version`,包含当前版本号。其子节点 `pre_version` 记录了历史版本的变更信息。每个 `pre_version` 节点包含一个 `value` 属性,表示该版本号。 在 `pre_version` 节点下,`table` 元素表示对数据库表的操作,其 `modify_type` 属性定义了操作类型: - `1`: 增加表 - `2`: 删除表 - `3`: 修改表 `column` 元素描述了字段的详细属性: - `name`: 字段名称 - `is_primary_key`: 是否为主键 - `value_type`: 字段类型(1:text, 2:Memo, 3:Byte, 4:Integer, 5:Long, 6:Single, 7:Double, 8:Currency, 9:AutoNumber, 10:Date/Time, 11:Yes/No) - `attribute_value`: 字段长度(仅对文本类型有效) - `index`: 索引类型(0:无索引, 1:允许重复, 2:不允许重复) - `is_foreign_key`: 是否为外键 - `is_empty`: 是否允许为空 - `is_compress`: 是否压缩 ### 变更执行流程 数据库变更的执行由 `UpdateDataBase.cpp` 中的 `CUpdateDataBase` 类负责。其工作流程如下: ```mermaid flowchart TD A[启动系统] --> B{是否存在database_modify.xml?} B --> |否| C[无需更新数据库] B --> |是| D[解析XML文件] D --> E[获取当前数据库版本] E --> F[查找匹配的pre_version] F --> G[提取变更指令] G --> H{遍历变更指令} H --> I[增加表] H --> J[删除表] H --> K[修改表] I --> L[生成CREATE TABLE语句] J --> M[生成DROP TABLE语句] K --> N[生成ALTER TABLE语句] L --> O[执行SQL] M --> O N --> O O --> P[更新versioninfo表] P --> Q[完成数据库更新] ``` **图示来源** - [database_modify.xml](file://database_modify.xml) - [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp) - [h\UpdateDataBase.h](file://h/UpdateDataBase.h) 当系统检测到数据库需要更新时,会按照以下步骤执行: 1. 读取 `database_modify.xml` 文件 2. 解析当前版本号,查找对应的变更记录 3. 根据 `modify_type` 执行相应的数据库操作 4. 更新数据库中的 `versioninfo` 表,记录新的版本号 5. 记录更新日志到 `LOG\update_db.log` **本节来源** - [database_modify.xml](file://database_modify.xml) - [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp) - [h\UpdateDataBase.h](file://h/UpdateDataBase.h) ## XML与文本格式对比 系统中存在两种数据库变更记录格式:结构化的 XML 格式和纯文本格式。`database_modify.xml` 采用 XML 格式,而 `DB\数据库字段修改记录.txt` 则采用纯文本格式。 ### 文本格式分析 纯文本格式的变更记录位于 `DB\数据库字段修改记录.txt` 文件中,其内容为人工编写的变更日志,按时间顺序记录了数据库的变更历史。例如: ``` 2015年6月2日--- 1:td2dcon增加字段bUse,用于标记该条记录是否有效 2:td3dcon增加字段bUse,用于标记该条记录是否有效 3: td1dcon增加字段bUse,用于标记该条记录是否有效 ``` 这种格式的优点是易于人类阅读和编写,但存在以下局限性: - 缺乏结构化,难以自动化解析 - 没有标准化的字段类型定义 - 无法精确描述索引、外键等复杂约束 - 容易出现格式不一致的问题 ### XML格式优势 相比之下,`database_modify.xml` 的 XML 格式具有显著优势: 1. **结构化存储**:采用标准化的标签和属性,便于程序解析和处理 2. **自动化处理**:可以直接映射到数据库操作指令,实现自动化迁移 3. **完整性**:包含完整的字段属性定义,包括数据类型、长度、约束等 4. **可验证性**:可以通过 XML Schema 进行格式验证 5. **版本控制**:支持多版本变更记录的嵌套管理 XML 格式特别适合在自动化部署和持续集成环境中使用,能够确保数据库结构变更的准确性和一致性。 **本节来源** - [database_modify.xml](file://database_modify.xml) - [DB\数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) ## 系统升级流程 当系统需要进行数据库结构升级时,会依据 `version_info.txt` 和 `database_modify.xml` 两个文件执行完整的迁移流程。 ### 升级触发条件 系统在启动时会检查以下条件来决定是否需要升级: 1. 本地版本号与服务器版本号不一致 2. 数据库版本号与 `database_modify.xml` 中的版本号不一致 3. 存在未应用的 `pre_version` 变更记录 ### 升级执行过程 升级过程由 `CUpdateDataBase` 类的 `ParserUpdateDBXml()` 方法驱动,其核心逻辑如下: 1. **版本比对**:比较 `m_strCurVer`(当前版本)与 XML 中的 `current_version` 值 2. **变更查找**:遍历 `pre_version` 节点,找到与当前数据库版本匹配的变更记录 3. **指令解析**:根据 `modify_type` 解析表结构变更指令 4. **SQL生成**:将 XML 指令转换为具体的 SQL 语句 5. **事务执行**:在数据库事务中执行所有变更操作 6. **版本更新**:更新 `versioninfo` 表中的版本号 ### 实际案例 假设系统从版本 `1.1.1` 升级到 `1.1.2`,需要在 `test` 表中添加新字段。`database_modify.xml` 中的配置如下: ```xml