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

Reply via email to