コード例 #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
ファイル: pathname.c プロジェクト: JavierPalomares90/CS110
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);
	}
	
}
コード例 #4
0
ファイル: SRM.c プロジェクト: hx71105417/sdbc_linux
/* 对选择的列构建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;
}
コード例 #5
0
ファイル: pack.c プロジェクト: weihualiu/sdbc
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;
}
コード例 #6
0
ファイル: mkfield.c プロジェクト: hx71105417/sdbc_linux
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;
}
コード例 #7
0
ファイル: json_pack.c プロジェクト: hx71105417/sdbc_linux
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;
}