#include "cls/version/cls_version_types.h"
#include "common/Formatter.h"
+#include "common/ceph_json.h"
void obj_version::dump(Formatter *f) const
f->dump_string("tag", tag);
}
+void obj_version::decode_json(JSONObj *obj)
+{
+ JSONDecoder::decode_json("ver", ver, obj);
+ JSONDecoder::decode_json("tag", tag, obj);
+}
+
#include "include/encoding.h"
#include "include/types.h"
+class JSONObj;
+
struct obj_version {
uint64_t ver;
}
void dump(Formatter *f) const;
+ void decode_json(JSONObj *obj);
};
WRITE_CLASS_ENCODER(obj_version)
cerr << " gc list dump expired garbage collection objects\n";
cerr << " gc process manually process garbage\n";
cerr << " metadata get get metadata info\n";
+ cerr << " metadata put put metadata info\n";
+ cerr << " metadata list list metadata info\n";
cerr << "options:\n";
cerr << " --uid=<id> user id\n";
cerr << " --subuser=<name> subuser name\n";
OPT_CAPS_ADD,
OPT_CAPS_RM,
OPT_METADATA_GET,
+ OPT_METADATA_PUT,
OPT_METADATA_LIST,
};
} else if (strcmp(prev_cmd, "metadata") == 0) {
if (strcmp(cmd, "get") == 0)
return OPT_METADATA_GET;
+ if (strcmp(cmd, "put") == 0)
+ return OPT_METADATA_PUT;
if (strcmp(cmd, "list") == 0)
return OPT_METADATA_LIST;
}
}
else {
const char *prev_cmd = NULL;
- for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ++i) {
+ std::vector<const char*>::iterator i ;
+ for (i = args.begin(); i != args.end(); ++i) {
opt_cmd = get_cmd(*i, prev_cmd, &need_more);
if (opt_cmd < 0) {
cerr << "unrecognized arg " << *i << std::endl;
return usage();
}
- if (!need_more)
+ if (!need_more) {
+ ++i;
break;
+ }
prev_cmd = *i;
}
+
if (opt_cmd == OPT_NO_CMD)
return usage();
+
+ /* some commands may have an optional extra param */
+ if (i != args.end()) {
+ switch (opt_cmd) {
+ case OPT_METADATA_GET:
+ case OPT_METADATA_PUT:
+ case OPT_METADATA_LIST:
+ metadata_key = *i;
+ break;
+ default:
+ break;
+ }
+ }
}
// default to pretty json
formatter->flush(cout);
}
+ if (opt_cmd == OPT_METADATA_PUT) {
+ bufferlist bl;
+ int ret = read_input(infile, bl);
+ if (ret < 0) {
+ cerr << "ERROR: failed to read input: " << cpp_strerror(-ret) << std::endl;
+ return ret;
+ }
+ ret = store->meta_mgr->put(metadata_key, bl);
+ if (ret < 0) {
+ cerr << "ERROR: can't put key: " << cpp_strerror(-ret) << std::endl;
+ return -ret;
+ }
+ }
+
if (opt_cmd == OPT_METADATA_LIST) {
void *handle;
int max = 1000;
#include "rgw_metadata.h"
+#include "common/ceph_json.h"
+#include "cls/version/cls_version_types.h"
+obj_version& RGWMetadataObject::get_version()
+{
+ return objv;
+}
RGWMetadataManager::~RGWMetadataManager()
{
return ret;
}
- return handler->get(store, metadata_key, entry, f);
+ RGWMetadataObject *obj;
+
+ ret = handler->get(store, entry, &obj);
+ if (ret < 0) {
+ return ret;
+ }
+
+ f->open_object_section("metadata_info");
+ encode_json("key", metadata_key, f);
+ encode_json("ver", obj->get_version(), f);
+ encode_json("data", *obj, f);
+ f->close_section();
+
+ delete obj;
+
+ return 0;
}
-int RGWMetadataManager::update(string& metadata_key, bufferlist& bl)
+int RGWMetadataManager::put(string& metadata_key, bufferlist& bl)
{
RGWMetadataHandler *handler;
string entry;
if (ret < 0)
return ret;
- return handler->update(store, entry, bl);
+ JSONParser parser;
+ if (!parser.parse(bl.c_str(), bl.length())) {
+ return -EINVAL;
+ }
+
+ string meadata_key;
+ obj_version objv;
+
+ JSONDecoder::decode_json("key", metadata_key, &parser);
+ JSONDecoder::decode_json("ver", objv, &parser);
+
+ JSONObj *jo = parser.find_obj("data");
+ if (!jo) {
+ return -EINVAL;
+ }
+
+ return handler->put(store, entry, objv, jo);
}
struct list_keys_handle {
#include "include/types.h"
#include "rgw_common.h"
+#include "cls/version/cls_version_types.h"
+
class RGWRados;
+class JSONObj;
+
+struct obj_version;
+class RGWMetadataObject {
+protected:
+ obj_version objv;
+
+public:
+ virtual ~RGWMetadataObject() {}
+ obj_version& get_version();
+
+ virtual void dump(Formatter *f) const = 0;
+};
+
class RGWMetadataHandler {
public:
virtual ~RGWMetadataHandler() {}
virtual string get_type() = 0;
- virtual int get(RGWRados *store, string& key, string& entry, Formatter *f) = 0;
- virtual int update(RGWRados *store, string& entry, bufferlist& bl) = 0;
+ virtual int get(RGWRados *store, string& entry, RGWMetadataObject **obj) = 0;
+ virtual int put(RGWRados *store, string& entry, obj_version& objv, JSONObj *obj) = 0;
virtual int list_keys_init(RGWRados *store, void **phandle) = 0;
virtual int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated) = 0;
virtual void list_keys_complete(void *handle) = 0;
};
-
class RGWMetadataManager {
map<string, RGWMetadataHandler *> handlers;
RGWRados *store;
int register_handler(RGWMetadataHandler *handler);
int get(string& metadata_key, Formatter *f);
- int update(string& metadata_key, bufferlist& bl);
+ int put(string& metadata_key, bufferlist& bl);
int list_keys_init(string& section, void **phandle);
int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated);
return 0;
}
+class RGWUserMetadataObject : public RGWMetadataObject {
+ RGWUserInfo info;
+public:
+ RGWUserMetadataObject(RGWUserInfo& i, obj_version& v) : info(i) {
+ objv = v;
+ }
+
+ void dump(Formatter *f) const {
+ info.dump(f);
+ }
+};
+
class RGWUserMetadataHandler : public RGWMetadataHandler {
public:
string get_type() { return "user"; }
- int get(RGWRados *store, string& key, string& entry, Formatter *f) {
+
+ int get(RGWRados *store, string& entry, RGWMetadataObject **obj) {
RGWUserInfo info;
obj_version objv;
if (ret < 0)
return ret;
- f->open_object_section("metadata_info");
- encode_json("key", key, f);
- encode_json("ver", objv, f);
- encode_json("data", info, f);
- f->close_section();
- f->flush(cout);
+ RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv);
+
+ *obj = mdo;
+
return 0;
}
- int update(RGWRados *store, string& metadata_key, bufferlist& bl) {
+ int put(RGWRados *store, string& entry, obj_version& objv, JSONObj *obj) {
+ RGWUserInfo info;
+
+ decode_json_obj(info, obj);
+
+ RGWUserInfo old_info;
+ obj_version old_objv;
+ int ret = rgw_read_uid_info(store, entry, old_info, &old_objv);
+ if (ret < 0)
+ return ret;
+
+
+ ret = rgw_store_user_info(store, info, &old_info, false);
+ if (ret < 0)
+ return ret;
+
return 0;
}