From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id 3C9246EC56; Wed, 28 Jul 2021 13:35:58 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 3C9246EC56 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1627468558; bh=Rt2C01a+xAYQan+IS1QKbQbiGfOW7/YpeFdeiMdbbvk=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=QYJp4dtaVQZ2QmXyjmbdGNdgQhQWvBL6WZamEbF4NjebJfV443np0a1qjILyXzFNY QMnknMrCLtwzPmMUlChi2DS6XZlZr0coliHHqWEzrsYI8K9MfAn9Q1AiXS42gY5BDZ 7h3GCwdWjuqkYVCGgxg+YphixuOw0JTkDYellvuI= Received: from smtp57.i.mail.ru (smtp57.i.mail.ru [217.69.128.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 79E966EC5E for ; Wed, 28 Jul 2021 13:34:29 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 79E966EC5E Received: by smtp57.i.mail.ru with esmtpa (envelope-from ) id 1m8gtQ-0008Bz-BJ; Wed, 28 Jul 2021 13:34:28 +0300 To: v.shpilevoy@tarantool.org Date: Wed, 28 Jul 2021 13:34:06 +0300 Message-Id: X-Mailer: git-send-email 2.29.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-4EC0790: 10 X-7564579A: B8F34718100C35BD X-77F55803: 4F1203BC0FB41BD941C43E597735A9C351B198F4576AC7B21928AAE70459C21B182A05F538085040939CE428499D041170E3DE4C77D31F47BA426EB06F2960B370BB1854DA8DBB6C X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7F9D3BE5B596754B8C2099A533E45F2D0395957E7521B51C2CFCAF695D4D8E9FCEA1F7E6F0F101C6778DA827A17800CE736691C7D10565E038F08D7030A58E5AD1A62830130A00468AEEEE3FBA3A834EE7353EFBB553375667BEA09003D200E082CFC53156DAB3466BD669BCA22125AEDA471835C12D1D9774AD6D5ED66289B5278DA827A17800CE71AE4D56B06699BBC9FA2833FD35BB23D2EF20D2F80756B5F868A13BD56FB6657A471835C12D1D977725E5C173C3A84C3CA5A41EBD8A3A0199FA2833FD35BB23DF004C90652538430302FCEF25BFAB3454AD6D5ED66289B5278DA827A17800CE735C3DE051B5E7A94D32BA5DBAC0009BE395957E7521B51C20BC6067A898B09E4090A508E0FED6299176DF2183F8FC7C0FE47644D82A7D4B6CD04E86FAF290E2D7E9C4E3C761E06A71DD303D21008E29813377AFFFEAFD269A417C69337E82CC2E827F84554CEF50127C277FBC8AE2E8BA83251EDC214901ED5E8D9A59859A8B6A45692FFBBD75A6A089D37D7C0E48F6C5571747095F342E88FB05168BE4CE3AF X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975C7BEA09003D200E082CFC53156DAB3466BD669BCA22125AED9C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF824747F4BD2CC0FE699F904B3F4130E343918A1A30D5E7FCCB5012B2E24CD356 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34F6CC1FD33669633660A0757018A866C0EB9B7F285B2703F1450EA23C5B89E2C2285720A277C483571D7E09C32AA3244CC25625CDA8A556E3953F7B639A330EF8B4DF56057A86259F83B48618A63566E0 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojiF1u9eOpfTTIS++iTd2zXg== X-Mailru-Sender: B5B6A6EBBD94DAD8C47A93838048902D54E8C5C2A129CF3739D9733BBA448F41F7AA1921B336379A1EC9E4A2C82A33BC8C24925A86E657CE0C70AEE3C9A96FBAB3D7EE8ED63280BE112434F685709FCF0DA7A0AF5A3A8387 X-Mras: Ok Subject: [Tarantool-patches] [PATCH resend v2 04/11] lua, datetime: display datetime X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Timur Safin via Tarantool-patches Reply-To: Timur Safin Cc: tarantool-patches@dev.tarantool.org Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" * 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 ``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 + * 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 + +#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); + + // 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; -- 2.29.2