コード例 #1
0
ファイル: json_pack.c プロジェクト: hx71105417/sdbc_linux
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;
	}
}
コード例 #2
0
ファイル: json_pack.c プロジェクト: hx71105417/sdbc_linux
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;
}
コード例 #3
0
ファイル: pack.c プロジェクト: weihualiu/sdbc
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;
}
コード例 #4
0
ファイル: json_pack.c プロジェクト: hx71105417/sdbc_linux
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,"|");
        }
      }
コード例 #5
0
ファイル: pack.c プロジェクト: weihualiu/sdbc
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);
}
コード例 #6
0
ファイル: pack.c プロジェクト: weihualiu/sdbc
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;
}
コード例 #7
0
ファイル: sdbcdao.hpp プロジェクト: hx71105417/sdbc_linux
	int getOne(char *buf,T_PkgType *tpl)
	{
	  return get_one_str(buf,dau.srm.rec,tpl,0);
	}