return false;
}
+static ssize_t unescape_str(const string& s, ssize_t ofs, char esc_char, char special_char, string *dest)
+{
+ const char *src = s.c_str();
+ char dest_buf[s.size() + 1];
+ char *destp = dest_buf;
+ bool esc = false;
+
+ dest_buf[0] = '\0';
+
+ for (size_t i = ofs; i < s.size(); i++) {
+ char c = src[i];
+ if (!esc && c == esc_char) {
+ esc = true;
+ continue;
+ }
+ if (!esc && c == special_char) {
+ *destp = '\0';
+ *dest = dest_buf;
+ return (ssize_t)i + 1;
+ }
+ *destp++ = c;
+ esc = false;
+ }
+ *destp = '\0';
+ *dest = dest_buf;
+ return string::npos;
+}
+
+static void escape_str(const string& s, char esc_char, char special_char, string *dest)
+{
+ const char *src = s.c_str();
+ char dest_buf[s.size() * 2 + 1];
+ char *destp = dest_buf;
+
+ for (size_t i = 0; i < s.size(); i++) {
+ char c = src[i];
+ if (c == esc_char || c == special_char) {
+ *destp++ = esc_char;
+ }
+ *destp++ = c;
+ }
+ *destp++ = '\0';
+ *dest = dest_buf;
+}
+
+void rgw_pool::from_str(const string& s)
+{
+ ssize_t pos = unescape_str(s, 0, '\\', ':', &name);
+ if (pos != string::npos) {
+ pos = unescape_str(s, pos, '\\', ':', &ns);
+ /* ignore return; if pos != string::npos it means that we had a colon
+ * in the middle of ns that wasn't escaped, we're going to stop there
+ */
+ }
+}
+
+string rgw_pool::to_str() const
+{
+ string esc_name;
+ escape_str(name, '\\', ':', &esc_name);
+ if (ns.empty()) {
+ return esc_name;
+ }
+ string esc_ns;
+ escape_str(ns, '\\', ':', &esc_ns);
+ return esc_name + ":" + esc_ns;
+}
+
void rgw_raw_obj::decode_from_rgw_obj(bufferlist::iterator& bl)
{
rgw_obj old_obj;
struct rgw_pool {
string name;
+ string ns;
rgw_pool() {}
- rgw_pool(const rgw_pool& _p) : name(_p.name) {}
- rgw_pool(const string& _name) : name(_name) {}
-
- const string& to_str() const {
- return name;
+ rgw_pool(const rgw_pool& _p) : name(_p.name), ns(_p.ns) {}
+ rgw_pool(const string& _s) {
+ from_str(_s);
}
+ rgw_pool(const string& _name, const string& _ns) : name(_name), ns(_ns) {}
+
+ string to_str() const;
+ void from_str(const string& s);
- void init(const string& _name) {
- name = _name;
+ void init(const string& _s) {
+ from_str(_s);
}
bool empty() const {
}
int compare(const rgw_pool& p) const {
- return name.compare(p.name);
+ int r = name.compare(p.name);
+ if (r != 0) {
+ return r;
+ }
+ return ns.compare(p.ns);
}
void encode(bufferlist& bl) const {
ENCODE_START(10, 10, bl);
::encode(name, bl);
+ ::encode(ns, bl);
ENCODE_FINISH(bl);
}
* version. Anything older than 10 needs to be treated as old rgw_bucket
*/
+ } else {
+ ::decode(ns, bl);
}
DECODE_FINISH(bl);
bool operator!=(const rgw_pool& p) const {
return !(*this == p);
}
+ bool operator<(const rgw_pool& p) const {
+ int r = name.compare(p.name);
+ if (r == 0) {
+ return (ns.compare(p.ns) < 0);
+ }
+ return (r < 0);
+ }
};
WRITE_CLASS_ENCODER(rgw_pool)
};
inline ostream& operator<<(ostream& out, const rgw_pool& p) {
- out << p.name;
+ out << p.to_str();
return out;
}