architecture
简介
功能说明
支持mysql和sqlite3
这是P02的ArchitectureD的gs移植版本 mysql/sql的格式化数据库,使用者需要根据规范提供数据库的描述文件(.xml格式)
载入数据库描述文件,能够自动生成数据库创建的SQL语句。 可以将完整映射根据描述文件分拆为数据库关系表的一行,也可以进行还原操作。
-
为什么保存为关系表数据时,抽出一个字段以后需要检查父节点? 这是为了使得保存的数据中更小,比如一个数据结构:
{ "location" : { "room" : ROOM, "pos" : POS ]), "me" : ME ])数据库描述文件要求抽出location/room & location/pos,然后将剩余的结果 保存为一个pack字段,这样,因为location在数据抽走必为空,如果保存的字 段中总有这个空映射,即浪费资源,也不利于阅读管理,所以抽走字段以后需 要进行检测,如果为空则不处理。 -
为什么还原为映射数据时,如果读出的值为UNDEFINED, 需要检查父节点是否 存在?并且在必要的时候设置为空映射? 以第一个例子而言,如果ROOM和POS字段均不存在, 即location字段为空映射 时,在保存的数据进行恢复时会略过设置值的操作,这样,因为location字段 在保存时已经被抽空不存在,最后还原的数据中location字段就会保持未定义。 所以,当我们发现一个字段为UNDEFINED时, 就核查其父节点保证存在。
-
采用上述方法,是否会造成保存数据时没有location字段,但是还原以后却多 了这个字段呢? 有可能。但是我们认为这是可以接受的的,因为如果location字段下的子字段 被数据库描述文件所定义,那么我们认为这为恒有字段,所以其父节点类型应 保持为映射。倘若我们认为,location还原以后必须保持存入时的状态,不允 许将之自动设置为映射,那么我们就不能在描述文件中定义location下的子字 段而是直接定义整个location字段。
组件接口
architecture.gs
| 函数原型 | 函数作用 |
|---|---|
| void disable_db_config_check() | 禁止数据库配置检查 |
| void enable_db_config_check() | 启用数据库配置检查,数据库配置不匹配时仅提示 |
| void enable_full_db_config_check() | 启用数据库配置检查,数据库配置不匹配时需要人工确认 |
| void load_databases(array xml_files) | 载入一组指定的数据库描述文件 |
| void reload_databases() | 重新加载所有数据库配置 |
| mixed derive_data_for_table(string path, mixed primary_value, map data, string databases = "") | 根据表名(路径),将映射类型的数据转换为数据库中的记录 |
| map get_tables(string databases = "") | 获取指定数据库群在描述文件中所配置的所有的表信息 |
| TableBase get_table_info(string path, string databases = "") | 获取指定数据库群在描述文件中所配置的指定的表信息 |
| map restore_data_from_table(string path, map row, string databases = "", bool verify_checksum = true) | 将数据库的行数据还原为映射数据 |
类
DatabaseSet
一组Database集合
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| name | string | nil | 可选 | 数据库集合名称 |
| dict | map | nil | 可选 | 数据库信息列表 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| DatabaseSet new_instance_from_xml_node(map m) | 从xml节点构造一个数据库集合实例 |
| void add_database(Database db) | 添加一个数据库配置实例 |
| void iterate_database(function func) | 遍历所有数据库实例 |
| void iterate_table(function func) | 遍历所有所有数据库的所有表 |
| void load_databases_from_xml_node(map m) | 从xml配置中加载一组数据库配置 |
| Database new_database_from_xml_node(map m) | 创建一个数据库配置实例(Database实例) |
Database
数据库配置
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| databases | string | nil | 可选 | 所属的数据库集合名称 |
| type | string | nil | 可选 | 数据库类型 |
| name | string | nil | 可选 | 数据库名称 |
| tables | map | nil | 可选 | 表词典 key - 表名 value - Table实例 |
成员方法
LogDatabase
继承自 Database
日志数据库(ldb)
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| TableBase new_table_from_xml_node(map m) |
TableBase
表基础信息
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| type | string | nil | 可选 | 表所属的数据库的类型 |
| db | string | nil | 可选 | 表所属的数据库 |
| table | string | nil | 可选 | 表名 |
| fields | array | nil | 可选 | 字段列表 |
| primary | string | nil | 可选 | 主键 |
| index | map | nil | 可选 | 索引词典 |
| sql_cmds | array | nil | 可选 | SQL语句 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string desc() | 获取描述信息 |
| Field find_field(string field) | 查找字段信息 |
| void iterate_field(function func) | 遍历所有字段实例 |
| bool match_index_from_xml_node(map m) | 从xml节点配置中创建索引信息 |
| array build(string driver_name) | 根据不同数据库驱动生成SQL语句(生成创建表、索引的SQL语句) |
| string build_create_table_sql(string driver_name) | 构建创建本表的sql语句 |
| array build_create_index_sql(string driver_name) | 构建创建本表索引的sql语句 |
LogTable
继承自 TableBase
日志表信息(可能关联多个日志id)
日志表是固定结构(p1, p2, p3)
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| id_dict | map | nil | 可选 | 日志id词典 一个日志表可以有多个日志id |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| void iterate_log_id(function func) | 遍历所有日志id |
| bool match_from_xml_node(map m) | 从XML节点中填充表信息 |
| bool match_log_from_xml_node(map m) | 从XML节点中填充log字段 |
DataTable
继承自 TableBase
数据表信息
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| pack_field | Field | nil | 可选 | PACK字段名称以及是否计算校验和 |
| runtime_holder_field | Field | nil | 可选 | runtime_holder字段 |
| checksum_field | Field | nil | 可选 | checksum字段 |
| relationship | map | nil | 可选 | 关联词典 |
| read_table | array | nil | 可选 | 关联表 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| bool match_from_xml_node(map m) | 从XML节点中填充表信息 |
| bool match_record_from_xml_node(map m) | 从xml节点配置中创建字段信息 |
| bool match_relationship_from_xml_node(map m) | 从xml节点配置中创建关系信息 |
| bool match_read_table_from_xml_node(map m) | 从xml节点配置中创建关联表信息 |
| bool match_pack_from_xml_node(map m) | 从xml节点配置中创建pack字段信息 |
| string build_create_table_sql(string driver_name) | 构建创建本表的sql语句 |
SqlField
sql字段
以后考虑不同数据库支持不同的处理
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| field | string | nil | 可选 | |
| sql_type | string | nil | 可选 | |
| len | int | 0 | 可选 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| bool compare(SqlField other, string driver_name) | 比较两个字段的sql类型是否相同 |
| string sql_desc(string driver_name) | 获取对应的sql字段描述 |
Field
继承自 SqlField
gs字段信息
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| key_type | string | nil | 可选 | key类型(primary, unique) |
| type | string | nil | 可选 | 字段类别 |
| checksum | bool | false | 可选 | 是否参与checksum计算 |
| default_value | mixed | nil | 可选 | 字段默认值 |
| path | string | nil | 可选 | 字段存储位置 |
| primary_keys | array | nil | 可选 | ?? |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| Field new_instance(string field, string type, int len = 0) | 通过名称和类型创建一个字段实例 |
| bool is_primary_key() | 是不是主键字段 |
| bool is_unique_key() | 是不是unique字段 |
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
StringField
继承自 Field
对应sql string类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
MediumTextField
继承自 Field
对应mysql mediumtextg类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
TextField
继承自 Field
对应mysql text类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
IntField
继承自 Field
对应sql int类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
BigIntField
继承自 Field
对应sql bigint类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
TimeField
继承自 Field
自己扩展的时间类型的字段
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string get_sql_type(string driver_name) | 获取sql类型 |
| mixed to_sql_value(mixed value) | 将指定的值转换为用于sql的值 |
| mixed from_sql_value(mixed sql_value) | 将sql值转换为原始值 |
MixedField
继承自 Field
自己扩展的混合类型的字段