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; }
int path_to_inumber(struct unixfilesystem *fs, const char *pathname,uint16_t dirinumber){ struct direntv6 buf; // The pathname is to a file if(plain_name(pathname)){ int success = directory_findname(fs,pathname,dirinumber, &buf); if (success < 0){ return -1; } // Return the inumber return buf.d_inumber; // The pathname is to a directory }else{ // The first directory in the pathname char *dir = first(pathname); int success = directory_findname(fs, dir, dirinumber, &buf); // Check for errors if (success < 0){ return -1; } // The rest of the pathname const char *restOfPath = rest(pathname); dirinumber = buf.d_inumber; free(dir); return path_to_inumber(fs,restOfPath,dirinumber); } }
/* 对选择的列构建update语句,如果choose为空,全部列 ,返回尾部 */ char * SRM_mk_upd_col(SRM *srmp,char *DBOWN,const char *choose,char *stmt) { char *p,*p1; char col_name[49]; T_PkgType *tp; if(!srmp||!stmt) { return stmt; } p=SRM_mk_update(srmp,DBOWN,stmt); p=stpcpy(p,"SET "); p1=(char *)choose; if(p1 && *p1) do { if(!*p1) break; p1=stptok(skipblk(p1),col_name,sizeof(col_name),",|"); *p++ = '$'; p=stpcpy(stpcpy(stpcpy(p,col_name),"=:"),col_name); *p++ = ','; } while (*p1++); else for(tp=srmp->tp; tp->type>=0; tp++) { if(tp->type==CH_CLOB || tp->bindtype & NOINS) continue; p1=(char *)tp->name; p=stpcpy(stpcpy(strtcpy(p,&p1,' '),"=:"),plain_name(tp->name)); *p++ = ','; } *p=0; p[-1]=' '; return p; }
T_PkgType * pkg_getType(const char *key,register T_PkgType *type) { int i; for(i=0;type->type >= 0 ;i++,type++) { if(!strcmp(key,plain_name(type->name))) { break; } } return type; }
static char *mk_date(char *buf,char *name,const char *format) { char *p,*cp; p=(char *)plain_name(name); cp=stpcpy(buf,"TO_CHAR("); if(p==name) cp=stpcpy(cp,name); else //复杂的列表达式 cp+=sprintf(cp,"%.*s",(int)(p-name-1),name); cp=stpcpy(stpcpy(ext_copy(stpcpy(cp,",'"),format),"') "),p); return cp; }
JSON_OBJECT stu_to_json(JSON_OBJECT json,void *data,T_PkgType * typ,const char *choose,char *colidx) { int i,colnum,n; T_PkgType *tp; char buf[100]; const char *cp; if(!json) return json; colnum=set_offset(typ); tp=typ; if(!choose||!*choose) { // 没有选择,全部加入 for(i=0;tp->type>=0;i++,tp++) { if(tp->bindtype & NOSELECT) continue; if(choose&&isnull((char *)data+tp->offset,tp->type)) continue; if(tp->type==CH_STRUCT) { JSON_OBJECT sub=json_object_new_object(); stu_to_json(sub,(char *)data+tp->offset, (T_PkgType *)tp->format,0,0); json_object_object_add(json,plain_name(tp->name),sub); continue; } add_field_to_object(json,data,tp); } return json; } cp=choose; do { char *p; *buf=0; cp=stptok(skipblk((char *)cp),buf,sizeof(buf),",|"); //可以用的分隔符 p=buf; TRIM(p); if(!*p) continue; if(isdigit(*p)) { //数字选择,字段号范围:"1-3,6-11" int ret,beg,end; end=beg=-1; ret=sscanf(buf,"%d - %d",&beg,&end); if(!ret) continue; if(ret==1) end=beg; if(end<beg) end=beg; for(ret=beg;ret<=end;ret++) { if(typ[ret].type==CH_STRUCT) { JSON_OBJECT sub=json_object_new_object(); stu_to_json(sub,(char *)data+typ[ret].offset, (T_PkgType *)typ[ret].format,0,0); json_object_object_add(json,plain_name(typ[ret].name),sub); continue; } add_field_to_object(json,data,&typ[ret]); } } else { //字母,字段名 :"colname1,colname2,..." n=index_col(colidx,colnum,p,typ); if(n<0) continue; if(typ[n].type==CH_STRUCT) { JSON_OBJECT sub=json_object_new_object(); stu_to_json(sub,(char *)data+typ[n].offset, (T_PkgType *)typ[n].format,0,0); json_object_object_add(json,plain_name(typ[n].name),sub); continue; } add_field_to_object(json,data,typ+n); } } while(*cp++); return json; }