Changeset: 3c6a37ca8971 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3c6a37ca8971
Modified Files:
        gdk/gdk_atoms.c
        gdk/gdk_logger.c
Branch: msk-type
Log Message:

Implemented logging of msk BATs (untested).


diffs (183 lines):

diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -898,6 +898,30 @@ TYPE##Write(const TYPE *a, stream *s, si
                GDK_SUCCEED : GDK_FAIL;                                 \
 }
 
+static gdk_return
+mskWrite(const msk *a, stream *s, size_t cnt)
+{
+       if (cnt == 0)
+               return GDK_SUCCEED;
+       if (cnt == 1)
+               return mnstr_writeBte(s, (int8_t) *a) ? GDK_SUCCEED : GDK_FAIL;
+       return GDK_FAIL;
+}
+
+static void *
+mskRead(msk *a, stream *s, size_t cnt)
+{
+       int8_t v;
+       if (cnt != 1)
+               return NULL;
+       if (mnstr_readBte(s, &v) != 1)
+               return NULL;
+       if (a == NULL && (a = GDKmalloc(1)) == NULL)
+               return NULL;
+       *a = v != 0;
+       return a;
+}
+
 atom_io(bat, Int, int)
 atom_io(bit, Bte, bte)
 
@@ -1250,8 +1274,8 @@ atomDesc BATatoms[MAXATOMS] = {
                .size = 1,      /* really 1/8 */
                .atomFromStr = (ssize_t (*)(const char *, size_t *, void **, 
bool)) mskFromStr,
                .atomToStr = (ssize_t (*)(char **, size_t *, const void *, 
bool)) mskToStr,
-//             .atomRead = (void *(*)(void *, stream *, size_t)) mskRead,
-//             .atomWrite = (gdk_return (*)(const void *, stream *, size_t)) 
mskWrite,
+               .atomRead = (void *(*)(void *, stream *, size_t)) mskRead,
+               .atomWrite = (gdk_return (*)(const void *, stream *, size_t)) 
mskWrite,
                .atomCmp = (int (*)(const void *, const void *)) mskCmp,
        },
        [TYPE_bte] = {
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -555,25 +555,37 @@ log_read_updates(logger *lg, trans *tr, 
                        BATtseqbase(r, 0);
 
                if (ht == TYPE_void && l->flag == LOG_INSERT) {
-                       lng nr = l->nr;
-                       for (; res == LOG_OK && nr > 0; nr--) {
-                               void *t = rt(tv, lg->log, 1);
-
-                               if (t == NULL) {
-                                       /* see if failure was due to
-                                        * malloc or something less
-                                        * serious (in the current
-                                        * context) */
-                                       if (strstr(GDKerrbuf, "alloc") == NULL)
-                                               res = LOG_EOF;
-                                       else
+                       if (tt == TYPE_msk) {
+                               r->tkey = false;
+                               r->tsorted = false;
+                               r->tnosorted = false;
+                               r->tnonil = true;
+                               r->tnil = false;
+                               if (mnstr_readIntArray(lg->log, Tloc(r, 0), 
(size_t) ((l->nr + 31) / 32)))
+                                       BATsetcount(r, (BUN) l->nr);
+                               else
+                                       res = LOG_ERR;
+                       } else {
+                               lng nr = l->nr;
+                               for (; res == LOG_OK && nr > 0; nr--) {
+                                       void *t = rt(tv, lg->log, 1);
+
+                                       if (t == NULL) {
+                                               /* see if failure was due to
+                                                * malloc or something less
+                                                * serious (in the current
+                                                * context) */
+                                               if (strstr(GDKerrbuf, "alloc") 
== NULL)
+                                                       res = LOG_EOF;
+                                               else
+                                                       res = LOG_ERR;
+                                               break;
+                                       }
+                                       if (BUNappend(r, t, true) != 
GDK_SUCCEED)
                                                res = LOG_ERR;
-                                       break;
+                                       if (t != tv)
+                                               GDKfree(t);
                                }
-                               if (BUNappend(r, t, true) != GDK_SUCCEED)
-                                       res = LOG_ERR;
-                               if (t != tv)
-                                       GDKfree(t);
                        }
                } else {
                        void *(*rh) (ptr, stream *, size_t) = ht == TYPE_void ? 
BATatoms[TYPE_oid].atomRead : BATatoms[ht].atomRead;
@@ -628,19 +640,31 @@ log_read_updates(logger *lg, trans *tr, 
                                                        res = LOG_ERR;
                                        }
                                }
-                               nr = l->nr;
-                               for (; res == LOG_OK && nr > 0; nr--) {
-                                       void *t = rt(tv, lg->log, 1);
-
-                                       if (t == NULL) {
-                                               if (strstr(GDKerrbuf, "malloc") 
== NULL)
-                                                       res = LOG_EOF;
-                                               else
+                               if (tt == TYPE_msk) {
+                                       r->tkey = false;
+                                       r->tsorted = false;
+                                       r->tnosorted = false;
+                                       r->tnonil = true;
+                                       r->tnil = false;
+                                       if (mnstr_readIntArray(lg->log, Tloc(r, 
0), (size_t) ((l->nr + 31) / 32)))
+                                               BATsetcount(r, (BUN) l->nr);
+                                       else
+                                               res = LOG_ERR;
+                               } else {
+                                       nr = l->nr;
+                                       for (; res == LOG_OK && nr > 0; nr--) {
+                                               void *t = rt(tv, lg->log, 1);
+
+                                               if (t == NULL) {
+                                                       if (strstr(GDKerrbuf, 
"malloc") == NULL)
+                                                               res = LOG_EOF;
+                                                       else
+                                                               res = LOG_ERR;
+                                               } else if (BUNappend(r, t, 
true) != GDK_SUCCEED)
                                                        res = LOG_ERR;
-                                       } else if (BUNappend(r, t, true) != 
GDK_SUCCEED)
-                                               res = LOG_ERR;
-                                       if (t != tv)
-                                               GDKfree(t);
+                                               if (t != tv)
+                                                       GDKfree(t);
+                                       }
                                }
                        }
                        GDKfree(hv);
@@ -2839,7 +2863,9 @@ log_delta(logger *lg, BAT *uid, BAT *uva
                        }
 
                        if (ok == GDK_SUCCEED) {
-                               if (uval->ttype > TYPE_void && uval->ttype < 
TYPE_str && !isVIEW(uval)) {
+                               if (uval->ttype == TYPE_msk) {
+                                       ok = mnstr_writeIntArray(lg->log, 
Tloc(uval, 0), (l.nr + 31) / 32) ? GDK_SUCCEED : GDK_FAIL;
+                               } else if (uval->ttype > TYPE_void && 
uval->ttype < TYPE_str && !isVIEW(uval)) {
                                        const void *val = BUNtail(vi, 0);
                                        ok = wt(val, lg->log, (size_t)l.nr);
                                } else {
@@ -2884,9 +2910,21 @@ log_bat(logger *lg, BAT *b, const char *
                    (tpe ? log_write_id(lg, tpe, id) : log_write_string(lg, 
name)) != GDK_SUCCEED)
                        return GDK_FAIL;
 
-               if (b->ttype > TYPE_void &&
-                   b->ttype < TYPE_str &&
-                   !isVIEW(b)) {
+               if (b->ttype == TYPE_msk) {
+                       for (BUN i = b->batInserted;
+                            ok == GDK_SUCCEED && i < b->batCount;
+                            i += 32) {
+                               uint32_t v = 0;
+                               for (BUN j = 0;
+                                    j < 32 && i + j < b->batCount;
+                                    j++)
+                                       v |= (uint32_t) mskGetVal(b, i + j) << 
j;
+                               if (!mnstr_writeInt(lg->log, (int) v))
+                                       ok = GDK_FAIL;
+                       }
+               } else if (b->ttype > TYPE_void &&
+                          b->ttype < TYPE_str &&
+                          !isVIEW(b)) {
                        const void *t = BUNtail(bi, b->batInserted);
 
                        ok = wt(t, lg->log, (size_t)l.nr);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to