diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-05 14:43:00 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-22 11:28:02 -0700 |
commit | 7c220831be75520eeaeb493de1d1cecb21c5f32d (patch) | |
tree | d8f4a631e54713383027220c375f497b8326855a | |
parent | d6794939b3603c10a40763c4c9279ca875d38148 (diff) | |
download | ceph-7c220831be75520eeaeb493de1d1cecb21c5f32d.tar.gz |
rgw: add top level metadata handler
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_admin.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.cc | 62 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.h | 2 |
3 files changed, 64 insertions, 2 deletions
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index c4888b0d165..db76a09a36a 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2212,7 +2212,7 @@ next: } formatter->flush(cout); - } while (!truncated); + } while (truncated); formatter->close_section(); formatter->flush(cout); diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 8dfa1c74d28..9296dc28e78 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -4,12 +4,56 @@ #include "common/ceph_json.h" #include "cls/version/cls_version_types.h" +#include "rgw_rados.h" + obj_version& RGWMetadataObject::get_version() { return objv; } +class RGWMetadataTopHandler : public RGWMetadataHandler { + struct iter_data { + list<string> sections; + list<string>::iterator iter; + }; + +public: + RGWMetadataTopHandler() {} + + virtual string get_type() { return string(); } + + virtual int get(RGWRados *store, string& entry, RGWMetadataObject **obj) { return -ENOTSUP; } + virtual int put(RGWRados *store, string& entry, obj_version& objv, JSONObj *obj) { return -ENOTSUP; } + + virtual int list_keys_init(RGWRados *store, void **phandle) { + iter_data *data = new iter_data; + store->meta_mgr->get_sections(data->sections); + data->iter = data->sections.begin(); + + *phandle = data; + + return 0; + } + virtual int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated) { + iter_data *data = (iter_data *)handle; + for (int i = 0; i < max && data->iter != data->sections.end(); ++i, ++(data->iter)) { + keys.push_back(*data->iter); + } + + *truncated = (data->iter != data->sections.end()); + + return 0; + } + virtual void list_keys_complete(void *handle) { + iter_data *data = (iter_data *)handle; + + delete data; + } +}; + +static RGWMetadataTopHandler md_top_handler; + RGWMetadataManager::~RGWMetadataManager() { map<string, RGWMetadataHandler *>::iterator iter; @@ -50,6 +94,11 @@ int RGWMetadataManager::find_handler(const string& metadata_key, RGWMetadataHand parse_metadata_key(metadata_key, type, entry); + if (type.empty()) { + *handler = &md_top_handler; + return 0; + } + map<string, RGWMetadataHandler *>::iterator iter = handlers.find(type); if (iter == handlers.end()) return -ENOENT; @@ -115,6 +164,7 @@ int RGWMetadataManager::put(string& metadata_key, bufferlist& bl) return handler->put(store, entry, objv, jo); } + struct list_keys_handle { void *handle; RGWMetadataHandler *handler; @@ -125,7 +175,10 @@ int RGWMetadataManager::list_keys_init(string& section, void **handle) { string entry; RGWMetadataHandler *handler; - int ret = find_handler(section, &handler, entry); + + int ret; + + ret = find_handler(section, &handler, entry); if (ret < 0) { return -ENOENT; } @@ -163,4 +216,11 @@ void RGWMetadataManager::list_keys_complete(void *handle) delete h; } +void RGWMetadataManager::get_sections(list<string>& sections) +{ + for (map<string, RGWMetadataHandler *>::iterator iter = handlers.begin(); iter != handlers.end(); ++iter) { + sections.push_back(iter->first); + } +} + diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index 3f92ea0c352..eb052e7b03c 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -58,6 +58,8 @@ public: int list_keys_init(string& section, void **phandle); int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated); void list_keys_complete(void *handle); + + void get_sections(list<string>& sections); }; #endif |