Changeset: daf0c86e2386 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/daf0c86e2386
Modified Files:
        common/utils/copybinary_support.h
        sql/backends/monet5/sql_bincopyconvert.c
        sql/backends/monet5/sql_bincopyconvert.h
        sql/backends/monet5/sql_bincopyfrom.c
Branch: copyintobinary
Log Message:

Refactor binary loading to prepare for the arrival of binary dumping


diffs (truncated from 511 to 300 lines):

diff --git a/common/utils/copybinary_support.h 
b/common/utils/copybinary_support.h
--- a/common/utils/copybinary_support.h
+++ b/common/utils/copybinary_support.h
@@ -86,6 +86,40 @@ uhge copy_binary_byteswap128(uhge value)
 }
 #endif
 
+static inline copy_binary_date
+copy_binary_byteswap_date(copy_binary_date value)
+{
+       return (copy_binary_date) {
+               .day = value.day,
+               .month = value.month,
+               .year = copy_binary_byteswap16(value.year),
+       };
+}
+
+static inline copy_binary_time
+copy_binary_byteswap_time(copy_binary_time value)
+{
+       return (copy_binary_time) {
+               .ms = copy_binary_byteswap32(value.ms),
+               .seconds = value.seconds,
+               .minutes = value.minutes,
+               .hours = value.hours,
+               .padding = value.padding,
+       };
+}
+
+static inline copy_binary_timestamp
+copy_binary_byteswap_timestamp(copy_binary_timestamp value)
+{
+       return (copy_binary_timestamp) {
+               .time = copy_binary_byteswap_time(value.time),
+               .date = copy_binary_byteswap_date(value.date),
+       };
+}
+
+
+
+
 // These macros are used to convert a value in-place.
 // This makes it possible to also convert timestamp structs.
 
diff --git a/sql/backends/monet5/sql_bincopyconvert.c 
b/sql/backends/monet5/sql_bincopyconvert.c
--- a/sql/backends/monet5/sql_bincopyconvert.c
+++ b/sql/backends/monet5/sql_bincopyconvert.c
@@ -17,168 +17,150 @@
 #include "mal_interpreter.h"
 
 static str
-convert_bte(void *start, void *end, bool byteswap)
-{
-       (void)start;
-       (void)end;
-       (void)byteswap;
-
-       return MAL_SUCCEED;
-}
-
-static str
-convert_bit(void *start, void *end, bool byteswap)
+convert_bit(void *dst_, void *src_, size_t count, bool byteswap)
 {
        (void)byteswap;
-       unsigned char *e = end;
-       for (unsigned char *p = start; p < e; p++) {
-               int b = *p;
-               if (b > 1)
-                       throw(SQL, "convert_bit", SQLSTATE(22003) "invalid 
boolean byte value: %d", b);
+       unsigned char *dst = dst_;
+       const unsigned char *src = src_;
+
+       for (size_t i = 0; i < count; i++) {
+               if (*src > 1)
+                       throw(SQL, "convert_bit", SQLSTATE(22003) "invalid 
boolean byte value: %d", *src);
+               *dst++ = *src++;
        }
        return MAL_SUCCEED;
 }
 
 static str
-convert_sht(void *start, void *end, bool byteswap)
+convert_sht(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       if (byteswap)
-               for (sht *p = start; p < (sht*)end; p++)
-                       copy_binary_convert16(p);
-
+       assert(byteswap); // otherwise, why call us?
+       sht *dst = dst_;
+       const sht *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap16(*src++);
        return MAL_SUCCEED;
 }
 
 static str
-convert_int(void *start, void *end, bool byteswap)
+convert_int(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       if (byteswap)
-               for (int *p = start; p < (int*)end; p++)
-                       copy_binary_convert32(p);
-
+       assert(byteswap); // otherwise, why call us?
+       int *dst = dst_;
+       const int *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap32(*src++);
        return MAL_SUCCEED;
 }
 
 static str
-convert_lng(void *start, void *end, bool byteswap)
+convert_lng(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       if (byteswap)
-               for (lng *p = start; p < (lng*)end; p++)
-                       copy_binary_convert64(p);
-
+       assert(byteswap); // otherwise, why call us?
+       lng *dst = dst_;
+       const lng *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap64(*src++);
        return MAL_SUCCEED;
 }
 
 #ifdef HAVE_HGE
 static str
-convert_hge(void *start, void *end, bool byteswap)
+convert_hge(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       if (byteswap)
-               for (hge *p = start; p < (hge*)end; p++)
-                       copy_binary_convert128(p);
-
+       assert(byteswap); // otherwise, why call us?
+       hge *dst = dst_;
+       const hge *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap128(*src++);
        return MAL_SUCCEED;
 }
 #endif
 
 static str
-convert_uuid(void *start, void *end, bool byteswap)
+convert_flt(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       (void)byteswap;
-       size_t nbytes = (char*)end - (char*)start;
-       (void)nbytes; assert(nbytes % 16 == 0);
+       // Verify that size and alignment requirements of flt do not exceed int
+       assert(sizeof(uint32_t) == sizeof(flt));
+       assert(sizeof(struct { char dummy; uint32_t ui; }) >= sizeof(struct { 
char dummy; flt f; }));
 
+       assert(byteswap); // otherwise, why call us?
+       int *dst = dst_;
+       const int *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap32(*src++);
        return MAL_SUCCEED;
 }
 
 static str
-convert_flt(void *start, void *end, bool byteswap)
+convert_dbl(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       // Slightly dodgy pointer conversions here
-       assert(sizeof(uint32_t) == sizeof(flt));
-       assert(sizeof(struct { char dummy; uint32_t ui; }) >= sizeof(struct { 
char dummy; flt f; }));
-
-       if (byteswap)
-               for (uint32_t *p = start; (void*)p < end; p++)
-                       copy_binary_convert32(p);
-
-       return MAL_SUCCEED;
-}
-
-static str
-convert_dbl(void *start, void *end, bool byteswap)
-{
-       // Slightly dodgy pointer conversions here
+       // Verify that size and alignment requirements of dbl do not exceed lng
        assert(sizeof(uint64_t) == sizeof(dbl));
        assert(sizeof(struct { char dummy; uint64_t ui; }) >= sizeof(struct { 
char dummy; dbl f; }));
 
-
-       if (byteswap)
-               for (uint64_t *p = start; (void*)p < end; p++)
-                       copy_binary_convert64(p);
-
+       assert(byteswap); // otherwise, why call us?
+       lng *dst = dst_;
+       const lng *src = src_;
+       for (size_t i = 0; i < count; i++)
+               *dst++ = copy_binary_byteswap64(*src++);
        return MAL_SUCCEED;
 }
 
 
 static str
-convert_date(void *dst_start, void *dst_end, void *src_start, void *src_end, 
bool byteswap)
+convert_date(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       date *dst = (date*)dst_start;
-       date *dst_e = (date*)dst_end;
-       copy_binary_date *src = (copy_binary_date*)src_start;
-       copy_binary_date *src_e = (copy_binary_date*)src_end;
-       (void)dst_e; assert(dst_e - dst == src_e - src);
+       date *dst = dst_;
+       copy_binary_date *src = src_;
 
-       for (; src < src_e; src++) {
-               if (byteswap)
-                       copy_binary_convert_date(src);
-               date value = date_create(src->year, src->month, src->day);
+       for (size_t i = 0; i < count; i++) {
+               copy_binary_date incoming;
+               if (!byteswap)
+                       incoming = *src++;
+               else
+                       incoming = copy_binary_byteswap_date(*src++);
+               date value = date_create(incoming.year, incoming.month, 
incoming.day);
                *dst++ = value;
        }
-
        return MAL_SUCCEED;
 }
 
 static str
-convert_time(void *dst_start, void *dst_end, void *src_start, void *src_end, 
bool byteswap)
+convert_time(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       (void)byteswap;
-       daytime *dst = (daytime*)dst_start;
-       daytime *dst_e = (daytime*)dst_end;
-       copy_binary_time *src = (copy_binary_time*)src_start;
-       copy_binary_time *src_e = (copy_binary_time*)src_end;
-       (void)dst_e; assert(dst_e - dst == src_e - src);
+       daytime *dst = dst_;
+       copy_binary_time *src = src_;
 
-       for (; src < src_e; src++) {
-               if (byteswap)
-                       copy_binary_convert_time(src);
-               daytime value = daytime_create(src->hours, src->minutes, 
src->seconds, src->ms);
+       for (size_t i = 0; i < count; i++) {
+               copy_binary_time incoming;
+               if (!byteswap)
+                       incoming = *src++;
+               else
+                       incoming = copy_binary_byteswap_time(*src++);
+               daytime value = daytime_create(incoming.hours, 
incoming.minutes, incoming.seconds, incoming.ms);
                *dst++ = value;
        }
-
        return MAL_SUCCEED;
 }
 
 static str
-convert_timestamp(void *dst_start, void *dst_end, void *src_start, void 
*src_end, bool byteswap)
+convert_timestamp(void *dst_, void *src_, size_t count, bool byteswap)
 {
-       (void)byteswap;
-       timestamp *dst = (timestamp*)dst_start;
-       timestamp *dst_e = (timestamp*)dst_end;
-       copy_binary_timestamp *src = (copy_binary_timestamp*)src_start;
-       copy_binary_timestamp *src_e = (copy_binary_timestamp*)src_end;
-       (void)dst_e; assert(dst_e - dst == src_e - src);
+       timestamp *dst = dst_;
+       copy_binary_timestamp *src = src_;
 
-       for (; src < src_e; src++) {
-               if (byteswap)
-                       copy_binary_convert_timestamp(src);
-               date dt = date_create(src->date.year, src->date.month, 
src->date.day);
-               daytime tm = daytime_create(src->time.hours, src->time.minutes, 
src->time.seconds, src->time.ms);
+       for (size_t i = 0; i < count; i++) {
+               copy_binary_timestamp incoming;
+               if (!byteswap)
+                       incoming = *src++;
+               else
+                       incoming = copy_binary_byteswap_timestamp(*src++);
+               date dt = date_create(incoming.date.year, incoming.date.month, 
incoming.date.day);
+               daytime tm = daytime_create(incoming.time.hours, 
incoming.time.minutes, incoming.time.seconds, incoming.time.ms);
                timestamp value = timestamp_create(dt, tm);
                *dst++ = value;
        }
-
        return MAL_SUCCEED;
 }
 
@@ -306,26 +288,28 @@ end:
 
 
 static struct type_rec type_recs[] = {
-       { "bit", "bit", .convert_in_place=convert_bit, },
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to