- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-09-02 11:28 编辑
BetonArmEE 发表于 2014-08-31 21:41
DirectStruct - C结构体工具
1.概述
鼓励一下楼主。
N年前,我干了几乎相同的一件事,实质上就是C结构的反射。
欢迎来SDBC QQ群100807652 讨论这个技术。
我考虑的可能比你更多,供参考:
结构传输的问题,更为复杂。
比如,对齐问题,不仅取决于系统,还取决于编译器。
double类型,在LINIX Gcc是4字节对齐,WINDOWS 32 是8字节对齐。
long类型的长度,linux/UNIX 64上是8字节,其他是4字节。
因此,结构的直接传输,问题比较多。更通用的办法是序列化。到达目标系统后反序列化到自己的结构。
SDBC考虑的是一组结构序的列化/反序列化工具,序列化的目标格式是:
按某种分隔符的字符串;JSON;SQL语句。理论上,XML也应该是可以的。
尤其是序列化成SQL,是最有用的了。
它可以实现:以C结构为数据总线,数据库----结构-----网络包(字符串或JSON)之间的转换。
一个映射数据库表的例子:- >mkpatt.sh
- 输入表名: pattern_col
- T_PkgType PATTERN_COL_tpl[]={
- {CH_CHAR,129,"tab_name",0,-1},
- {CH_CHAR,129,"col_name"},
- {CH_CHAR,13,"col_type"},
- {CH_INT,sizeof(int),"col_len"},
- {CH_CHAR,37,"col_format"},
- {CH_CHAR,129,"pseudo_name"},
- {-1,0,"PATTERN_COL","tab_name|col_name|"}
- };
- extern T_PkgType PATTERN_COL_tpl[];
- typedef struct {
- char tab_name[129];
- char col_name[129];
- char col_type[13];
- int col_len;
- char col_format[37];
- char pseudo_name[129];
- } PATTERN_COL_stu;
复制代码 //这个就是所谓的“模板”了,它使我们能够"看"到未知结构的内容。
typedef struct {
INT4 type;
INT4 len; // in byte
const char *name;
const char *format;
INT4 offset;
int bindtype; //default=0
} T_PkgType;
是不是和你的dsc异曲同工?
比你增加的几个内容:
format:形成sql时的日期时间格式。
offset:成员在结构中的偏移量,映射工具要计算出来。
bindtype:数据库的绑定类型。
上述表结构序列化出来的select语句:
db2_prepare=SELECT TAB_NAME,COL_NAME,COL_TYPE,COL_LEN,COL_FORMAT,PSEUDO_NAME FROM DB2MLC.PATTERN_COL WHERE TAB_NAME=?
insert和update语句:
stmt=INSERT INTO DB2MLC.pattern_col (tab_name,col_name,col_type,col_len,col_format,pseudo_name) VALUES (?,?,?,?,?,?)
stmt=UPDATE DB2MLC.pattern_col SET tab_name=? ,col_name=?,col_type=? ,col_len=? ,col_format=? ,pseudo_name=? WHERE tab_name=? AND col_name=?
映射工具可以自动把SQL语句里的绑定变量绑定到指定的结构体。 |
|