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

Introduced new enum type restrict_t for BAT access modes.


diffs (200 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
@@ -117,7 +117,7 @@ BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BA
 gdk_return BATextend(BAT *b, BUN newcap) 
__attribute__((__warn_unused_result__));
 void BATfakeCommit(BAT *b);
 gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps, 
BUN n, bool asc, bool nilslast, bool distinct) 
__attribute__((__warn_unused_result__));
-int BATgetaccess(BAT *b);
+restrict_t BATgetaccess(BAT *b);
 PROPrec *BATgetprop(BAT *b, enum prop_t idx);
 gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s, 
BAT *g, BAT *e, BAT *h) __attribute__((__warn_unused_result__));
 const char *BATgroupaggrinit(BAT *b, BAT *g, BAT *e, BAT *s, oid *minp, oid 
*maxp, BUN *ngrpp, BUN *startp, BUN *endp, const oid **candp, const oid 
**candendp);
@@ -167,7 +167,7 @@ BAT *BATsample(BAT *b, BUN n);
 BAT *BATsample_with_seed(BAT *b, BUN n, unsigned seed);
 BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool 
hi, bool anti);
 gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
bool nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
-gdk_return BATsetaccess(BAT *b, int mode);
+gdk_return BATsetaccess(BAT *b, restrict_t mode);
 void BATsetcapacity(BAT *b, BUN cnt);
 void BATsetcount(BAT *b, BUN cnt);
 void BATsetprop(BAT *b, enum prop_t idx, int type, const void *v);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1249,10 +1249,10 @@ bat_iterator(BAT *b)
  * @item BAT *
  * @tab BATmode (BAT *b, int mode)
  * @item BAT *
- * @tab BATsetaccess (BAT *b, int mode)
+ * @tab BATsetaccess (BAT *b, restrict_t mode)
  * @item int
  * @tab BATdirty (BAT *b)
- * @item int
+ * @item restrict_t
  * @tab BATgetaccess (BAT *b)
  * @end multitable
  *
@@ -1292,8 +1292,21 @@ gdk_export gdk_return BATmode(BAT *b, in
 gdk_export gdk_return BATroles(BAT *b, const char *tnme);
 gdk_export void BAThseqbase(BAT *b, oid o);
 gdk_export void BATtseqbase(BAT *b, oid o);
-gdk_export gdk_return BATsetaccess(BAT *b, int mode);
-gdk_export int BATgetaccess(BAT *b);
+
+/* The batRestricted field indicates whether a BAT is readonly.
+ * we have modes: BAT_WRITE  = all permitted
+ *                BAT_APPEND = append-only
+ *                BAT_READ   = read-only
+ * VIEW bats are always mapped read-only.
+ */
+typedef enum {
+       BAT_WRITE,                /* all kinds of access allowed */
+       BAT_READ,                 /* only read-access allowed */
+       BAT_APPEND,               /* only reads and appends allowed */
+} restrict_t;
+
+gdk_export gdk_return BATsetaccess(BAT *b, restrict_t mode);
+gdk_export restrict_t BATgetaccess(BAT *b);
 
 
 #define BATdirty(b)    (!(b)->batCopiedtodisk ||                       \
@@ -1305,10 +1318,6 @@ gdk_export int BATgetaccess(BAT *b);
 #define TRANSIENT              1
 #define LOG_DIR                        2
 
-#define BAT_WRITE              0       /* all kinds of access allowed */
-#define BAT_READ               1       /* only read-access allowed */
-#define BAT_APPEND             2       /* only reads and appends allowed */
-
 #define BATcapacity(b) (b)->batCapacity
 /*
  * @- BAT manipulation
@@ -2533,16 +2542,6 @@ gdk_export void VIEWbounds(BAT *b, BAT *
                }                                                       \
        } while (false)
 
-/* The batRestricted field indicates whether a BAT is readonly.
- * we have modes: BAT_WRITE  = all permitted
- *                BAT_APPEND = append-only
- *                BAT_READ   = read-only
- * VIEW bats are always mapped read-only.
- */
-
-#define BAThrestricted(b) ((b)->batRestricted)
-#define BATtrestricted(b) (VIEWtparent(b) ? 
BBP_cache(VIEWtparent(b))->batRestricted : (b)->batRestricted)
-
 /* the parentid in a VIEW is correct for the normal view. We must
  * correct for the reversed view.
  */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -680,8 +680,9 @@ COLcopy(BAT *b, int tt, bool writable, i
        /* first try case (1); create a view, possibly with different
         * atom-types */
        if (role == b->batRole &&
-           BAThrestricted(b) == BAT_READ &&
-           BATtrestricted(b) == BAT_READ &&
+           b->batRestricted == BAT_READ &&
+           (!VIEWtparent(b) ||
+            BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ) &&
            !writable) {
                bn = VIEWcreate(b->hseqbase, b);
                if (bn == NULL)
@@ -1934,9 +1935,11 @@ BATcheckmodes(BAT *b, bool existing)
 }
 
 gdk_return
-BATsetaccess(BAT *b, int newmode)
+BATsetaccess(BAT *b, restrict_t newmode)
 {
-       int bakmode, bakdirty;
+       restrict_t bakmode;
+       bool bakdirty;
+
        BATcheck(b, "BATsetaccess", GDK_FAIL);
        if (isVIEW(b) && newmode != BAT_READ) {
                if (VIEWreset(b) != GDK_SUCCEED)
@@ -1988,11 +1991,12 @@ BATsetaccess(BAT *b, int newmode)
        return GDK_SUCCEED;
 }
 
-int
+restrict_t
 BATgetaccess(BAT *b)
 {
        BATcheck(b, "BATgetaccess", 0);
-       return b->batRestricted;
+       assert(b->batRestricted != 3); /* only valid restrict_t values */
+       return (restrict_t) b->batRestricted;
 }
 
 /*
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -969,7 +969,9 @@ BATslice(BAT *b, BUN l, BUN h)
 
        /* If the source BAT is readonly, then we can obtain a VIEW
         * that just reuses the memory of the source. */
-       if (BAThrestricted(b) == BAT_READ && BATtrestricted(b) == BAT_READ) {
+       if (b->batRestricted == BAT_READ &&
+           (!VIEWtparent(b) ||
+            BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ)) {
                bn = VIEWcreate(b->hseqbase + low, b);
                if (bn == NULL)
                        return NULL;
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -296,7 +296,7 @@ la_bat_clear(logger *lg, logaction *la)
 
        b = BATdescriptor(bid);
        if (b) {
-               int access = b->batRestricted;
+               restrict_t access = b->batRestricted;
                b->batRestricted = BAT_WRITE;
                BATclear(b, true);
                b->batRestricted = access;
@@ -2986,7 +2986,7 @@ logger_add_bat(logger *lg, BAT *b, const
        log_bid bid = logger_find_bat(lg, name, tpe, id);
        lng lid = (lng) id;
 
-       assert(b->batRestricted > 0 ||
+       assert(b->batRestricted != BAT_WRITE ||
               b == lg->snapshots_bid ||
               b == lg->snapshots_tid ||
               b == lg->dsnapshots ||
diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c
--- a/monetdb5/modules/kernel/bat5.c
+++ b/monetdb5/modules/kernel/bat5.c
@@ -34,7 +34,7 @@
 
 /* set access mode to bat, replacing input with output */
 static BAT *
-setaccess(BAT *b, int mode)
+setaccess(BAT *b, restrict_t mode)
 {
        BAT *bn = b;
 
@@ -613,7 +613,7 @@ str
 BKCsetAccess(bat *res, const bat *bid, const char * const *param)
 {
        BAT *b;
-       int m;
+       restrict_t m;
 
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "bat.setAccess", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
@@ -655,10 +655,6 @@ BKCgetAccess(str *res, const bat *bid)
        case BAT_WRITE:
                *res = GDKstrdup("write");
                break;
-       default:
-               /* cannot happen, just here to help analysis tools */
-               *res = GDKstrdup(str_nil);
-               break;
        }
        BBPunfix(b->batCacheid);
        if(*res == NULL)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to