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