mirror of
https://github.com/ceph/ceph
synced 2025-02-24 11:37:37 +00:00
rgw: date string parsing also parses seconds fraction
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
This commit is contained in:
parent
0335905d4c
commit
c2a56e524d
@ -602,16 +602,17 @@ static int read_decode_json(const string& infile, T& t)
|
||||
static int parse_date_str(const string& date_str, utime_t& ut)
|
||||
{
|
||||
uint64_t epoch = 0;
|
||||
uint64_t nsec = 0;
|
||||
|
||||
if (!date_str.empty()) {
|
||||
int ret = parse_date(date_str, &epoch);
|
||||
int ret = parse_date(date_str, &epoch, &nsec);
|
||||
if (ret < 0) {
|
||||
cerr << "ERROR: failed to parse date: " << date_str << std::endl;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
ut = utime_t(epoch, 0);
|
||||
ut = utime_t(epoch, nsec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1374,7 +1375,7 @@ int main(int argc, char **argv)
|
||||
return usage();
|
||||
}
|
||||
string parsed_date, parsed_time;
|
||||
int r = parse_date(date, NULL, &parsed_date, &parsed_time);
|
||||
int r = parse_date(date, NULL, NULL, &parsed_date, &parsed_time);
|
||||
if (r < 0) {
|
||||
cerr << "failure parsing date: " << cpp_strerror(r) << std::endl;
|
||||
return 1;
|
||||
@ -1568,14 +1569,14 @@ next:
|
||||
int ret;
|
||||
|
||||
if (!start_date.empty()) {
|
||||
ret = parse_date(start_date, &start_epoch);
|
||||
ret = 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);
|
||||
ret = parse_date(end_date, &end_epoch, NULL);
|
||||
if (ret < 0) {
|
||||
cerr << "ERROR: failed to parse end date" << std::endl;
|
||||
return 1;
|
||||
@ -1604,7 +1605,7 @@ next:
|
||||
|
||||
|
||||
if (!start_date.empty()) {
|
||||
ret = parse_date(start_date, &start_epoch);
|
||||
ret = parse_date(start_date, &start_epoch, NULL);
|
||||
if (ret < 0) {
|
||||
cerr << "ERROR: failed to parse start date" << std::endl;
|
||||
return 1;
|
||||
@ -1612,7 +1613,7 @@ next:
|
||||
}
|
||||
|
||||
if (!end_date.empty()) {
|
||||
ret = parse_date(end_date, &end_epoch);
|
||||
ret = parse_date(end_date, &end_epoch, NULL);
|
||||
if (ret < 0) {
|
||||
cerr << "ERROR: failed to parse end date" << std::endl;
|
||||
return 1;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "common/Clock.h"
|
||||
#include "common/Formatter.h"
|
||||
#include "common/perf_counters.h"
|
||||
#include "common/strtol.h"
|
||||
#include "include/str_list.h"
|
||||
#include "auth/Crypto.h"
|
||||
|
||||
@ -386,18 +387,38 @@ int parse_time(const char *time_str, time_t *time)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_date(const string& date, uint64_t *epoch, string *out_date, string *out_time)
|
||||
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++;
|
||||
if (!strptime(p, " %H:%M:%S", &tm))
|
||||
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;
|
||||
|
@ -1200,7 +1200,7 @@ 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, string *out_date = NULL, string *out_time = NULL);
|
||||
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);
|
||||
|
||||
|
@ -575,13 +575,13 @@ int RESTArgs::get_time(struct req_state *s, const string& name, const utime_t& d
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t epoch;
|
||||
uint64_t epoch, usec;
|
||||
|
||||
int r = parse_date(sval, &epoch);
|
||||
int r = parse_date(sval, &epoch, &usec);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*val = utime_t(epoch, 0);
|
||||
*val = utime_t(epoch, usec);
|
||||
|
||||
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);
|
||||
int r = parse_date(date, epoch, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -25,14 +25,15 @@
|
||||
|
||||
static int parse_date_str(string& in, utime_t& out) {
|
||||
uint64_t epoch = 0;
|
||||
uint64_t nsec = 0;
|
||||
|
||||
if (!in.empty()) {
|
||||
if (parse_date(in, &epoch) < 0) {
|
||||
if (parse_date(in, &epoch, &nsec) < 0) {
|
||||
dout(5) << "Error parsing date " << in << dendl;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
out = utime_t(epoch, 0);
|
||||
out = utime_t(epoch, nsec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user