diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-05 14:43:00 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-05 14:43:00 -0800 |
commit | ab6d3517d370a5603b0c126d8d008c2f1df02822 (patch) | |
tree | d27a79f5f81996b1e701d792799c114013087db8 | |
parent | ee9f8b0d322c0b75e3a41dd32c3098a3bd1a128e (diff) | |
download | ceph-ab6d3517d370a5603b0c126d8d008c2f1df02822.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 d0e67b8772f..990b3efbc65 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2213,7 +2213,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 |