蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


[钢筋混凝土专栏] 数据库表定义DTD文件及处理工具程序

[code]
数据库表定义DTD文件及处理工具程序
作者:钢筋混凝土
版本:2005-8-7 21:00

一、什么是“数据库表定义DTD文件”

        如果你不是从事c/c++程序软件开发(unix或者windows平台),你不用继续往下看了。如果你不是从事c/c++嵌入式SQL数据库应用软件开发,你也不用继续往下看了。
        数据库表定义DTD是一种有待于标准化的数据库表结构统一描述格式,该格式尽量兼容所有主流数据库系统表结构描述标准。比如下面是一个用户数据库user表结构的DTD描述。

#############################################################

user_info
用户信息表
设计人:钢筋混凝土 审核人:钢筋混凝土

字段名                                类型                长度        是否允许空值        缺省值                注释
------------------------------------------------------------------------------
uid                                        int                        /                N.N                                /                        用户ID
gid                                        int                         /                N.N                                /                        用户组ID
username                        varchar                32                N.N                                /                        用户名
nickname                        varchar                64                N.N                                /                        用户昵称
password                        char                64                /                                ""                        口令
email                                varchar                64                /                                ""                        邮箱地址
safe_question                varchar                128                /                                ""                        安全问题
safe_answer                        varchar                128                /                                ""                        安全答案
register_datetime        datetime        /                N.N                                /                        注册日期时间
login_datetime                datetime        /                N.N                                /                        注册日期时间

索引标志        是否唯一索引        字段集合
------------------------------------------------------------------------------
index                unique                        uid,gid
index                unique                        username
index                                                nickname

##############################################################################

group_info
用户组信息表
设计人:钢筋混凝土 审核人:钢筋混凝土

字段名                                类型                长度        是否允许空值        缺省值                注释
------------------------------------------------------------------------------
gid                                        int                        /                N.N                                /                        用户组ID
groupname                        varchar                32                N.N                                /                        用户组名
groupnickname                varchar                64                N.N                                /                        用户组昵称
password                        char                64                /                                ""                        口令
email                                varchar                64                /                                ""                        邮箱地址
register_datetime        datetime        /                N.N                                /                        注册日期时间

索引标志        是否唯一索引        字段集合
------------------------------------------------------------------------------
index                unique                        gid
index                unique                        groupname
index                                                groupnickname

##############################################################################
       
二、“数据库表定义DTD文件”格式说明

        这里有两张表:user_info、group_info。
        “一个'#'首字符的行”被称为“DTD分割行”,整个表集DTD描述由一个DTD分割行开始,以一个DTD分割行结束。表与表之间用以DTD分割行分割开,一对DTD分割行之间的内容叫做“DTD表定义块”。
        以一个DTD分割行开始搜索第一个非空行被提取为表名,比如上例中的“user_info”,“group_info”。表名所在行的后面为“字段定义子块”,该子块由“定义行”和“注释行”组成。所有第二列字串为字段类型(见附录)的行为“定义行”,其余都是“注释行”。
        当处理“字段定义子块”时遇到第一列字串为“index”,即进入“索引定义子块”。
        当处理“索引定义子块”时遇到“DTD分割行”,即结束当前“DTD表的定义块”。
       
三、处理“数据库表定义DTD文件”的工具程序“dtd”

        工具程序dtd是用来处理DTD文件,以生成创建、销毁数据库所有表结构的SQL导入文件以及嵌入式SQL开发所需要的c语言的.h文件和.SQC文件,处理后分别存放在当前目录下的sql/ include/ src/目录下。
        下面以user数据库user_info表为例分析dtd处理后自动生成的源代码文件。
        在include/目录下自动生成user_info.create.sql(user_info表创建时可导入的SQL脚本文件)、user_info.drop.sql(user_info表销毁时可导入的SQL脚本文件)。

sql/user.create.sql
------------------------------------------------------------------------------
CREATE TABLE 'user_info'
(
        'uid' INT NOT NULL ,
        'gid' INT NOT NULL ,
        'username' CHAR(32) NOT NULL ,
        'nickname' CHAR(64) NOT NULL ,
        'password' CHAR(64) DEFAULT "" ,
        'email' CHAR(64) DEFAULT "" ,
        'safe_question' CHAR(128) DEFAULT "" ,
        'safe_answer' CHAR(128) DEFAULT "" ,
        'register_datetime' DATETIME NOT NULL ,
        'login_datetime' DATETIME NOT NULL
) ;

CREATE UNIQUE INDEX 'user_info_uidx1' ON 'user_info'( "uid" ) ;
CREATE UNIQUE INDEX 'user_info_uidx2' ON 'user_info'( "username" ) ;
CREATE INDEX 'user_info_idx3' ON 'user_info'( "nickname") ;

sql/user.drop.sql
------------------------------------------------------------------------------
DROP UNIQUE INDEX 'user_info_idx1' ;
DROP UNIQUE INDEX 'user_info_idx2' ;
DROP INDEX 'user_info_idx3' ;

DROP TABLE 'user_info' ;

        在include/目录下自动生成user_info.SQLDECLARE.h(数据库宿主变量引用)、user_info.struct.h(表结构相映射的c语言结构体声明)、user_info.R.h(带附加变量的数据库宿主变量列表宏)、user_info.W.h(数据库宿主变量列表宏)、user_info.U.h(表结构相映射的c语言结构体成员列表宏)以及user_info.h(include以上五个文件的集合文件)。

user_info.SQLDECLARE.h
------------------------------------------------------------------------------
EXEC SQL BEGIN DECLARE SECTION ;
        extern int user_info_uid ;
        extern short user_info_uid_id ;
        extern int user_info_gid ;
        extern short user_info_gid_id ;
        extern char user_info_username[32+1] ;
        extern short user_info_username_id ;
        extern char user_info_nickname[64+1] ;
        extern short user_info_nickname_id ;
        extern char user_info_password[64+1] ;
        extern short user_info_password_id ;
        extern char user_info_email[64+1] ;
        extern short user_info_email_id ;
        extern char user_info_safe_question[128+1] ;
        extern short user_info_safe_question_id ;
        extern char user_info_safe_answer[128+1] ;
        extern short user_info_safe_answer_id ;
        extern char user_info_register_datetime[19+1] ;
        extern short user_info_register_datetime_id ;
        extern char user_info_login_datetime[19+1] ;
        extern short user_info_login_datetime_id ;
EXEC SQL END DECLARE SECTION ;

user_info.struct.h
------------------------------------------------------------------------------
struct user_info
{
        int uid ;
        int gid ;
        char username[32] ;
        char nickname[64] ;
        char password[64] ;
        char email[64] ;
        char safe_question[128] ;
        char safe_answer[128] ;
        char register_datetime[19+1] ;
        char login_datetime[19+1] ;
} ;

user_info.R.h
------------------------------------------------------------------------------
#define R_USER_INFO \
        :user_info_uid:user_info_uid_id, \
        :user_info_gid:user_info_gid_id, \
        :user_info_username:user_info_username_id, \
        :user_info_nickname:user_info_nickname_id, \
        :user_info_password:user_info_password_id, \
        :user_info_email:user_info_email_id, \
        :user_info_safe_question:user_info_safe_question_id, \
        :user_info_safe_answer:user_info_safe_answer_id, \
        :user_info_register_datetime:user_info_register_datetime_id, \
        :user_info_login_datetime:user_info_login_datetime_id

user_info.W.h
------------------------------------------------------------------------------
#define W_USER_INFO \
        :user_info_uid, \
        :user_info_gid, \
        :user_info_username, \
        :user_info_nickname, \
        :user_info_password, \
        :user_info_email, \
        :user_info_safe_question, \
        :user_info_safe_answer, \
        :user_info_register_datetime, \
        :user_info_login_datetime

user_info.U.h
------------------------------------------------------------------------------
#define U_USER_INFO \
        uid, \
        gid, \
        username, \
        nickname, \
        password, \
        email, \
        safe_question, \
        safe_answer, \
        register_datetime, \
        login_datetime

user_info.h
------------------------------------------------------------------------------
#include "user_info.SQLDECLARE.h"
#include "user_info.struct.h"
#include "user_info.R.h"
#include "user_info.W.h"
#include "user_info.U.h"

        在src/目录下自动生成user_info.SQLDECLARE.SQC(数据库宿主变量声明)、user_info.struct.SQC(表结构相映射的c语言结构体声明)、user_info.Init.SQC(数据库宿主变量初始化函数实现)、user_info.StoV.SQC(表结构相映射的c语言结构体的成员值复制到数据库宿主变量的函数实现)、user_info.VtoS.SQC(数据库宿主变量值复制到表结构相映射的c语言结构体的成员的函数实现)以及user_info.SQC(include以上五个文件的集合文件)。

user_info.SQLDECLARE.SQC
------------------------------------------------------------------------------
EXEC SQL BEGIN DECLARE SECTION ;
        int user_info_uid ;
        short user_info_uid_id ;
        int user_info_gid ;
        short user_info_gid_id ;
        char user_info_username[32+1] ;
        short user_info_username_id ;
        char user_info_nickname[64+1] ;
        short user_info_nickname_id ;
        char user_info_password[64+1] ;
        short user_info_password_id ;
        char user_info_email[64+1] ;
        short user_info_email_id ;
        char user_info_safe_question[128+1] ;
        short user_info_safe_question_id ;
        char user_info_safe_answer[128+1] ;
        short user_info_safe_answer_id ;
        char user_info_register_datetime[19+1] ;
        short user_info_register_datetime_id ;
        char user_info_login_datetime[19+1] ;
        short user_info_login_datetime_id ;
EXEC SQL END DECLARE SECTION ;

user_info.struct.SQC
------------------------------------------------------------------------------
struct user_info
{
        int uid ;
        int gid ;
        char username[32] ;
        char nickname[64] ;
        char password[64] ;
        char email[64] ;
        char safe_question[128] ;
        char safe_answer[128] ;
        char register_datetime[19+1] ;
        char login_datetime[19+1] ;
} ;

user_info.Init.SQC
------------------------------------------------------------------------------
void DTDInit_user_info()
{
        user_info_uid = 0 ;
        user_info_uid_id = 0 ;
        user_info_gid = 0 ;
        user_info_gid_id = 0 ;
        memset( user_info_username , 0x00 , sizeof( user_info_username ) ) ;
        user_info_username_id = 0.0 ;
        memset( user_info_nickname , 0x00 , sizeof( user_info_nickname ) ) ;
        user_info_nickname_id = 0.0 ;
        memset( user_info_password , 0x00 , sizeof( user_info_password ) ) ;
        user_info_password_id = 0.0 ;
        memset( user_info_email , 0x00 , sizeof( user_info_email ) ) ;
        user_info_email_id = 0.0 ;
        memset( user_info_safe_question , 0x00 , sizeof( user_info_safe_question ) ) ;
        user_info_safe_question_id = 0.0 ;
        memset( user_info_safe_answer , 0x00 , sizeof( user_info_safe_answer ) ) ;
        user_info_safe_answer_id = 0.0 ;
        memset( user_info_register_datetime , 0x00 , sizeof( user_info_register_datetime ) ) ;
        user_info_register_datetime_id = 0.0 ;
        memset( user_info_login_datetime , 0x00 , sizeof( user_info_login_datetime ) ) ;
        user_info_login_datetime_id = 0.0 ;
}

user_info.StoV.SQC
------------------------------------------------------------------------------
void DTDStoV_user_info( struct user_info *p )
{
        user_info_uid = p->;uid ;
        user_info_gid = p->;gid ;
        strcpy( user_info_username , p->;username ) ;
        strcpy( user_info_nickname , p->;nickname ) ;
        strcpy( user_info_password , p->;password ) ;
        strcpy( user_info_email , p->;email ) ;
        strcpy( user_info_safe_question , p->;safe_question ) ;
        strcpy( user_info_safe_answer , p->;safe_answer ) ;
        strcpy( user_info_register_datetime , p->;register_datetime ) ;
        strcpy( user_info_login_datetime , p->;login_datetime ) ;
}

user_info.VtoS.SQC
------------------------------------------------------------------------------
void DTDVtoS_user_info( struct user_info *p )
{
        p->;uid = user_info_uid ;
        p->;gid = user_info_gid ;
        strcpy( p->;username , user_info_username ) ;
        strcpy( p->;nickname , user_info_nickname ) ;
        strcpy( p->;password , user_info_password ) ;
        strcpy( p->;email , user_info_email ) ;
        strcpy( p->;safe_question , user_info_safe_question ) ;
        strcpy( p->;safe_answer , user_info_safe_answer ) ;
        strcpy( p->;register_datetime , user_info_register_datetime ) ;
        strcpy( p->;login_datetime , user_info_login_datetime ) ;
}

user_info.SQC
------------------------------------------------------------------------------
#include "user_info.SQLDECLARE.SQC"
#include "user_info.struct.SQC"
#include "user_info.Init.SQC"
#include "user_info.StoV.SQC"
#include "user_info.VtoS.SQC"

四、应用演示

adduser.SQC
------------------------------------------------------------------------------
...
#include "user_info.h"
...
int main()
{
        ...
       
        struct user_info st;
       
        st.uid = 101 ;
        st.gid = 11 ;
        strcpy( st.username , "root" );
       
        ...
       
        DTDInit_user_info();
        DTDStoV_user_info( &st );
       
        ...
       
        EXEC SQL
                INSERT INTO user_info
                VALUES ( W_USER_INFO ) ;
       
        if( SQLCODE )
        {
                ...
        }
        else
        {
                ...
        }
       
        ...
}

附录一、数据库表定义DTD目前支持的字段类型 : int dec char varchar datetime

附录二、dtd工具程序更新日志
        2005.08.05        生成处理框架
        2005.08.07        完成1.0版本,仅支持int dec char varchar datetime字段类型
[/code]



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com