From 57331451a2eb8cbcd812e7428ab1ded6d312365f Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Tue, 23 Dec 2014 18:47:21 +0100 Subject: [PATCH] proto: Add support for marshaling all data types. --- src/utils/proto.c | 20 +++++++++++++++++++- t/unit/utils/proto_test.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/utils/proto.c b/src/utils/proto.c index 56ef745..51c2ed8 100644 --- a/src/utils/proto.c +++ b/src/utils/proto.c @@ -202,8 +202,26 @@ sdb_proto_marshal_data(char *buf, size_t buf_len, sdb_data_t *datum) char **v = datum->data.array.values; n = marshal_string(buf, buf_len, v[i]); } + else if (type == SDB_TYPE_DATETIME) { + sdb_time_t *v = datum->data.array.values; + n = marshal_datetime(buf, buf_len, v[i]); + } + else if (type == SDB_TYPE_BINARY) { + struct { + size_t length; + unsigned char *datum; + } *v = datum->data.array.values; + n = marshal_binary(buf, buf_len, v[i].length, v[i].datum); + } + else if (type == SDB_TYPE_REGEX) { + struct { + char *raw; + regex_t regex; + } *v = datum->data.array.values; + n = marshal_string(buf, buf_len, v[i].raw); + } else { - errno = ENOTSUP; + errno = EINVAL; return -1; } diff --git a/t/unit/utils/proto_test.c b/t/unit/utils/proto_test.c index 52ae936..9f24c81 100644 --- a/t/unit/utils/proto_test.c +++ b/t/unit/utils/proto_test.c @@ -53,6 +53,20 @@ START_TEST(test_marshal_data) int64_t int_values[] = { 47, 11, 23 }; double dec_values[] = { 47.11, .5 }; char *string_values[] = { "foo", "abcd" }; + sdb_time_t datetime_values[] = { 4711, 1234567890123456789L }; + struct { + size_t length; + unsigned char *datum; + } binary_values[] = { + { 3, (unsigned char *)"\x1\x2\x3" }, + { 4, (unsigned char *)"\x42\x0\xa\x1b" }, + }; + struct { + char *raw; + regex_t regex; + } regex_values[] = { + { "dummy regex", dummy_re }, + }; struct { sdb_data_t datum; @@ -107,6 +121,23 @@ START_TEST(test_marshal_data) 25, STRING_ARRAY "\0\0\0\x2" "\0\0\0\x4" "foo\0" "\0\0\0\x5" "abcd\0" }, + { + { SDB_TYPE_DATETIME | SDB_TYPE_ARRAY, { .array = { + 2, datetime_values } } }, + 24, DATETIME_ARRAY "\0\0\0\x2" "\0\0\0\0\0\0\x12\x67" + "\x11\x22\x10\xf4\x7d\xe9\x81\x15" + }, + { + { SDB_TYPE_BINARY | SDB_TYPE_ARRAY, { .array = { + 2, binary_values } } }, + 23, BINARY_ARRAY "\0\0\0\x2" "\0\0\0\x3" "\x1\x2\x3" + "\0\0\0\4" "\x42\x0\xa\x1b" + }, + { + { SDB_TYPE_REGEX | SDB_TYPE_ARRAY, { .array = { + 1, regex_values } } }, + 24, REGEX_ARRAY "\0\0\0\1" "\0\0\0\xc" "dummy regex\0" + }, }; size_t i; -- 2.30.2