#include <math.h>
#include <sys/time.h>
#include <time.h>
+#include <errno.h>
#include "include/types.h"
+#include "common/strtol.h"
// --------
bdt.tm_year + 1900, bdt.tm_mon + 1, bdt.tm_mday,
bdt.tm_hour, bdt.tm_min, bdt.tm_sec, usec());
}
+
+ static int parse_date(const string& date, uint64_t *epoch, uint64_t *nsec,
+ string *out_date=NULL, string *out_time=NULL) {
+ struct tm tm;
+ memset(&tm, 0, sizeof(tm));
+
+ const char *p = strptime(date.c_str(), "%Y-%m-%d", &tm);
+ if (p) {
+ if (*p == ' ') {
+ p++;
+ p = strptime(p, " %H:%M:%S", &tm);
+ if (!p)
+ return -EINVAL;
+ if (nsec && *p == '.') {
+ ++p;
+ unsigned i;
+ char buf[10]; /* 9 digit + null termination */
+ for (i = 0; (i < sizeof(buf) - 1) && isdigit(*p); ++i, ++p) {
+ buf[i] = *p;
+ }
+ for (; i < sizeof(buf) - 1; ++i) {
+ buf[i] = '0';
+ }
+ buf[i] = '\0';
+ string err;
+ *nsec = (uint64_t)strict_strtol(buf, 10, &err);
+ if (!err.empty()) {
+ return -EINVAL;
+ }
+ }
+ }
+ } else {
+ return -EINVAL;
+ }
+ time_t t = timegm(&tm);
+ if (epoch)
+ *epoch = (uint64_t)t;
+
+ if (out_date) {
+ char buf[32];
+ strftime(buf, sizeof(buf), "%F", &tm);
+ *out_date = buf;
+ }
+ if (out_time) {
+ char buf[32];
+ strftime(buf, sizeof(buf), "%T", &tm);
+ *out_time = buf;
+ }
+
+ return 0;
+ }
};
WRITE_CLASS_ENCODER(utime_t)
uint64_t nsec = 0;
if (!date_str.empty()) {
- int ret = parse_date(date_str, &epoch, &nsec);
+ int ret = utime_t::parse_date(date_str, &epoch, &nsec);
if (ret < 0) {
cerr << "ERROR: failed to parse date: " << date_str << std::endl;
return -EINVAL;
return usage();
}
string parsed_date, parsed_time;
- int r = parse_date(date, NULL, NULL, &parsed_date, &parsed_time);
+ int r = utime_t::parse_date(date, NULL, NULL, &parsed_date, &parsed_time);
if (r < 0) {
cerr << "failure parsing date: " << cpp_strerror(r) << std::endl;
return 1;
int ret;
if (!start_date.empty()) {
- ret = parse_date(start_date, &start_epoch, NULL);
+ ret = utime_t::parse_date(start_date, &start_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse start date" << std::endl;
return 1;
}
}
if (!end_date.empty()) {
- ret = parse_date(end_date, &end_epoch, NULL);
+ ret = utime_t::parse_date(end_date, &end_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse end date" << std::endl;
return 1;
if (!start_date.empty()) {
- ret = parse_date(start_date, &start_epoch, NULL);
+ ret = utime_t::parse_date(start_date, &start_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse start date" << std::endl;
return 1;
}
if (!end_date.empty()) {
- ret = parse_date(end_date, &end_epoch, NULL);
+ ret = utime_t::parse_date(end_date, &end_epoch, NULL);
if (ret < 0) {
cerr << "ERROR: failed to parse end date" << std::endl;
return 1;
return 0;
}
-int parse_date(const string& date, uint64_t *epoch, uint64_t *nsec, string *out_date, string *out_time)
-{
- struct tm tm;
-
- memset(&tm, 0, sizeof(tm));
- if (nsec)
- *nsec = 0;
-
- const char *p = strptime(date.c_str(), "%Y-%m-%d", &tm);
- if (p) {
- if (*p == ' ') {
- p++;
- p = strptime(p, " %H:%M:%S", &tm);
- if (!p)
- return -EINVAL;
- if (nsec && *p == '.') {
- ++p;
- unsigned i;
- char buf[10]; /* 9 digit + null termination */
- for (i = 0; (i < sizeof(buf) - 1) && isdigit(*p); ++i, ++p) {
- buf[i] = *p;
- }
- for (; i < sizeof(buf) - 1; ++i) {
- buf[i] = '0';
- }
- buf[i] = '\0';
- string err;
- *nsec = (uint64_t)strict_strtol(buf, 10, &err);
- if (!err.empty()) {
- return -EINVAL;
- }
- }
- }
- } else {
- return -EINVAL;
- }
- time_t t = timegm(&tm);
- if (epoch)
- *epoch = (uint64_t)t;
-
- if (out_date) {
- char buf[32];
- strftime(buf, sizeof(buf), "%F", &tm);
- *out_date = buf;
- }
- if (out_time) {
- char buf[32];
- strftime(buf, sizeof(buf), "%T", &tm);
- *out_time = buf;
- }
-
- return 0;
-}
-
/*
* calculate the sha1 value of a given msg and key
*/
extern int parse_time(const char *time_str, time_t *time);
extern bool parse_rfc2616(const char *s, struct tm *t);
extern bool parse_iso8601(const char *s, struct tm *t);
-extern int parse_date(const string& date, uint64_t *epoch, uint64_t *nsec, string *out_date = NULL, string *out_time = NULL);
extern string rgw_trim_whitespace(const string& src);
extern string rgw_trim_quotes(const string& val);
return 0;
}
- uint64_t epoch, usec;
+ uint64_t epoch, nsec;
- int r = parse_date(sval, &epoch, &usec);
+ int r = utime_t::parse_date(sval, &epoch, &nsec);
if (r < 0)
return r;
- *val = utime_t(epoch, usec);
+ *val = utime_t(epoch, nsec);
return 0;
}
return 0;
}
- int r = parse_date(date, epoch, NULL);
+ int r = utime_t::parse_date(date, epoch, NULL);
if (r < 0)
return r;
uint64_t nsec = 0;
if (!in.empty()) {
- if (parse_date(in, &epoch, &nsec) < 0) {
+ if (utime_t::parse_date(in, &epoch, &nsec) < 0) {
dout(5) << "Error parsing date " << in << dendl;
return -EINVAL;
}