跳到主要内容

architecture

简介

功能说明

这是P02的ArchitectureD的gs移植版本

mysql/sql的格式化数据库,使用者需要根据规范提供数据库的描述文件(.xml格式)

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

1. 为什么保存为关系表数据时,抽出一个字段以后需要检查父节点?

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

2. 为什么还原为映射数据时,如果读出的值为UNDEFINED, 需要检查父节点是否存在?

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

3. 采用上述方法,是否会造成保存数据时没有location字段,但是还原以后却多 了这个字段呢?

有可能。但是我们认为这是可以接受的的,因为如果location字段下的子字段被数据库描述文件所定义,那么我们认为这为恒有字段,所以其父节点类型应保持为映射。倘若我们认为,location还原以后必须保持存入时的状态,不允许将之自动设置为映射,那么我们就不能在描述文件中定义location下的子字段而是直接定义整个location字段。

组件接口

architecture.gs

函数原型函数作用
void disable_db_config_check()禁止数据库配置检查
void enable_db_config_check()启用数据库配置检查
void load_databases(array xml_files)载入一组指定的数据库描述文件
mixed derive_data_for_table(string path, mixed primary_value, map data, string databases = "")
mixed get_tables(string databases = "")获取指定数据库群在描述文件中所配置的所有的表信息
mixed get_table_info(string path, string databases = "")获取指定数据库群在描述文件中所配置的指定的表信息

样例

#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);
}