免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: BetonArmEE
打印 上一主题 下一主题

[C] 该项目已废弃,请管理员删除此贴 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2014-09-01 21:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2014-09-01 21:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2014-09-01 21:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2014-09-01 21:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
15 [报告]
发表于 2014-09-01 22:50 |只看该作者
回复 10# BetonArmEE


    windows下不支持int64_t这种类型吗?不应该啊。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2014-09-01 23:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
17 [报告]
发表于 2014-09-02 10:50 |只看该作者
本帖最后由 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)之间的转换。
一个映射数据库表的例子:
  1. >mkpatt.sh
  2. 输入表名: pattern_col

  3. T_PkgType PATTERN_COL_tpl[]={
  4.         {CH_CHAR,129,"tab_name",0,-1},
  5.         {CH_CHAR,129,"col_name"},
  6.         {CH_CHAR,13,"col_type"},
  7.         {CH_INT,sizeof(int),"col_len"},
  8.         {CH_CHAR,37,"col_format"},
  9.         {CH_CHAR,129,"pseudo_name"},
  10.         {-1,0,"PATTERN_COL","tab_name|col_name|"}
  11. };

  12. extern T_PkgType PATTERN_COL_tpl[];
  13. typedef struct {
  14.         char tab_name[129];
  15.         char col_name[129];
  16.         char col_type[13];
  17.         int col_len;
  18.         char col_format[37];
  19.         char pseudo_name[129];
  20. } 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语句里的绑定变量绑定到指定的结构体。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
18 [报告]
发表于 2014-09-02 11:14 |只看该作者
对齐归根结底取决于ABI规范,x86-32位下ABI规范混乱, 相比之下x86-64就好很多,AMD一开始就发布了ABI规范。

对于double, 32位linux/gcc下是4字节对齐,64位linux/gcc下则是8字节对齐。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
19 [报告]
发表于 2014-09-02 11:16 |只看该作者
zhaohongjian000 发表于 2014-09-02 11:14
对齐归根结底取决于ABI规范,x86-32位下ABI规范混乱, 相比之下x86-64就好很多,AMD一开始就发布了ABI规范。 ...

所以,直传结构很成问题。还是进行序列化/反序列化靠谱点。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2014-09-02 11:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP