[Tarantool-patches] [PATCH resend v2 04/11] lua, datetime: display datetime
Oleg Babin
olegrok at tarantool.org
Thu Jul 29 21:55:50 MSK 2021
Thanks for your patch. It's not review at all. I have a question:
why is datetime not scalar?
Also I think that encoding and type system changes should live in
separate patches.
On 28.07.2021 13:34, Timur Safin via Tarantool-patches wrote:
> * introduced output routine for converting datetime
> to their default output format.
>
> * use this routine for tostring() in datetime.lua
>
> Part of #5941
> ---
> src/exports.h | 1 +
> src/lib/core/CMakeLists.txt | 1 +
> src/lib/core/datetime.c | 85 +++++++++++++++++++++++++++++++++++++
> src/lib/core/datetime.h | 14 ++++++
> src/lua/datetime.lua | 18 ++++++--
> 5 files changed, 116 insertions(+), 3 deletions(-)
> create mode 100755 src/lib/core/datetime.c
>
> diff --git a/src/exports.h b/src/exports.h
> index db40c03a4..1a03db636 100644
> --- a/src/exports.h
> +++ b/src/exports.h
> @@ -552,3 +552,4 @@ EXPORT(dt_parse_iso_zone_extended)
> EXPORT(dt_parse_iso_zone_lenient)
> EXPORT(dt_from_struct_tm)
> EXPORT(dt_to_struct_tm)
> +EXPORT(datetime_to_string)
> diff --git a/src/lib/core/CMakeLists.txt b/src/lib/core/CMakeLists.txt
> index 2cd4d0b4f..8bc776b82 100644
> --- a/src/lib/core/CMakeLists.txt
> +++ b/src/lib/core/CMakeLists.txt
> @@ -30,6 +30,7 @@ set(core_sources
> decimal.c
> mp_decimal.c
> cord_buf.c
> + datetime.c
> )
>
> if (TARGET_OS_NETBSD)
> diff --git a/src/lib/core/datetime.c b/src/lib/core/datetime.c
> new file mode 100755
> index 000000000..65f813a70
> --- /dev/null
> +++ b/src/lib/core/datetime.c
> @@ -0,0 +1,85 @@
> +/*
> + * Copyright 2021, Tarantool AUTHORS, please see AUTHORS file.
> + *
> + * Redistribution and use in source and binary forms, with or
> + * without modification, are permitted provided that the following
> + * conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above
> + * copyright notice, this list of conditions and the
> + * following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above
> + * copyright notice, this list of conditions and the following
> + * disclaimer in the documentation and/or other materials
> + * provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
> + * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <string.h>
> +
> +#include "trivia/util.h"
> +#include "datetime.h"
> +
> +int
> +datetime_to_string(const struct datetime_t * date, char *buf, uint32_t len)
> +{
> + char * src = buf;
> + int offset = date->offset;
> + int64_t secs = date->secs + offset * 60;
> + dt_t dt = dt_from_rdn((secs / SECS_PER_DAY) + 719163);
> +
> + int year, month, day, sec, ns, sign;
> + dt_to_ymd(dt, &year, &month, &day);
> +
> + int hour = (secs / 3600) % 24,
> + minute = (secs / 60) % 60;
> + ;
> + sec = secs % 60;
> + ns = date->nsec;
> + uint32_t sz;
> + sz = snprintf(buf, len, "%04d-%02d-%02dT%02d:%02d",
> + year, month, day, hour, minute);
> + buf += sz; len -= sz;
> + if (sec || ns) {
> + sz = snprintf(buf, len, ":%02d", sec);
> + buf += sz; len -= sz;
> + if (ns) {
> + if ((ns % 1000000) == 0)
> + sz = snprintf(buf, len, ".%03d", ns / 1000000);
> + else if ((ns % 1000) == 0)
> + sz = snprintf(buf, len, ".%06d", ns / 1000);
> + else
> + sz = snprintf(buf, len, ".%09d", ns);
> + buf += sz; len -= sz;
> + }
> + }
> + if (offset == 0) {
> + strncpy(buf, "Z", len);
> + buf++;
> + len--;
> + }
> + else {
> + if (offset < 0)
> + sign = '-', offset = -offset;
> + else
> + sign = '+';
> +
> + sz = snprintf(buf, len, "%c%02d:%02d", sign, offset / 60, offset % 60);
> + buf += sz; len -= sz;
> + }
> + return (buf - src);
> +}
> diff --git a/src/lib/core/datetime.h b/src/lib/core/datetime.h
> index 403bf1c64..fdaff2d27 100644
> --- a/src/lib/core/datetime.h
> +++ b/src/lib/core/datetime.h
> @@ -38,6 +38,11 @@
> extern "C" {
> #endif /* defined(__cplusplus) */
>
> +#ifndef SECS_PER_DAY
> +#define SECS_PER_DAY 86400
> +#define NANOS_PER_SEC 1000000000
> +#endif
> +
> /**
> * datetime structure consisting of:
> */
> @@ -55,6 +60,15 @@ struct datetime_interval_t {
> int32_t nsec; ///< nanoseconds delta
> };
>
> +/**
> + * Convert datetime to string using default format
> + * @param date source datetime value
> + * @param buf output character buffer
> + * @param len size ofoutput buffer
> + */
> +int
> +datetime_to_string(const struct datetime_t * date, char *buf, uint32_t len);
> +
> #if defined(__cplusplus)
> } /* extern "C" */
> #endif /* defined(__cplusplus) */
> diff --git a/src/lua/datetime.lua b/src/lua/datetime.lua
> index f4d2d7737..9ec06d8d8 100644
> --- a/src/lua/datetime.lua
> +++ b/src/lua/datetime.lua
> @@ -53,6 +53,12 @@ ffi.cdef [[
> dt_t dt_from_struct_tm (const struct tm *tm);
> void dt_to_struct_tm (dt_t dt, struct tm *tm);
>
> + // mp_datetime.c
> +
> + int
> + datetime_to_string(const struct datetime_t * date, char *buf, uint32_t len);
> +
> +
> // <asm-generic/posix_types.h>
> typedef long __kernel_long_t;
> typedef unsigned long __kernel_ulong_t;
> @@ -549,8 +555,13 @@ local function strftime(fmt, o)
> return ffi.string(buff)
> end
>
> --- strftime may be redirected to datetime:fmt("format")
> -local function datetime_fmt()
> +local function datetime_tostring(o)
> + assert(ffi.typeof(o) == datetime_t)
> + local sz = 48
> + local buff = ffi.new('char[?]', sz)
> + local len = native.datetime_to_string(o, buff, sz)
> + assert(len < sz)
> + return ffi.string(buff)
> end
>
>
> @@ -566,7 +577,8 @@ return setmetatable(
> parse_date = parse_date,
> parse_time = parse_time,
> parse_zone = parse_zone,
> - fmt = datetime_fmt,
> +
> + tostring = datetime_tostring,
>
> now = local_now,
> -- strptime = strptime;
More information about the Tarantool-patches
mailing list