static void add_field_to_object(JSON_OBJECT json,void *data,T_PkgType *typ) { char buf[50], *cp,*p; cp=data; switch(typ->type&127) { case CH_BYTE: cp=malloc((typ->len<<1)+1); get_one_str(cp,data,typ,0); json_object_object_add(json,plain_name(typ->name),json_object_new_string(cp)); free(cp); break; case CH_INT: case CH_LONG: case CH_SHORT: case CH_TINY: case CH_INT64: case CH_DOUBLE: case CH_FLOAT: get_one_str(buf,data,typ,0); json_object_object_add(json,plain_name(typ->name),json_object_new_string(buf)); break; case CH_CLOB: p=*(char **)(cp+typ->offset); if(p) json_object_object_add(json,plain_name(typ->name),json_object_new_string(p)); break; default: json_object_object_add(json,plain_name(typ->name),json_object_new_string(cp+typ->offset)); break; } }
int json_toStr(char *buf,JSON_OBJECT json,T_PkgType *tp) { char *p,*p1; int i; T_PkgType *typ,Char_Type[2]; if(!buf || !json) return 0; Char_Type[0].type=CH_CHAR; Char_Type[0].len=-1; Char_Type[1].len=0; Char_Type[0].offset=0; Char_Type[1].offset=-1; p=buf; typ=tp; for(i=0;typ->type >= 0;i++,typ++) { if(typ->bindtype & NOSELECT) continue; if(typ->type == CH_STRUCT) { JSON_OBJECT val=json_object_object_get(json,plain_name(typ->name)); if(!val) continue; p+=json_toStr(p,val,(T_PkgType *)typ->format); continue; } p1=json_get_string(json,plain_name(typ->name)); if(p1) p+=get_one_str(p,p1,Char_Type,'|'); // 组串时需要转义 *p++ = '|'; *p=0; } return p-buf; }
char *getitem_idx(char *buf,void *data,T_PkgType *pkg_type,const char *key,const char *colidx,int colnum) { int k; if(pkg_type->offset<0) set_offset(pkg_type); k=index_col(colidx,colnum,key,pkg_type); if(k<0) return 0; k=get_one_str(buf,data,pkg_type+k,0); return buf+k; }
char * json_to_sdbc(char *tmp,JSON_OBJECT json) { T_PkgType Char_Type[2]; char *p1; char *cp=tmp; *tmp=0; if(!json) return tmp; Char_Type[0].type=CH_CHAR; Char_Type[0].len=-1; Char_Type[1].len=0; Char_Type[0].offset=0; Char_Type[1].offset=-1; *cp=0; { json_object_object_foreach(json, key, val) { p1= (char *)json_object_get_string(val); //取原始串 if(p1) { cp+=get_one_str(cp,p1,Char_Type,'|'); // 组串时需要转义 *cp++ = '|'; *cp=0; } else cp+=sprintf(cp,"|"); } }
int pkg_pack(char *buf,void *net_struct,T_PkgType *pkg_type,char delimit) { char *cp; register char *cp1; register T_PkgType *typ; cp=buf; if(!cp)return -1; cp1=cp; typ=pkg_type; if(typ->offset<0) set_offset(pkg_type);// at netvar.c for(;typ->type>-1;typ++) { if(typ->bindtype&NOSELECT) continue; if(typ->type==CH_STRUCT) { cp1+=pkg_pack(cp1,(char *)net_struct+typ->offset,(T_PkgType *)typ->format,delimit); continue; } cp1+=get_one_str(cp1,net_struct,typ,delimit); *cp1++=delimit; *cp1=0; } return (cp1-cp); }
int get_one_str(char *buf,void *data,T_PkgType *typ,char CURDLM) { register char *cp1,*cp2; int cnt,J,len; char datebuf[31]; char *sp; //short iTiny; T_PkgType Char_Type[2]; cp1=buf; *cp1=0; cnt=0; cp2 = (char *)data+typ->offset; sp=cp2; if(isnull(cp2,typ->type)) return cnt; switch(typ->type) { case CH_BYTE: cnt=b2h(cp1,cp2,typ->len); break; case CH_CLOB: Char_Type[0].type=CH_CHAR; Char_Type[0].len=-1; Char_Type[0].offset=0; Char_Type[1].type=-1; Char_Type[1].len=0; J=get_one_str(buf,*(char **)cp2,Char_Type,CURDLM); cnt += J; break; case CH_DATE: case CH_CNUM: case CH_CHAR: len=(typ->len>0)?typ->len-1:strlen(cp2); for(J=0;J<len&&*cp2;J++,cnt++) { if(!CURDLM) goto norm; switch(*cp2) { case ESC_CHAR: if(cp2>sp && GBK_flag && firstcc((unsigned char *)sp,(unsigned char *)cp2-1)) goto norm; *cp1++=*cp2; *cp1++=*cp2++; cnt++; break; case '\n': if(cp2>sp && firstcc((unsigned char *)sp,(unsigned char *)cp2-1)) cp1[-1]&=0x7f; *cp1++=ESC_CHAR; *cp1++='n'; cp2++; cnt++; break; default: if(*cp2==CURDLM) { if(cp2>sp && GBK_flag && firstcc((unsigned char *)sp,(unsigned char *)cp2-1)) goto norm; *cp1++=ESC_CHAR; *cp1++='G'; cp2++; cnt++; break; } norm: *cp1++=*cp2++; break; } } *cp1=0; if(cp2>sp) { if(firstcc((unsigned char *)sp,(unsigned char *)cp2-1)) cp1[-1] &= 0x7f; } break; case CH_FLOAT: if(!typ->format) cnt=sprintf(cp1,"%g", (double)*(float *)cp2); else cnt=sprintf(cp1,typ->format,(double)*(float *)cp2); break; case CH_DOUBLE: if(!typ->format) cnt=sprintf(cp1,"%g", *(double *)cp2); else cnt=sprintf(cp1,typ->format,*(double *)cp2); break; case CH_LDOUBLE: if(!typ->format) cnt=sprintf(cp1,"%Lg", *(long double *)cp2); else cnt=sprintf(cp1,typ->format,*(long double *)cp2); break; case CH_TINY: if(typ->format) cnt=sprintf(cp1,typ->format,255&*cp2); else cnt=itoStr((int)(*cp2),cp1)-cp1; break; case CH_SHORT: if(typ->format) cnt=sprintf(cp1,typ->format,0XFFFF&*(short *)cp2); else cnt=itoStr((int)(*(short *)cp2),cp1)-cp1; break; case CH_INT: if(typ->format) cnt=sprintf(cp1,typ->format,*(int *)cp2); else cnt=itoStr(*(int *)cp2,cp1)-cp1; break; case CH_LONG: if(typ->format) cnt=sprintf(cp1,typ->format,*(long *)cp2); else cnt=lltoStr((INT64)(*(long *)cp2),cp1)-cp1; break; case CH_INT64: if(typ->format) cnt=sprintf(cp1,typ->format,*(INT64 *)cp2); else cnt=lltoStr(*(INT64 *)cp2,cp1)-cp1; break; case CH_CJUL: case CH_JUL: if(typ->format) { rjultostrfmt(datebuf,*(int *)cp2, typ->format); } else { rjultostrfmt(datebuf,*(int *)cp2, "YYYYMMDD"); } cnt=sprintf(cp1,"%s",datebuf); break; case CH_MINUTS: case CH_CMINUTS: if(typ->format) { rminstrfmt(datebuf,*(INT4 *)cp2,typ->format); } else rminstr(datebuf,*(INT4 *)cp2); cnt=sprintf(cp1,"%s",datebuf); break; case CH_TIME: case CH_CTIME: if(typ->format) { rsecstrfmt(datebuf,*(INT64 *)cp2,typ->format); } else rsecstrfmt(datebuf,*(INT64 *)cp2,"YYYYMMDDHH24MISS"); cnt=sprintf(cp1,"%s",datebuf); break; case CH_USEC: if(typ->format) { rusecstrfmt(datebuf,*(INT64 *)cp2,typ->format); } else rusecstrfmt(datebuf,*(INT64 *)cp2,"YYYYMMDDHH24MISS.FF6"); cnt=sprintf(cp1,"%s",datebuf); break; default: break; } return cnt; }
int getOne(char *buf,T_PkgType *tpl) { return get_one_str(buf,dau.srm.rec,tpl,0); }