Changeset: d34683165815 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d34683165815 Added Files: monetdb5/modules/atoms/Tests/jsonrender.mal monetdb5/modules/atoms/Tests/jsonrender.stable.err monetdb5/modules/atoms/Tests/jsonrender.stable.out Modified Files: monetdb5/modules/atoms/Tests/All monetdb5/modules/atoms/Tests/json00.stable.out monetdb5/modules/atoms/json_atom.c monetdb5/modules/atoms/json_atom.mal Branch: default Log Message:
Handle JSON rendering The rendering functions are prepared for SQL result sets. diffs (truncated from 365 to 300 lines): diff --git a/monetdb5/modules/atoms/Tests/All b/monetdb5/modules/atoms/Tests/All --- a/monetdb5/modules/atoms/Tests/All +++ b/monetdb5/modules/atoms/Tests/All @@ -18,3 +18,4 @@ xml100 json00 json01 json02 +jsonrender diff --git a/monetdb5/modules/atoms/Tests/json00.stable.out b/monetdb5/modules/atoms/Tests/json00.stable.out --- a/monetdb5/modules/atoms/Tests/json00.stable.out +++ b/monetdb5/modules/atoms/Tests/json00.stable.out @@ -61,6 +61,23 @@ function user.main():void; end main; [ true ] [ true ] +[ false ] +[ false ] +[ false ] +[ false ] +[ true ] +[ false ] +[ false ] +[ false ] +[ false ] +[ false ] +[ true ] +[ false ] +[ true ] +[ true ] +[ true ] +[ true ] +[ true ] # 22:41:30 > diff --git a/monetdb5/modules/atoms/Tests/jsonrender.mal b/monetdb5/modules/atoms/Tests/jsonrender.mal new file mode 100644 --- /dev/null +++ b/monetdb5/modules/atoms/Tests/jsonrender.mal @@ -0,0 +1,21 @@ +idx := bat.new(:oid,:int); +bat.append(idx,1); +bat.append(idx,2); +bat.append(idx,3); + +wrd:= bat.new(:oid,:str); +bat.append(wrd,"hello"); +bat.append(wrd,"brave"); +bat.append(wrd,"world"); + +ans:= bat.new(:oid,:bit); +bat.append(ans,true); +bat.append(ans,false); +bat.append(ans,nil:bit); + +io.print(idx,wrd,ans); + +result:=json.renderobject("idx",idx,"wrd",wrd,"ans",ans); +io.print(result); +result:=json.renderarray(idx,wrd,ans); +io.print(result); diff --git a/monetdb5/modules/atoms/Tests/jsonrender.stable.err b/monetdb5/modules/atoms/Tests/jsonrender.stable.err new file mode 100644 --- /dev/null +++ b/monetdb5/modules/atoms/Tests/jsonrender.stable.err @@ -0,0 +1,29 @@ +stderr of test 'jsonrender` in directory 'monetdb5/modules/atoms` itself: + + +# 12:00:48 > +# 12:00:48 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=36117" "--set" "mapi_usock=/var/tmp/mtest-9227/.s.monetdb.36117" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/export/scratch1/mk/current//Linux/var/MonetDB/mTests_monetdb5_modules_atoms" "jsonrender.mal" +# 12:00:48 > + +# builtin opt gdk_dbpath = /export/scratch1/mk/current//Linux/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = yes +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 36117 +# cmdline opt mapi_usock = /var/tmp/mtest-9227/.s.monetdb.36117 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /export/scratch1/mk/current//Linux/var/MonetDB/mTests_monetdb5_modules_atoms + +# 12:00:49 > +# 12:00:49 > "Done." +# 12:00:49 > + diff --git a/monetdb5/modules/atoms/Tests/jsonrender.stable.out b/monetdb5/modules/atoms/Tests/jsonrender.stable.out new file mode 100644 --- /dev/null +++ b/monetdb5/modules/atoms/Tests/jsonrender.stable.out @@ -0,0 +1,53 @@ +stdout of test 'jsonrender` in directory 'monetdb5/modules/atoms` itself: + + +# 12:00:48 > +# 12:00:48 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=36117" "--set" "mapi_usock=/var/tmp/mtest-9227/.s.monetdb.36117" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/export/scratch1/mk/current//Linux/var/MonetDB/mTests_monetdb5_modules_atoms" "jsonrender.mal" +# 12:00:48 > + +# MonetDB 5 server v11.16.0 +# This is an unreleased version +# Serving database 'mTests_monetdb5_modules_atoms', using 8 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked +# Found 15.629 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2013 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://vienna.ins.cwi.nl:36117/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-9227/.s.monetdb.36117 +# MonetDB/GIS module loaded +# MonetDB/JAQL module loaded +# MonetDB/SQL module loaded +function user.main():void; + idx := bat.new(:oid,:int); + bat.append(idx,1); + bat.append(idx,2); + bat.append(idx,3); + wrd := bat.new(:oid,:str); + bat.append(wrd,"hello"); + bat.append(wrd,"brave"); + bat.append(wrd,"world"); + ans := bat.new(:oid,:bit); + bat.append(ans,true); + bat.append(ans,false); + bat.append(ans,nil:bit); + io.print(idx,wrd,ans); + result := json.renderobject("idx",idx,"wrd",wrd,"ans",ans); + io.print(result); + result := json.renderarray(idx,wrd,ans); + io.print(result); +end main; +#-----------------------------------------# +# h t t t # name +# void int str bit # type +#-----------------------------------------# +[ 0@0, 1, "hello", true ] +[ 1@0, 2, "brave", false ] +[ 2@0, 3, "world", nil ] +[ "[{\"idx\":1,\"wrd\":\"hello\",\"ans\":true},{\"idx\":2,\"wrd\":\"brave\",\"ans\":false},{\"idx\":3,\"wrd\":\"world\",\"ans\":null}]" ] +[ "[[1,\"hello\",true],[2,\"brave\",false],[3,\"world\",null]]" ] + +# 12:00:49 > +# 12:00:49 > "Done." +# 12:00:49 > + diff --git a/monetdb5/modules/atoms/json_atom.c b/monetdb5/modules/atoms/json_atom.c --- a/monetdb5/modules/atoms/json_atom.c +++ b/monetdb5/modules/atoms/json_atom.c @@ -112,7 +112,7 @@ str JSONisvalid(int *ret, json *j) *ret = 1; if ( msg){ *ret = 0; - return msg; + GDKfree(msg); } return MAL_SUCCEED; } @@ -745,62 +745,176 @@ wrapup:; static BAT **JSONargumentlist(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ - int i, error = 0, error2=0; + int i, error = 0, error2=0, bats=0; BUN cnt = 0; BAT **bl; bl = (BAT**) GDKzalloc(sizeof(*bl) * pci->argc); for( i = pci->retc; i<pci->argc; i++) if (isaBatType(getArgType(mb,pci,i))){ + bats++; bl[i] = BATdescriptor(stk->stk[getArg(pci,i)].val.bval); if ( bl[i] == 0) error++; error2 |= (cnt > 0 &&BATcount(bl[i]) != cnt); cnt = BATcount(bl[i]); } - if ( error + error2){ + if ( error + error2 || bats== 0){ GDKfree(bl); bl = 0; } return bl; } +static +str JSONrenderRowObject(BAT **bl, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, BUN idx) +{ + int i,tpe; + char *row,*name=0,*val=0; + int len,lim,l; + void *p; + BATiter bi; + + row = (char *) GDKmalloc( lim = BUFSIZ); + row[0]='{'; + row[1]=0; + len =1; + val = (char *) GDKmalloc( BUFSIZ); + for( i = pci->retc; i < pci->argc; i+=2){ + name = stk->stk[getArg(pci,i)].val.sval; + bi = bat_iterator(bl[i+1]); + p = BUNtail(bi, BUNfirst(bl[i+1])+idx); + tpe= getTailType(getArgType(mb,pci,i+1)); + ATOMformat( tpe, p, &val); + if( strncmp(val,"nil",3) == 0) + strcpy(val,"null"); + l = strlen(name) + strlen(val); + if (l > lim-len) + row= (char*) GDKrealloc(row, lim += BUFSIZ); + snprintf(row+len,lim-len,"\"%s\":%s,", name, val); + len += l+4; + } + if ( row[1]) + row[len-1]='}'; + else{ + row[1]='}'; + row[2]=0; + } + GDKfree(val); + return row; +} + str JSONrenderobject(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { BAT **bl; - char *result; - int i; + char *result, *row; + int i,len,lim,l; str *ret; + BUN j,cnt; (void ) cntxt; bl = JSONargumentlist(mb,stk,pci); if ( bl == 0) - throw(MAL,"json.objectrender","non-aligned BAT sizes"); + throw(MAL,"json.renderobject","Non-aligned BAT sizes"); for( i = pci->retc; i < pci->argc; i+=2) if ( getArgType(mb,pci,i) != TYPE_str) - throw(MAL,"json.renderobject","keys missing"); + throw(MAL,"json.renderobject","Keys missing"); - result = (char *) GDKmalloc(BUFSIZ); - for( i = pci->retc; i < pci->argc; i++) - if ( getArgType(mb,pci,i) == TYPE_str){ - } else { + cnt = BATcount(bl[pci->retc+1]); + result = (char *) GDKmalloc( lim = BUFSIZ); + result[0]='['; + result[1]=0; + len =1; + + for( j =0; j< cnt; j++){ + row = JSONrenderRowObject(bl,mb,stk,pci,j); + l =strlen(row); + if (l +2 > lim-len) + row= (char*) GDKrealloc(row, lim = ((int)cnt * l) <= lim? (int)cnt*l: lim+BUFSIZ); + strncpy(result+len,row, l+1); + GDKfree(row); + len +=l; + result[len++]=','; + result[len]=0; } + result[len-1]=']'; ret = (str *) getArgReference(stk,pci,0); *ret = result; return MAL_SUCCEED; } +static +str JSONrenderRowArray(BAT **bl, MalBlkPtr mb, InstrPtr pci, BUN idx) +{ + int i,tpe; + char *row,*val=0; + int len,lim,l; + void *p; + BATiter bi; + + row = (char *) GDKmalloc( lim = BUFSIZ); + row[0]='['; + row[1]=0; + len =1; + val = (char *) GDKmalloc( BUFSIZ); + for( i = pci->retc; i < pci->argc; i++){ + bi = bat_iterator(bl[i]); + p = BUNtail(bi, BUNfirst(bl[i])+idx); + tpe= getTailType(getArgType(mb,pci,i)); + ATOMformat( tpe, p, &val); + if( strncmp(val,"nil",3) == 0) + strcpy(val,"null"); + l = strlen(val); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list