|
原帖由 yulihua49 于 2011-8-24 15:15 发表 ![]()
服务接口层,与中间件的接口:
这个是SDBC接口,还有TUXEDO接口的,以后再发:
//service层
服务器端应用函数,对JSON的命令进行分析:
- //app层
- int getpage(T_SRV_Var *ctx,char *rqst,JSON_OBJECT result,char *msg)
- {
- int ret;
- INT64 now;
- struct msg_stu app;
- DAU table_DAU;
- JSON_OBJECT json,val;
- if(!msg) {
- return -1 ;
- }
- now=now_sec();
- *msg=0;
- data_init(&app, msg_tpl);
- ShowLog(5,"getpage:%s",rqst);
- //对传入的JSON对象进行拆包
- json=json_tokener_parse(rqst);
- if(!json) {
- sprintf(msg,"getpage:#json 格式错误!#");
- return -1;
- }
- val=json_object_object_get(json,"values");
- ret=json_to_struct(&app,json,msg_tpl);//利用命令解析模板将命令解析到app结构。
- if(!ret){
- json_object_put(json);
- sprintf(msg,"getpage:transfer json error!");
- return -1;
- }
- ShowLog(5,"getpage:%s,ret=%d",msg,ret);
- ret=DAU_init(&table_DAU,ctx->SQL_Connect,app.tablename,0,0);//自动分析表结构,是开销最大的部分。
- if(ret) {
- json_object_put(json);
- sprintf(msg,"getpage:#表名%s不存在!#",app.tablename);
- return -1;
- }
- if(val) {
- DAU_fromJSON(&table_DAU,val);//绑定值装入DAU。
- }
- json_object_put(json);
- if(!strcmp(app.where,"PRIMARY_KEY")) {//要求按主键提取
- char *p;
- p=mk_where(table_DAU.srm.pks,app.where);//模板里的主键
- if(!*app.where) {
- sprintf(msg,"getpage:#table %s:没有主键!",table_DAU.srm.tabname);
- DAU_free(&table_DAU);
- return -2;
- }
- }
- /*分页操作
- *如果page_idx=0&&page_size=0,则不分页,取全部结果集;
- *如果page_idx=0&&page_size=n,则不分页,取n条结果集;
- *如果page_idx=n&&page_size=0,则表示分n页,取1条结果集;
- *如果page_idx=n&&page_size=n,则表示分n页,取n条结果集;
- */
- if(app.page_idx==0) {//不分页的查询
- if(0>=(ret=DAU_select(&table_DAU,app.where,app.page_size))){//柔性代码,生成sql语句。
- sprintf(msg,"getpage:nopage select error:%s",app.where);
- DAU_free(&table_DAU);
- return -3;
- }
- } else {
- if(app.page_size==0) app.page_size=1;
- if(0>=(ret=mk_select(&table_DAU,app.where,app.page_idx,app.page_size))){//生成分页的sql语句。
- sprintf(msg,"getpage:page_idx=%d select page_size=%d msg=%s!",
- app.page_idx,app.page_size,
- app.where);
- DAU_free(&table_DAU);
- return -1;
- }
- }
- ShowLog(5,"getpage:ret=%d,stmt=%s",ret,app.where);
- while(!(ret=DAU_next(&table_DAU))){
- int rn;
- //结果集打成JSON包
- JSON_NEW(json);
- DAU_toJSON(&table_DAU,json,0);
- if(app.page_idx) {
- table_DAU.srm.rp+=net_dispack(&rn,table_DAU.srm.rp,IntType);
- }
- json_object_array_add(result,json);
- }
- DAU_free(&table_DAU);
- return 0;
- }
复制代码
命令解析模板:
- #define JSON_NEW(json) { \
- if(!((json)=json_object_new_object())){ \
- sprintf(msg,"getpage:new json error!"); \
- break; \
- }}
- /*输入结构:{tablename:表名,where:where语句,page_idx:页号,page_size:页长,values:{列名:值,,,}//对where里的bind赋值 */
- static T_PkgType msg_tpl[]={
- {CH_CHAR,1024,"tablename",0,-1},
- {CH_CHAR,4096,"where"},
- {CH_INT,sizeof(int),"page_idx"},
- {CH_INT,sizeof(int),"page_size"},
- {-1,0,0}
- };
- struct msg_stu {
- char tablename[1024];
- char where[4096];
- int page_idx;
- int page_size;
- };
复制代码
[ 本帖最后由 yulihua49 于 2011-8-24 17:43 编辑 ] |
|