/// when stored. Likewise, these columns are automatically adjusted
/// upon retrieval unless fetched via "extract(epoch from <column>))".
///
- /// @param time_val timestamp to be converted
+ /// @param time_val_64 timestamp to be converted. This is given as a
+ /// 64-bit value to avoid overflows on the 32-bit systems where time_t
+ /// is implemented as int32_t.
/// @return std::string containing the stringified time
std::string
- convertToDatabaseTime(const time_t& time_val) {
+ convertToDatabaseTime(const int64_t& time_val_64) {
// PostgreSQL does funny things with time if you get past Y2038. It
// will accept the values (unlike MySQL which throws) but it
// stops correctly adjusting to local time when reading them back
// out. So lets disallow it here.
- if (time_val > LeaseMgr::MAX_DB_TIME) {
- isc_throw(BadValue, "Time value is too large: " << time_val);
+ if (time_val_64 > LeaseMgr::MAX_DB_TIME) {
+ isc_throw(BadValue, "Time value is too large: " << time_val_64);
}
struct tm tinfo;
char buffer[20];
+ const time_t time_val = static_cast<time_t>(time_val_64);
localtime_r(&time_val, &tinfo);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tinfo);
return (std::string(buffer));
(lease->valid_lft_);
bind_array.add(valid_lft_str_);
- expire_str_ = convertToDatabaseTime(lease->valid_lft_ +
- lease->cltt_);
+ expire_str_ = convertToDatabaseTime(static_cast<int64_t>(lease->valid_lft_) +
+ static_cast<int64_t>(lease->cltt_));
bind_array.add(expire_str_);
subnet_id_str_ = boost::lexical_cast<std::string>
(lease->valid_lft_);
bind_array.add(valid_lft_str_);
- expire_str_ = convertToDatabaseTime(lease->valid_lft_ +
- lease->cltt_);
+ expire_str_ = convertToDatabaseTime(static_cast<int64_t>(lease->valid_lft_) +
+ static_cast<int64_t>(lease->cltt_));
bind_array.add(expire_str_);
subnet_id_str_ = boost::lexical_cast<std::string>