From d397cfd02e9a8be667e6ff4b30243b321e1e7f0f Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 23 Mar 2011 15:56:21 -0700 Subject: [PATCH] rgw: support pseudo folders in swift --- src/rgw/rgw_op.cc | 2 +- src/rgw/rgw_rest_os.cc | 55 ++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f39ee29923984..00ab428af89b5 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -272,7 +272,6 @@ void RGWListBucket::execute() url_decode(s->args.get("prefix"), prefix); marker = s->args.get("marker"); - max_keys = s->args.get(limit_opt_name); if (!max_keys.empty()) { max = atoi(max_keys.c_str()); @@ -280,6 +279,7 @@ void RGWListBucket::execute() max = default_max; } url_decode(s->args.get("delimiter"), delimiter); + ret = rgwstore->list_objects(s->user.user_id, s->bucket_str, max, prefix, delimiter, marker, objs, common_prefixes); done: send_response(); diff --git a/src/rgw/rgw_rest_os.cc b/src/rgw/rgw_rest_os.cc index 7412a8cf1d925..c1d21396da013 100644 --- a/src/rgw/rgw_rest_os.cc +++ b/src/rgw/rgw_rest_os.cc @@ -59,32 +59,45 @@ void RGWListBucket_REST_OS::send_response() } vector::iterator iter = objs.begin(); + map::iterator pref_iter = common_prefixes.begin(); s->formatter->open_array_section("container"); - for (; iter != objs.end(); ++iter) { - if (!marker.empty() && iter->name.compare(marker) <= 0) { - /* we expect marker to be upper-bount, whereas lower layer uses marker - as the starting point (like S3) */ - continue; + while (iter != objs.end() || pref_iter != common_prefixes.end()) { + bool do_pref = false; + bool do_objs = false; + if (pref_iter == common_prefixes.end()) + do_objs = true; + else if (iter == objs.end()) + do_pref = true; + else if (iter->name.compare(pref_iter->first) == 0) { + do_objs = true; + pref_iter++; + } else if (iter->name.compare(pref_iter->first) <= 0) + do_objs = true; + else + do_pref = true; + + if (do_objs && (marker.empty() || iter->name.compare(marker) > 0)) { + s->formatter->open_obj_section("object"); + s->formatter->dump_value_str("name", iter->name.c_str()); + s->formatter->dump_value_str("hash", ""%s"", iter->etag); + s->formatter->dump_value_int("bytes", "%lld", iter->size); + dump_time(s, "last_modified", &iter->mtime); + s->formatter->close_section("object"); } - s->formatter->open_obj_section("object"); - s->formatter->dump_value_str("name", iter->name.c_str()); - s->formatter->dump_value_str("hash", ""%s"", iter->etag); - s->formatter->dump_value_int("bytes", "%lld", iter->size); - dump_time(s, "last_modified", &iter->mtime); - s->formatter->close_section("object"); - } -#if 0 - if (common_prefixes.size() > 0) { - s->formatter->open_array_section("CommonPrefixes"); - map::iterator pref_iter; - for (pref_iter = common_prefixes.begin(); pref_iter != common_prefixes.end(); ++pref_iter) { - s->formatter->dump_value_str("Prefix", pref_iter->first.c_str()); - } - s->formatter->close_section("CommonPrefixes"); + + if (do_pref && (marker.empty() || pref_iter->first.compare(marker) > 0)) { + s->formatter->open_obj_section("object"); + s->formatter->dump_value_str("name", pref_iter->first.c_str()); + s->formatter->close_section("object"); } -#endif + if (do_objs) + iter++; + else + pref_iter++; + } + s->formatter->close_section("container"); end_header(s); -- 2.39.5