From: Greg Farnum Date: Mon, 1 Jul 2013 21:57:56 +0000 (-0700) Subject: common: move parse_time into utime_t header X-Git-Tag: v0.67-rc1~128^2~18^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=653bc2de09abfc0443df2508d5f367c44d736dda;p=ceph.git common: move parse_time into utime_t header Signed-off-by: Greg Farnum --- diff --git a/src/include/utime.h b/src/include/utime.h index bfbc512263af..fab542736836 100644 --- a/src/include/utime.h +++ b/src/include/utime.h @@ -18,8 +18,10 @@ #include #include #include +#include #include "include/types.h" +#include "common/strtol.h" // -------- @@ -234,6 +236,57 @@ public: 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) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 810b18c6984e..23d6e72cfb55 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -605,7 +605,7 @@ static int parse_date_str(const string& date_str, utime_t& ut) 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; @@ -1375,7 +1375,7 @@ int main(int argc, char **argv) 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; @@ -1569,14 +1569,14 @@ next: 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; @@ -1605,7 +1605,7 @@ next: 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; @@ -1613,7 +1613,7 @@ next: } 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; diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index fbb918736c6a..a17f1c2017e5 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -387,60 +387,6 @@ int parse_time(const char *time_str, time_t *time) 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 */ diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 84d1075b7776..c03ee74367ff 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1204,7 +1204,6 @@ extern int parse_key_value(string& in_str, const char *delim, string& key, strin 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); diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 944a2c917409..04223dd00ce4 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -575,13 +575,13 @@ int RESTArgs::get_time(struct req_state *s, const string& name, const utime_t& d 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; } @@ -599,7 +599,7 @@ int RESTArgs::get_epoch(struct req_state *s, const string& name, uint64_t def_va return 0; } - int r = parse_date(date, epoch, NULL); + int r = utime_t::parse_date(date, epoch, NULL); if (r < 0) return r; diff --git a/src/rgw/rgw_rest_log.cc b/src/rgw/rgw_rest_log.cc index cb24251ac241..2dc6071321bd 100644 --- a/src/rgw/rgw_rest_log.cc +++ b/src/rgw/rgw_rest_log.cc @@ -28,7 +28,7 @@ static int parse_date_str(string& in, utime_t& out) { 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; }