楼主: yulihua49

[讨论] 侃一下关于程序的“柔性”

[复制链接]
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
21#
 楼主| 发表于 2011-8-24 15:29 | 只看该作者
原帖由 yulihua49 于 2011-8-24 15:26 发表



一个客户端的例子:

  1. #include "sqlcli.h"

  2. //测试分页查询
  3. int testpage(T_Connect *conn,T_NetHead *nethead)
  4. {
  5. JSON_OBJECT json,val;
  6. int cc,event;
  7. T_CLI_Var *clip=(T_CLI_Var *)conn->Var;
  8. log_s *log=(log_s *)clip->var;
  9. INT64 now;

  10.         val=json_object_new_object();
  11.         add_string_to_json(val,"trn_no","G7154");//绑定值

  12.         json=json_object_new_object();
  13.         add_string_to_json(json,"tablename","trn_mmnt");//所需要的表名
  14.         add_string_to_json(json,"where","where trn_no=:trn_no order by stn_no");//条件,有绑定变量
  15.         add_string_to_json(json,"page_size","10");
  16.         add_string_to_json(json,"page_idx","0");//可以改“1”
  17.         json_object_object_add(json,"values",val);

  18.         nethead->PROTO_NUM=get_srv_no(clip,"page_select");
  19.         nethead->data=(char *)json_object_to_json_string(json);
  20.         nethead->PKG_LEN=strlen(nethead->data);
  21.         nethead->ERRNO1=nethead->ERRNO2=nethead->PKG_REC_NUM=0;
  22.         nethead->O_NODE=LocalAddr(conn->Socket,0);
  23. now=now_usec();
  24.         cc=SendPack(conn,nethead);
  25. if(isatty(0)) printf("send=%s\n",nethead->data);
  26.         json_object_put(json);

  27.         cc=RecvPack(conn,nethead);
  28.         if(cc<0||nethead->ERRNO1!=0) {
  29.                 ShowLog(1,"page_select cc=%d net err %d,%s,TCB=%d",
  30.                         cc,errno,strerror(errno),log->TCB);
  31.                 return -1;
  32.         } else {
  33. ShowLog(2,"测试分页功能:RecvPack %d,t_len=%d,len=%d,ERRNO2=%d,data=%s,TIMEVAL=%ld",cc,
  34.         nethead->T_LEN,nethead->PKG_LEN,nethead->ERRNO2,nethead->data,now_usec()-now);
  35.                 event=nethead->PROTO_NUM&65535; //准备返回事件
  36.                 if(event)  EventCatch(conn,event);
  37. /*
  38.                 printf("page_select errno2=%d,data=%s\n",nethead->ERRNO2,nethead->data);
  39.                 json=json_tokener_parse(nethead->data);
  40.                 if(json) {
  41.                         printf("%s\n",json_object_to_json_string(json));
  42.                         json_object_put(json);
  43.                 } else printf("page_select return=%s\n",nethead->data);
  44. */
  45.         }
  46.         return 0;
  47. }

复制代码

[ 本帖最后由 yulihua49 于 2011-8-24 17:17 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
22#
 楼主| 发表于 2011-8-24 15:31 | 只看该作者
原帖由 yulihua49 于 2011-8-24 15:29 发表

一个客户端的例子:


执行结果:
2 ./sqlcli:1318 08/24 14:24'55 测试分页功能:RecvPack 0,t_len=352,len=1447,ERRNO2=0,data=[ { "trn_no": "G7154", "stn_no": "1", "stn_name": "上海虹桥", "trn_lvr": "高速", "arrive_time": "", "departure_time": "12:05", "days": "0", "run_minuts": "0", "stop_minuts": "0" }, { "trn_no": "G7154", "stn_no": "2", "stn_name": "昆山南", "trn_lvr": "高速", "arrive_time": "12:23", "departure_time": "12:24", "days": "0", "run_minuts": "18", "stop_minuts": "1" }, { "trn_no": "G7154", "stn_no": "3", "stn_name": "无锡", "trn_lvr": "高速", "arrive_time": "12:46", "departure_time": "12:48", "days": "0", "run_minuts": "41", "stop_minuts": "2" }, { "trn_no": "G7154", "stn_no": "4", "stn_name": "常州", "trn_lvr": "高速", "arrive_time": "13:01", "departure_time": "13:02", "days": "0", "run_minuts": "56", "stop_minuts": "1" }, { "trn_no": "G7154", "stn_no": "5", "stn_name": "丹阳", "trn_lvr": "高速", "arrive_time": "13:17", "departure_time": "13:18", "days": "0", "run_minuts": "72", "stop_minuts": "1" }, { "trn_no": "G7154", "stn_no": "6", "stn_name": "丹徒", "trn_lvr": "高速", "arrive_time": "13:28", "departure_time": "13:29", "days": "0", "run_minuts": "83", "stop_minuts": "1" }, { "trn_no": "G7154", "stn_no": "7", "stn_name": "镇江", "trn_lvr": "高速", "arrive_time": "13:37", "departure_time": "13:38", "days": "0", "run_minuts": "92", "stop_minuts": "1" }, { "trn_no": "G7154", "stn_no": "8", "stn_name": "南京", "trn_lvr": "高速", "arrive_time": "13:59", "departure_time": "", "days": "0", "run_minuts": "114", "stop_minuts": "-1" } ],TIMEVAL=8066

生成的SQL语句:
getpage:ret=8,stmt=SELECT trn_no,stn_no,stn_name,trn_lvr,arrive_time,departure_time,days,run_minuts,stop_minuts FROM TICKET.trn_mmnt where trn_no=:1 order by stn_no

如果page_index改1,生成如下语句:
getpage:ret=8,stmt=select * FROM (select A.*,ROWNUM RN FROM (SELECT trn_no,stn_no,stn_name,trn_lvr,arrive_time,departure_time,days,run_minuts,stop_minuts FROM TICKET.trn_mmnt where trn_no=:1 order by stn_no) A WHERE ROWNUM <= 10) WHERE RN > 0

至于要编写存储过程完成之,可以在生成语句的地方改成生成存储过程。
也可以彻底一些,json解析完了就可以调存储过程了,存储过程返回后,结果集如何打包你要给我一个办法。

[ 本帖最后由 yulihua49 于 2011-8-24 19:33 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
23#
 楼主| 发表于 2011-8-24 17:59 | 只看该作者
原帖由 newkid 于 2011-8-23 22:22 发表

看这里:
http://www.itpub.net/viewthread.php?tid=1088197&highlight=

楼主在这里的发帖大多数少不了要推荐他做的“包装器”,我能理解他的落寞之情,毕竟这东西离开了他的单位就没有人用,茫茫人海知音难觅。不管他怎么敝帚自珍我都没意见,但是只要踩PLSQL我这个ORACLE卫道士就要跳出来。

哈哈,ORACLE的原教旨主义者。
你的签名也很有意思,它使我想起一位古代哲人的名言:
世界上只有两种书:1是其内容古兰经里已经有了。2是其内容古兰经里没有。后边不说了。

[ 本帖最后由 yulihua49 于 2011-8-24 19:29 编辑 ]

使用道具 举报

回复
招聘 : 多个岗位招聘
论坛徽章:
33
2010广州亚运会纪念徽章:跆拳道
日期:2010-11-22 15:42:39灰彻蛋
日期:2012-05-16 13:17:56参与WIN7挑战赛纪念
日期:2012-05-24 10:37:35茶鸡蛋
日期:2012-05-28 17:27:32灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02奥运会纪念徽章:帆船
日期:2012-07-10 09:43:29奥运会纪念徽章:足球
日期:2012-08-17 09:17:32奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49奥运会纪念徽章:赛艇
日期:2012-08-20 16:23:58
24#
发表于 2011-8-24 19:00 | 只看该作者
菜鸟请教个问题

如果是设计复杂的表连接的查询、或者更新

有中间件了怎么处理?

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
25#
 楼主| 发表于 2011-8-24 19:25 | 只看该作者
原帖由 nannan5000 于 2011-8-24 19:00 发表
菜鸟请教个问题

如果是设计复杂的表连接的查询、或者更新

有中间件了怎么处理?

这时需要手写模板或使用元数据生成模板。完成一个数据结构与多个表的对应关系。

使用道具 举报

回复
招聘 : 多个岗位招聘
论坛徽章:
33
2010广州亚运会纪念徽章:跆拳道
日期:2010-11-22 15:42:39灰彻蛋
日期:2012-05-16 13:17:56参与WIN7挑战赛纪念
日期:2012-05-24 10:37:35茶鸡蛋
日期:2012-05-28 17:27:32灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02奥运会纪念徽章:帆船
日期:2012-07-10 09:43:29奥运会纪念徽章:足球
日期:2012-08-17 09:17:32奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49奥运会纪念徽章:赛艇
日期:2012-08-20 16:23:58
26#
发表于 2011-8-24 19:33 | 只看该作者
请教yulihua49

有如下sql
select  dept_no,f_findname(emp_id) from dept,emp
这样的sql

用数据模板怎么生成?

就是类似 select 中的列 需要 有 处理的 sql

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
27#
 楼主| 发表于 2011-8-24 19:39 | 只看该作者
原帖由 nannan5000 于 2011-8-24 19:33 发表
请教yulihua49

有如下sql
select  dept_no,f_findname(emp_id) from dept,emp
这样的sql

用数据模板怎么生成?

就是类似 select 中的列 需要 有 处理的 sql

直接法:
T_PkgType dept_emp_tpl[]={
      {CH_INT,sizeof(int),"dept_no",0,-1},
      {CH_CHAR,21,"f_findname(emp_id) fname"},
      {-1,0,"dept,emp","主键"}
};

typedef struct {
      int dept_no;
      char fname[21];
} dept_emp_stu;

另一种是元数据方法,写一个文件,就叫dept_emp.meta吧:

TEMPLATE dept_emp 2
dept_no:=CH_INT
f_findname(emp_id) fname:=CH_CHAR 21
dept,emp\t主键

通过mktpl生成上述内容。

[ 本帖最后由 yulihua49 于 2011-8-24 19:43 编辑 ]

使用道具 举报

回复
招聘 : 多个岗位招聘
论坛徽章:
33
2010广州亚运会纪念徽章:跆拳道
日期:2010-11-22 15:42:39灰彻蛋
日期:2012-05-16 13:17:56参与WIN7挑战赛纪念
日期:2012-05-24 10:37:35茶鸡蛋
日期:2012-05-28 17:27:32灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02奥运会纪念徽章:帆船
日期:2012-07-10 09:43:29奥运会纪念徽章:足球
日期:2012-08-17 09:17:32奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49奥运会纪念徽章:赛艇
日期:2012-08-20 16:23:58
28#
发表于 2011-8-24 19:43 | 只看该作者
如果要实现 sum(emp_id)
是用 sql 实现呢?
还是 中间件把数据都读一遍 自己sum呢?

菜鸟,问题比较幼稚,请见谅~

[ 本帖最后由 nannan5000 于 2011-8-24 19:45 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
29#
 楼主| 发表于 2011-8-24 19:48 | 只看该作者
原帖由 nannan5000 于 2011-8-24 19:43 发表
如果要实现 sum(emp_id)
是用 sql 实现呢?
还是 中间件把数据都读一遍 自己sum呢?

菜鸟,问题比较幼稚,请见谅~

客户端提出请求,服务器解释这个请求。这个请求的数据事先制备模板,程序就很简单了,执行完SQL,结果按约定格式返回客户端。
分析函数、子查询都可以做在模板里。尽可能让数据库干。

TEMPLATE dept_emp 3
dept_no:=CH_INT
f_findname(emp_id) fname:=CH_CHAR 21
sum(emp_id) e_sum:=CH_INT
dept,emp\t主键

每个列的格式:
列表达式 伪列名:=类型 长度 数据格式
列表达式:所有SQL合法的表示都可以。如果是子查询,可以绑定变量。

[ 本帖最后由 yulihua49 于 2011-8-24 20:04 编辑 ]

使用道具 举报

回复
招聘 : 多个岗位招聘
论坛徽章:
33
2010广州亚运会纪念徽章:跆拳道
日期:2010-11-22 15:42:39灰彻蛋
日期:2012-05-16 13:17:56参与WIN7挑战赛纪念
日期:2012-05-24 10:37:35茶鸡蛋
日期:2012-05-28 17:27:32灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02奥运会纪念徽章:帆船
日期:2012-07-10 09:43:29奥运会纪念徽章:足球
日期:2012-08-17 09:17:32奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49奥运会纪念徽章:赛艇
日期:2012-08-20 16:23:58
30#
发表于 2011-8-24 20:03 | 只看该作者
原帖由 yulihua49 于 2011-8-24 19:48 发表

客户端提出请求,服务器解释这个请求。这个请求的数据事先制备模板,程序就很简单了,执行完SQL,结果按约定格式返回客户端。
分析函数、子查询都可以做在模板里。尽可能让数据库干。

TEMPLATE dept_emp 3
dept_no:=CH_INT
f_findname(emp_id) fname:=CH_CHAR 21
sum(emp_id) sum:CH_INT
dept,emp\t主键



正在看您和newkid之前的讨论。
我简单总结下

您是用DTO这类的机制实现了映射标准SQL,然后放到数据库去执行。 中间由中间件或MQ来传递格式化的数据。
前台处理的是struct。


newkid是相当于把struct每个属性都传到存储过程,存储过程来处理最后的业务逻辑(就是取票、锁定票之类的)。



yulihua49 我觉得您的系统完全可以跑在文件系统上,类似自己写个数据库。应该比Oracle能高效。貌似用Oracle挺贵的,用MySQL也能存数。

请指点,谢谢前辈!

您写的包装器很牛,望其项背,像您致敬!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表