Skip to content

Commit 039d0ad

Browse files
committed
lua, datetime: proper datetime encoding
* correct incorrect encoding of MP_EXT sizes for datetime messagepack values; * export necessary symbols for datetime messagepack size calculations so they will be available for Lua consumption. Part of tarantool#5941
1 parent 46027f6 commit 039d0ad

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

src/exports.h

+2
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ EXPORT(mp_encode_decimal)
437437
EXPORT(mp_encode_double)
438438
EXPORT(mp_encode_float)
439439
EXPORT(mp_encode_uuid)
440+
EXPORT(mp_encode_datetime)
440441
EXPORT(mp_ext_hint)
441442
EXPORT(mp_format)
442443
EXPORT(mp_fprint)
@@ -446,6 +447,7 @@ EXPORT(mp_fprint_recursion)
446447
EXPORT(mp_parser_hint)
447448
EXPORT(mp_sizeof_decimal)
448449
EXPORT(mp_sizeof_uuid)
450+
EXPORT(mp_sizeof_datetime)
449451
EXPORT(mp_snprint)
450452
EXPORT(mp_snprint_ext)
451453
EXPORT(mp_snprint_ext_default)

src/lib/core/datetime.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ mp_decode_Xint(const char **data)
8383
return 0;
8484
}
8585

86-
uint32_t
87-
mp_sizeof_datetime(const struct datetime_t *date)
86+
static inline uint32_t
87+
mp_sizeof_datetime_raw(const struct datetime_t *date)
8888
{
8989
uint32_t sz = mp_sizeof_Xint(date->secs);
9090

@@ -94,10 +94,15 @@ mp_sizeof_datetime(const struct datetime_t *date)
9494
sz += mp_sizeof_Xint(date->nsec);
9595
if (date->offset)
9696
sz += mp_sizeof_Xint(date->offset);
97-
9897
return sz;
9998
}
10099

100+
uint32_t
101+
mp_sizeof_datetime(const struct datetime_t *date)
102+
{
103+
return mp_sizeof_ext(mp_sizeof_datetime_raw(date));
104+
}
105+
101106
struct datetime_t *
102107
datetime_unpack(const char **data, uint32_t len, struct datetime_t *date)
103108
{
@@ -112,7 +117,7 @@ datetime_unpack(const char **data, uint32_t len, struct datetime_t *date)
112117
return date;
113118

114119
svp = *data;
115-
date->secs = mp_decode_Xint(data);
120+
date->nsec = mp_decode_Xint(data);
116121
len -= *data - svp;
117122

118123
if (len <= 0)
@@ -153,7 +158,7 @@ datetime_pack(char *data, const struct datetime_t *date)
153158
char *
154159
mp_encode_datetime(char *data, const struct datetime_t *date)
155160
{
156-
uint32_t len = mp_sizeof_datetime(date);
161+
uint32_t len = mp_sizeof_datetime_raw(date);
157162

158163
data = mp_encode_extl(data, MP_DATETIME, len);
159164

src/lua/msgpackffi.lua

+10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ char *
2626
mp_encode_uuid(char *data, const struct tt_uuid *uuid);
2727
uint32_t
2828
mp_sizeof_uuid();
29+
uint32_t
30+
mp_sizeof_datetime(const struct t_datetime_tz *date);
31+
char *
32+
mp_encode_datetime(char *data, const struct t_datetime_tz *date);
2933
float
3034
mp_decode_float(const char **data);
3135
double
@@ -144,6 +148,11 @@ local function encode_uuid(buf, uuid)
144148
builtin.mp_encode_uuid(p, uuid)
145149
end
146150

151+
local function encode_datetime(buf, date)
152+
local p = buf:alloc(builtin.mp_sizeof_datetime(date))
153+
builtin.mp_encode_datetime(p, date)
154+
end
155+
147156
local function encode_int(buf, num)
148157
if num >= 0 then
149158
if num <= 0x7f then
@@ -322,6 +331,7 @@ on_encode(ffi.typeof('float'), encode_float)
322331
on_encode(ffi.typeof('double'), encode_double)
323332
on_encode(ffi.typeof('decimal_t'), encode_decimal)
324333
on_encode(ffi.typeof('struct tt_uuid'), encode_uuid)
334+
on_encode(ffi.typeof('struct datetime_t'), encode_datetime)
325335

326336
--------------------------------------------------------------------------------
327337
-- Decoder

0 commit comments

Comments
 (0)