跳到主要内容

architecture

简介

功能说明

支持mysql和sqlite3

这是P02的ArchitectureD的gs移植版本 mysql/sql的格式化数据库,使用者需要根据规范提供数据库的描述文件(.xml格式)

载入数据库描述文件,能够自动生成数据库创建的SQL语句。 可以将完整映射根据描述文件分拆为数据库关系表的一行,也可以进行还原操作。

  1. 为什么保存为关系表数据时,抽出一个字段以后需要检查父节点? 这是为了使得保存的数据中更小,比如一个数据结构: { "location" : { "room" : ROOM, "pos" : POS ]), "me" : ME ]) 数据库描述文件要求抽出location/room & location/pos,然后将剩余的结果 保存为一个pack字段,这样,因为location在数据抽走必为空,如果保存的字 段中总有这个空映射,即浪费资源,也不利于阅读管理,所以抽走字段以后需 要进行检测,如果为空则不处理。

  2. 为什么还原为映射数据时,如果读出的值为UNDEFINED, 需要检查父节点是否 存在?并且在必要的时候设置为空映射? 以第一个例子而言,如果ROOM和POS字段均不存在, 即location字段为空映射 时,在保存的数据进行恢复时会略过设置值的操作,这样,因为location字段 在保存时已经被抽空不存在,最后还原的数据中location字段就会保持未定义。 所以,当我们发现一个字段为UNDEFINED时, 就核查其父节点保证存在。

  3. 采用上述方法,是否会造成保存数据时没有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集合

成员变量

变量名类型初始值须初始化描述
namestringnil可选数据库集合名称
dictmapnil可选数据库信息列表

成员方法

函数原型函数作用
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

数据库配置

成员变量

变量名类型初始值须初始化描述
databasesstringnil可选所属的数据库集合名称
typestringnil可选数据库类型
namestringnil可选数据库名称
tablesmapnil可选表词典
key - 表名
value - Table实例

成员方法

函数原型函数作用
Database new_instance_from_xml_node(string databases, map m)从xml节点配置中创建数据库配置信息
Database new_instance(string databases, string type, string name)根据数据库类型和名称创建数据库实例
void add_table(TableBase table)增加一个表
TableBase get_table(string table_name)获取表信息
void iterate_table(function func)遍历表
TableBase new_table_from_xml_node(map m)
bool match_from_xml_node(map m)从xml节点配置中创建数据库信息

LogDatabase

继承自 Database

日志数据库(ldb)

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
TableBase new_table_from_xml_node(map m)

TableBase

表基础信息

成员变量

变量名类型初始值须初始化描述
typestringnil可选表所属的数据库的类型
dbstringnil可选表所属的数据库
tablestringnil可选表名
fieldsarraynil可选字段列表
primarystringnil可选主键
indexmapnil可选索引词典
sql_cmdsarraynil可选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_dictmapnil可选日志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_fieldFieldnil可选PACK字段名称以及是否计算校验和
runtime_holder_fieldFieldnil可选runtime_holder字段
checksum_fieldFieldnil可选checksum字段
relationshipmapnil可选关联词典
read_tablearraynil可选关联表

成员方法

函数原型函数作用
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字段

以后考虑不同数据库支持不同的处理

成员变量

变量名类型初始值须初始化描述
fieldstringnil可选
sql_typestringnil可选
lenint0可选

成员方法

函数原型函数作用
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_typestringnil可选key类型(primary, unique)
typestringnil可选字段类别
checksumboolfalse可选是否参与checksum计算
default_valuemixednil可选字段默认值
pathstringnil可选字段存储位置
primary_keysarraynil可选??

成员方法

函数原型函数作用
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

自己扩展的混合类型的字段

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string get_sql_type(string driver_name)获取sql类型
mixed to_sql_value(mixed value)将指定的值转换为用于sql的值
mixed from_sql_value(mixed sql_value)将sql值转换为原始值

PackField

继承自 Field

自己扩展的打包字段

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string get_sql_type(string driver_name)获取sql类型
mixed to_sql_value(mixed value)将指定的值转换为用于sql的值
mixed from_sql_value(mixed sql_value)将sql值转换为原始值

TimestampField

继承自 Field

对应sql timestamp类型的的字段

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string get_sql_type(string driver_name)获取sql类型
string sql_desc(string driver_name)
mixed to_sql_value(mixed value)将指定的值转换为用于sql的值
mixed from_sql_value(mixed sql_value)将sql值转换为原始值

AutoIncrementField

继承自 BigIntField

对应sql 自动增长的字段

实际上auto_inrecment应该是个标记,这里当类型处理了

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string sql_desc(string driver_name)
mixed to_sql_value(mixed value)将指定的值转换为用于sql的值
mixed from_sql_value(mixed sql_value)将sql值转换为原始值

RuntimeHolderField

继承自 Field

对应runtime_holder字段

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string get_sql_type(string driver_name)获取sql类型
string sql_desc(string driver_name)
mixed to_sql_value(mixed value)将指定的值转换为用于sql的值
mixed from_sql_value(mixed sql_value)将sql值转换为原始值

MemoField

继承自 Field

对应文本字段

成员变量

变量名类型初始值须初始化描述

成员方法

函数原型函数作用
string get_sql_type(string driver_name)获取sql类型

样例

#pragma parallel

import gs.lang.*;
import gs.util.*;

import pkg.architecture;
import pkg.db_pool;

public void sample()
{
// sample_dbs.xml描述了一个名称为sampledbs的数据库群(databases)
// 其包含有一个名称为db0的数据库

// 准备好初始化描述文件中使用到的数据库的连接信息
// 注册到db_pool中
string db = "db0";
map db_config = {
"driver" : "sqlite",
"address" : "127.0.0.1",
"user": "root"
"passwd" : "111222",
"db": "/doc/list",
"max_conn_count": 32
};
db_pool=>set_db_config(db, db_config);

// 载入数据库的xml文件
array db_xmls = [
__DIR__ "sample_dbs.xml",
];
architecture.load_databases(db_xmls);

// 获取sampledbs数据库群中所有的表
map tables = architecture.get_tables("sampledbs");
printf("sampledbs tables: %O\n", tables);

// 获取sampledbs数据库群中user表的信息
map table_user_info = architecture.get_table_info("user", "sampledbs");
printf("table_user_info: %O\n", table_user_info);

map row = {
"name" : "aaa",
"level" : "1",
"x" : "3",
"z" : "4"
};
// 将数据库的数据还原为映射数据
map restored_data = architecture.restore_data_from_table("user", row, "sampledbs", false);
printf("restored_data: %O\n", restored_data);

// 将映射数据转换为数据库的数据
map derived_data = architecture.derive_data_for_table("user", restored_data["name"], restored_data, "sampledbs");
printf("derived_data: %O\n", derived_data);
}