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