|
蓝森林 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] |
| |