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