*
*/
-#include <cxxabi.h>
-#include "common/cmdparse.h"
-#include "common/Formatter.h"
-#include "include/str_list.h"
#include "json_spirit/json_spirit.h"
#include "common/debug.h"
}
f->close_section();
}
+
+ void operator()(const std::vector<double> &operand) const
+ {
+ f->open_array_section(key.c_str());
+ for (const auto i : operand) {
+ f->dump_float("item", i);
+ }
+ f->close_section();
+ }
};
//f->open_object_section("cmdmap");
case json_spirit::array_type:
{
// array is a vector of values. Unpack it to a vector
- // of strings or int64_t, the only types we handle.
+ // of strings, doubles, or int64_t, the only types we handle.
const vector<json_spirit::mValue>& spvals = it->second.get_array();
if (spvals.empty()) {
// if an empty array is acceptable, the caller should always check for
outv.push_back(sv.get_int64());
}
(*mapp)[it->first] = std::move(outv);
+ } else if (spvals.front().type() == json_spirit::real_type) {
+ vector<double> outv;
+ for (const auto& sv : spvals) {
+ if (spvals.front().type() != json_spirit::real_type) {
+ throw(runtime_error("Can't handle arrays of multiple types"));
+ }
+ outv.push_back(sv.get_real());
+ }
+ (*mapp)[it->first] = std::move(outv);
} else {
throw(runtime_error("Can't handle arrays of types other than "
- "int or string"));
+ "int, string, or double"));
}
}
break;
void
-handle_bad_get(CephContext *cct, string k, const char *tname)
+handle_bad_get(CephContext *cct, const string& k, const char *tname)
{
ostringstream errstr;
int status;
if (status == 0)
free((char *)typestr);
}
+
+long parse_pos_long(const char *s, std::ostream *pss)
+{
+ if (*s == '-' || *s == '+') {
+ if (pss)
+ *pss << "expected numerical value, got: " << s;
+ return -EINVAL;
+ }
+
+ string err;
+ long r = strict_strtol(s, 10, &err);
+ if ((r == 0) && !err.empty()) {
+ if (pss)
+ *pss << err;
+ return -1;
+ }
+ if (r < 0) {
+ if (pss)
+ *pss << "unable to parse positive integer '" << s << "'";
+ return -1;
+ }
+ return r;
+}
+
+int parse_osd_id(const char *s, std::ostream *pss)
+{
+ // osd.NNN?
+ if (strncmp(s, "osd.", 4) == 0) {
+ s += 4;
+ }
+
+ // NNN?
+ ostringstream ss;
+ long id = parse_pos_long(s, &ss);
+ if (id < 0) {
+ *pss << ss.str();
+ return id;
+ }
+ if (id > 0xffff) {
+ *pss << "osd id " << id << " is too large";
+ return -ERANGE;
+ }
+ return id;
+}