This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,238 @@
# 版本与数据库配置
<cite>
**本文档中引用的文件**
- [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)
</cite>
## 目录
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日---
1td2dcon增加字段bUse,用于标记该条记录是否有效
2td3dcon增加字段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
<table name="test" modify_type="1">
<column name="id" is_primary_key="1" value_type="9" attribute_value="1"/>
<column name="col1" value_type="2" attribute_value="20" is_empty="1" is_compress="1"/>
<column name="col2" value_type="5" is_foreign_key="0" refer_table_name="FK_test" refer_table_col="fk1"/>
<column name="col3" value_type="5" index="2"/>
</table>
```
系统将生成以下 SQL 语句并执行:
```sql
CREATE TABLE test (
id counter primary key,
col1 text(20) with compression null,
col2 integer,
col3 integer
);
CREATE UNIQUE INDEX iCol3 ON test (col3);
ALTER TABLE test ADD CONSTRAINT FK_col2 FOREIGN KEY (col2) REFERENCES FK_test(fk1) ON UPDATE CASCADE ON DELETE CASCADE;
```
此过程确保了数据库结构变更的原子性和一致性。
**本节来源**
- [version_info.txt](file://version_info.txt)
- [database_modify.xml](file://database_modify.xml)
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
## 部署与维护建议
`version_info.txt``database_modify.xml` 作为关键的元数据文件,在部署、备份和故障恢复中扮演着重要角色。
### 部署注意事项
1. **文件完整性**:确保两个文件在部署包中完整存在
2. **版本同步**:确保 `version_info.txt` 中的版本号与实际软件版本一致
3. **权限设置**:确保应用程序有读写这两个文件的权限
4. **路径正确**:确认文件位于正确的安装目录中
### 备份策略
建议将这两个文件纳入常规备份范围:
- `version_info.txt`:记录当前系统状态,便于版本追溯
- `database_modify.xml`:包含数据库变更历史,是数据恢复的关键
### 故障恢复
当系统出现故障时,这两个文件可帮助快速恢复:
1. 通过 `version_info.txt` 确定系统版本
2. 通过 `database_modify.xml` 重建数据库结构
3. 按照变更历史逐步恢复数据
### 维护建议
为确保文件的准确性和完整性,建议:
1. **变更审计**:每次数据库结构变更都必须更新 `database_modify.xml`
2. **版本递增**:每次发布新版本都必须更新 `version_info.txt`
3. **格式验证**:使用 XML 验证工具确保 `database_modify.xml` 的格式正确
4. **文档同步**:保持 XML 文件与数据库实际结构的一致性
5. **测试验证**:在测试环境中验证变更脚本的正确性
通过严格维护这两个元数据文件,可以确保系统的稳定运行和可维护性。
**本节来源**
- [version_info.txt](file://version_info.txt)
- [database_modify.xml](file://database_modify.xml)
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)