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 B80126EC5F; Mon, 2 Aug 2021 03:43:35 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org B80126EC5F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1627865015; bh=CDMV/e/WassGqA5xw+oGaoZu3WS4uqPmpUDzJ1DmEmE=; 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=ROpq3yOM35Y0nqWxg7p9nNW9qx4+FL1E5LvOajDBshXGV6iBmaw6vIpkiHk+1ifX3 QYKRN2cEn8i4YE4V0VhqU85N0B1FTK+ZWPnb/l0eP8xNKClQAhiOAICvlel59W9WL/ xhcLe+Bl0Aqa5FSajleOPh595FDcpuW9WamrBFCE= Received: from smtp58.i.mail.ru (smtp58.i.mail.ru [217.69.128.38]) (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 241796E470 for ; Mon, 2 Aug 2021 03:41:33 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 241796E470 Received: by smtp58.i.mail.ru with esmtpa (envelope-from ) id 1mAM1L-0000PY-FE; Mon, 02 Aug 2021 03:41:32 +0300 To: v.shpilevoy@tarantool.org, olegrok@tarantool.org Date: Mon, 2 Aug 2021 03:41:00 +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: 4F1203BC0FB41BD941C43E597735A9C354866C15C72ED952BE56FFA0EFAF5B8C182A05F538085040CB9371946515C947AD89AAEF71F2D245A310BB77DB118CDA5D114251A043FE30 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE712EB008F780777E9EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006377A06FA5CCF78F9BC8638F802B75D45FF36EB9D2243A4F8B5A6FCA7DBDB1FC311F39EFFDF887939037866D6147AF826D8A9B515907445BF15FF509370D05A39E1117882F4460429724CE54428C33FAD305F5C1EE8F4F765FCF1175FABE1C0F9B6A471835C12D1D9774AD6D5ED66289B52BA9C0B312567BB23117882F44604297287769387670735209ECD01F8117BC8BEA471835C12D1D977C4224003CC836476EB9C4185024447017B076A6E789B0E975F5C1EE8F4F765FC0FC4FCDDD36A1EE6D81D268191BDAD3DBD4B6F7A4D31EC0BEA7A3FFF5B025636D81D268191BDAD3D78DA827A17800CE7D8551C7160A32248EC76A7562686271EEC990983EF5C03292E808ACE2090B5E14AD6D5ED66289B5259CC434672EE63711DD303D21008E298D5E8D9A59859A8B6B372FE9A2E580EFC725E5C173C3A84C3C9BE88FFEDFA497A35872C767BF85DA2F004C90652538430E4A6367B16DE6309 X-B7AD71C0: AC4F5C86D027EB782CDD5689AFBDA7A213B5FB47DCBC3458834459D11680B505E13A399CA3FB2FCD0840E47B3EB86BAE X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975C85811CA530B50491A782C58238C94BE391C62AB7243171BC9C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF03D88DA7F5FEDC25699F904B3F4130E343918A1A30D5E7FCCB5012B2E24CD356 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34F6CC1FD33669633683D23E27D824BE3F1D2ACB963BF5D10A479AE1F246318B3968CEB65C8A0845341D7E09C32AA3244C34E46F4777B4849B7B3CA80183E1BC63F522A1CF68F4BE058D5DD81C2BAB7D1D X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojMCfuYI4PrecaUYTtiCvTog== X-Mailru-Sender: B5B6A6EBBD94DAD8315E1362B7B20B88EE021CE66D930CC080DADE4B61A702D0C37DA562B21234545C2808D6142752370A8ED71B308007E3DC85537438B7E1A423D748DE48713E689437F6177E88F7363CDA0F3B3F5B9367 X-Mras: Ok Subject: [Tarantool-patches] [PATCH v3 4/9] 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 | 4 ++ src/lua/datetime.lua | 40 +++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100755 src/lib/core/datetime.c diff --git a/src/exports.h b/src/exports.h index 2ec314369..ce8f74065 100644 --- a/src/exports.h +++ b/src/exports.h @@ -217,6 +217,7 @@ EXPORT(curl_url_set) EXPORT(curl_version) EXPORT(curl_version_info) #endif /* EXPORT_LIBCURL_SYMBOLS */ +EXPORT(datetime_to_string) EXPORT(decimal_unpack) EXPORT(dt_dow) EXPORT(dt_from_rdn) 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 84d6642ab..2c9530ad7 100644 --- a/src/lib/core/datetime.h +++ b/src/lib/core/datetime.h @@ -40,6 +40,10 @@ extern "C" { #endif /* defined(__cplusplus) */ +#ifndef SECS_PER_DAY +#define SECS_PER_DAY 86400 +#endif + /** * Full datetime structure representing moments * since Unix Epoch (1970-01-01). diff --git a/src/lua/datetime.lua b/src/lua/datetime.lua index 870edc541..e5b89768f 100644 --- a/src/lua/datetime.lua +++ b/src/lua/datetime.lua @@ -66,6 +66,12 @@ ffi.cdef [[ dt_t dt_from_struct_tm (const struct tm *tm); void dt_to_struct_tm (dt_t dt, struct tm *tm); + // 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; @@ -467,6 +473,36 @@ local function datetime_new(o) return mk_timestamp(dt, secs, frac, offset) end +local function datetime_tostring(o) + if ffi.typeof(o) == datetime_t then + local sz = 48 + local buff = ffi.new('char[?]', sz) + local len = builtin.datetime_to_string(o, buff, sz) + assert(len < sz) + return ffi.string(buff) + elseif ffi.typeof(o) == interval_t then + local ts = o.timestamp + local sign = '+' + + if ts < 0 then + ts = -ts + sign = '-' + end + + if ts < 60 then + return ('%s%s secs'):format(sign, ts) + elseif ts < 60 * 60 then + return ('%+d minutes, %s seconds'):format(o.minutes, ts % 60) + elseif ts < 24 * 60 * 60 then + return ('%+d hours, %d minutes, %s seconds'):format( + o.hours, o.minutes % 60, ts % 60) + else + return ('%+d days, %d hours, %d minutes, %s seconds'):format( + o.days, o.hours % 24, o.minutes % 60, ts % 60) + end + end +end + local function date_first(lhs, rhs) if is_datetime(lhs) then return lhs, rhs @@ -710,6 +746,7 @@ local function strftime(fmt, o) end local datetime_mt = { + __tostring = datetime_tostring, __serialize = datetime_serialize, __eq = datetime_eq, __lt = datetime_lt, @@ -721,6 +758,7 @@ local datetime_mt = { } local interval_mt = { + __tostring = datetime_tostring, __serialize = interval_serialize, __eq = datetime_eq, __lt = datetime_lt, @@ -743,6 +781,8 @@ return setmetatable( parse_time = parse_time, parse_zone = parse_zone, + tostring = datetime_tostring, + now = local_now, strftime = strftime, asctime = asctime, -- 2.29.2