Changeset: 1c878a97ede6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1c878a97ede6
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_batop.c
Branch: default
Log Message:

Improved property maintenance functions.


diffs (125 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -161,6 +161,7 @@ BAT *BATproject(BAT *l, BAT *r);
 BAT *BATprojectchain(BAT **bats);
 gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, bool li, bool hi, BUN estimate) 
__attribute__((__warn_unused_result__));
 gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bool force) 
__attribute__((__warn_unused_result__));
+void BATrmprop(BAT *b, int idx);
 gdk_return BATroles(BAT *b, const char *tnme);
 BAT *BATsample(BAT *b, BUN n);
 BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool 
hi, bool anti);
@@ -168,7 +169,7 @@ gdk_return BATsemijoin(BAT **r1p, BAT **
 gdk_return BATsetaccess(BAT *b, int mode);
 void BATsetcapacity(BAT *b, BUN cnt);
 void BATsetcount(BAT *b, BUN cnt);
-void BATsetprop(BAT *b, int idx, int type, void *v);
+void BATsetprop(BAT *b, int idx, int type, const void *v);
 BAT *BATslice(BAT *b, BUN low, BUN high);
 gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, BAT *o, 
BAT *g, bool reverse, bool stable) __attribute__((__warn_unused_result__));
 gdk_return BATstr_group_concat(ValPtr res, BAT *b, BAT *s, bool skip_nils, 
bool abort_on_error, bool nil_if_empty, const str separator);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2688,7 +2688,8 @@ gdk_export void VIEWbounds(BAT *b, BAT *
 
 gdk_export void PROPdestroy(PROPrec *p);
 gdk_export PROPrec *BATgetprop(BAT *b, int idx);
-gdk_export void BATsetprop(BAT *b, int idx, int type, void *v);
+gdk_export void BATsetprop(BAT *b, int idx, int type, const void *v);
+gdk_export void BATrmprop(BAT *b, int idx);
 
 /*
  * @- BAT relational operators
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -563,8 +563,7 @@ BATfree(BAT *b)
        if (b->tident && !default_ident(b->tident))
                GDKfree(b->tident);
        b->tident = BATstring_t;
-       if (b->tprops)
-               PROPdestroy(b->tprops);
+       PROPdestroy(b->tprops);
        b->tprops = NULL;
        HASHfree(b);
        IMPSfree(b);
@@ -588,8 +587,7 @@ BATdestroy(BAT *b)
        b->tident = BATstring_t;
        if (b->tvheap)
                GDKfree(b->tvheap);
-       if (b->tprops)
-               PROPdestroy(b->tprops);
+       PROPdestroy(b->tprops);
        GDKfree(b);
 }
 
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1857,8 +1857,7 @@ PROPdestroy(PROPrec *p)
 
        while (p) {
                n = p->next;
-               if (p->v.vtype == TYPE_str)
-                       GDKfree(p->v.val.sval);
+               VALclear(&p->v);
                GDKfree(p);
                p = n;
        }
@@ -1878,22 +1877,47 @@ BATgetprop(BAT *b, int idx)
 }
 
 void
-BATsetprop(BAT *b, int idx, int type, void *v)
+BATsetprop(BAT *b, int idx, int type, const void *v)
 {
-       ValRecord vr;
        PROPrec *p = BATgetprop(b, idx);
 
-       if (p == NULL &&
-           (p = (PROPrec *) GDKmalloc(sizeof(PROPrec))) != NULL) {
+       if (p == NULL) {
+               if ((p = (PROPrec *) GDKmalloc(sizeof(PROPrec))) == NULL) {
+                       /* properties are hints, so if we can't create
+                        * one we ignore the error */
+                       return;
+               }
                p->id = idx;
                p->next = b->tprops;
                p->v.vtype = 0;
                b->tprops = p;
+       } else {
+               VALclear(&p->v);
        }
-       if (p) {
-               VALset(&vr, type, v);
-               VALcopy(&p->v, &vr);
-               b->batDirtydesc = true;
+       if (VALinit(&p->v, type, v) == NULL) {
+               /* failed to initialize, so remove property */
+               BATrmprop(b, idx);
+       }
+       b->batDirtydesc = true;
+}
+
+void
+BATrmprop(BAT *b, int idx)
+{
+       PROPrec *prop = b->tprops, *prev = NULL;
+
+       while (prop) {
+               if (prop->id == idx) {
+                       if (prev)
+                               prev->next = prop->next;
+                       else
+                               b->tprops = prop->next;
+                       VALclear(&prop->v);
+                       GDKfree(prop);
+                       return;
+               }
+               prev = prop;
+               prop = prop->next;
        }
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to