Changeset: 1b09c24fd64f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b09c24fd64f
Modified Files:
        monetdb5/modules/mal/remote.mx
Branch: default
Log Message:

remote.get: allow binary get of simple head types

Since we will be facing non-dense OID heads next to VOID heads, also
transfer the head if it is a non-varsized type.  This allows to ship
intermediates for instance.


diffs (98 lines):

diff --git a/monetdb5/modules/mal/remote.mx b/monetdb5/modules/mal/remote.mx
--- a/monetdb5/modules/mal/remote.mx
+++ b/monetdb5/modules/mal/remote.mx
@@ -649,7 +649,7 @@
                        rt, ident);
        GDKfree(rt);
 
-       if (isaBatType(rtype) && (localtype == 0 || localtype != c->type || 
(getHeadType(rtype) != TYPE_void && getHeadType(rtype) != TYPE_oid)))
+       if (isaBatType(rtype) && (localtype == 0 || localtype != c->type || 
(ATOMvarsized(getHeadType(rtype)))))
        {
                int h, t, s;
                ptr l, r;
@@ -1201,6 +1201,7 @@
 {
        int bid = *(int *)getArgReference(stk, pci, 1);
        BAT *b = BBPquickdesc(bid, FALSE);
+       char sendhead = 0;
 
        (void)mb;
        (void)stk;
@@ -1208,30 +1209,37 @@
 
        if (b == NULL)
                throw(MAL, "remote.bincopyto", RUNTIME_OBJECT_UNDEFINED);
-       if (!(b->htype == TYPE_void || (b->htype == TYPE_oid && b->H->dense)))
-               throw(ILLARG, "remote.bincopyto", "only void-headed BATs are 
supported");
+       if (b->hvarsized)
+               throw(ILLARG, "remote.bincopyto", "varsized-headed BATs are not 
supported");
 
        BBPincref(bid, FALSE);
 
+       sendhead = b->htype != TYPE_void && (b->htype != TYPE_oid || 
!b->H->dense);
+
        mnstr_printf(cntxt->fdout, /*JSON*/"{"
                        "\"version\":1,"
                        "\"htype\":%d,"
                        "\"ttype\":%d,"
                        "\"seqbase\":" OIDFMT ","
                        "\"size\":" SZFMT ","
+                       "\"headsize\":" SZFMT ","
                        "\"tailsize\":" SZFMT ","
                        "\"theapsize\":" SZFMT
                        "}\n",
-                       TYPE_void,
+                       sendhead ? b->htype : TYPE_void,
                        b->ttype,
                        b->hseqbase == oid_nil ? 0 : b->hseqbase,
                        b->batCount,
+                       sendhead ? b->batCount * Hsize(b) : 0,
                        b->batCount * Tsize(b),
-                       b->tvarsized ? b->T->vheap->free : 0
+                       b->tvarsized && b->batCount > 0 ? b->T->vheap->free : 0
                        );
+       if (sendhead)
+               mnstr_write(cntxt->fdout, /* head */
+                               Hloc(b, BUNfirst(b)), b->batCount * Hsize(b), 
1);
        mnstr_write(cntxt->fdout, /* tail */
                        Tloc(b, BUNfirst(b)), b->batCount * Tsize(b), 1);
-       if (b->tvarsized)
+       if (b->batCount > 0 && b->tvarsized)
                mnstr_write(cntxt->fdout, /* theap */
                                Tbase(b), b->T->vheap->free, 1);
        /* flush is done by the calling environment (MAL) */
@@ -1249,6 +1257,7 @@
        int Ttype;
        oid seqbase;
        size_t size;
+       size_t headsize;
        size_t tailsize;
        size_t theapsize;
 } binbat;
@@ -1256,7 +1265,7 @@
 static inline str
 RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in)
 {
-       binbat bb = { 0, 0, 0, 0, 0, 0 };
+       binbat bb = { 0, 0, 0, 0, 0, 0, 0 };
        char *nme = NULL;
        char *val = NULL;
        char tmp;
@@ -1304,6 +1313,8 @@
                                        bb.seqbase = (oid)atol(val);
                                } else if (strcmp(nme, "size") == 0) {
                                        bb.size = atol(val);
+                               } else if (strcmp(nme, "headsize") == 0) {
+                                       bb.headsize = atol(val);
                                } else if (strcmp(nme, "tailsize") == 0) {
                                        bb.tailsize = atol(val);
                                } else if (strcmp(nme, "theapsize") == 0) {
@@ -1325,6 +1336,8 @@
        if (bb.size > 0 && bb.Ttype == TYPE_str)
                b->T->width = bb.tailsize / bb.size;
 
+       if (bb.headsize > 0)
+               mnstr_read(in, b->H->heap.base, bb.headsize, 1);
        mnstr_read(in, b->T->heap.base, bb.tailsize, 1);
        b->batCount = bb.size;
        if (bb.theapsize > 0) {
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to