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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list