Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
//
// Copyright (c) 2012-2021 Snowflake Computing Inc. All rights reserved.
//

#ifndef PC_UTIL_TIME_HPP
#define PC_UTIL_TIME_HPP

#include <string>
#include "Python/Common.hpp"

#ifdef _WIN32
#include <algorithm>
#endif

namespace sf
{

namespace internal
{
/** python datetime.time has only support 6 bit precision, which is formated
 * double in this file */

constexpr int SECONDS_PER_MINUTE = 60;
constexpr int MINUTES_PER_HOUR = 60;
constexpr int HOURS_PER_DAY = 24;
constexpr int SECONDS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE;

constexpr int32_t PYTHON_DATETIME_TIME_MICROSEC_DIGIT = 6;
constexpr int32_t NANOSEC_DIGIT = 9;

constexpr int powTenSB4[]{1,      10,      100,      1000,      10000,
                          100000, 1000000, 10000000, 100000000, 1000000000};

/** if we use c++17 some day in the future, we can use 'constexpr
 * std::string_view sv = "hello, world";' to replace this */
const std::string FIELD_NAME_EPOCH = "epoch";
const std::string FIELD_NAME_TIME_ZONE = "timezone";
const std::string FIELD_NAME_FRACTION = "fraction";

/** pow10Int means the return value should be int type. So user needs to take
 * care not to cause int overflow by a huge parameter n.
 * And since we are using -stdc++11 now, we can only use constexpr in this way.
 * When we move to -stdc++14, we can have a more elegant way, e.g., loop. */
constexpr int pow10Int(int n)
{
  return n == 0 ? 1 : 10 * pow10Int(n - 1);
}

/** if the fraction's digit is greater than PYTHON_DATETIME_TIME_MICROSEC_DIGIT,
 * we cast it to exactly PYTHON_DATETIME_TIME_MICROSEC_DIGIT digit */
int32_t castToFormattedFraction(int32_t frac, bool isPositive, int32_t scale);

int32_t getNumberOfDigit(int32_t num);

// TODO : I think we can just keep int64_t version, since we can call the
// function with implicit conversion from int32 to int64
int32_t getHourFromSeconds(int64_t seconds, int32_t scale);

int32_t getMinuteFromSeconds(int64_t seconds, int32_t scale);

int32_t getSecondFromSeconds(int64_t seconds, int32_t scale);

int32_t getMicrosecondFromSeconds(int64_t seconds, int32_t scale);

int32_t getHourFromSeconds(int32_t seconds, int32_t scale);

int32_t getMinuteFromSeconds(int32_t seconds, int32_t scale);

int32_t getSecondFromSeconds(int32_t seconds, int32_t scale);

int32_t getMicrosecondFromSeconds(int32_t seconds, int32_t scale);

/** the input epoch is the combination of seconds and fraction
 *  the output is formatted double needed by python connector */
double getFormattedDoubleFromEpoch(int64_t epoch, int32_t scale);

/** the input are epoch (value based on the scale)  and fraction
 *  the output is formatted double needed by python connector */
double getFormattedDoubleFromEpochFraction(int64_t epoch, int32_t frac,
                                           int32_t scale);

}  // namespace internal
}  // namespace sf

#endif  // PC_UTIL_TIME_HPP