From d29b3b77e6cf3949c2956bfe9e3dd0699ba6c2c2 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 31 May 2011 15:32:47 -0700 Subject: [PATCH] rgw: parser for multi upload completion --- src/Makefile.am | 2 ++ src/rgw/rgw_multi.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++ src/rgw/rgw_multi.h | 52 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 src/rgw/rgw_multi.cc create mode 100644 src/rgw/rgw_multi.h diff --git a/src/Makefile.am b/src/Makefile.am index ec6a47f76117b..e4f295e9b7b82 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -308,6 +308,7 @@ my_radosgw_src = \ rgw/rgw_os_auth.cc \ rgw/rgw_formats.cc \ rgw/rgw_log.cc \ + rgw/rgw_multi.cc \ rgw/rgw_escape.c my_radosgw_ldadd = \ @@ -1089,6 +1090,7 @@ noinst_HEADERS = \ rgw/rgw_formats.h\ rgw/rgw_fs.h\ rgw/rgw_log.h\ + rgw/rgw_multi.h\ rgw/rgw_op.h\ rgw/rgw_os.h\ rgw/rgw_os_auth.h\ diff --git a/src/rgw/rgw_multi.cc b/src/rgw/rgw_multi.cc new file mode 100644 index 0000000000000..74693feab62fa --- /dev/null +++ b/src/rgw/rgw_multi.cc @@ -0,0 +1,60 @@ +#include + +#include +#include + +#include "include/types.h" + +#include "rgw_xml.h" +#include "rgw_multi.h" + +using namespace std; + + +bool RGWMultiPart::xml_end(const char *el) +{ + RGWMultiPartNumber *num_obj = (RGWMultiPartNumber *)find_first("PartNumber"); + RGWMultiETag *etag_obj = (RGWMultiETag *)find_first("ETag"); + + if (!num_obj || !etag_obj) + return false; + + string s = num_obj->get_data(); + if (s.empty()) + return false; + + num = atoi(s.c_str()); + + s = etag_obj->get_data(); + etag = s; + + return true; +} + +bool RGWMultiCompleteUpload::xml_end(const char *el) { + XMLObjIter iter = find("Part"); + RGWMultiPart *part = (RGWMultiPart *)iter.get_next(); + while (part) { + int num = part->get_num(); + string etag = part->get_etag(); + parts[num] = etag; + } + return true; +} + + +XMLObj *RGWXMLParser::alloc_obj(const char *el) { + XMLObj * obj; + if (strcmp(el, "CompleteMultipartUpload") == 0) { + obj = new RGWMultiCompleteUpload(); + } else if (strcmp(el, "Part") == 0) { + obj = new RGWMultiPart(); + } else if (strcmp(el, "PartNumber") == 0) { + obj = new RGWMultiPartNumber(); + } else if (strcmp(el, "ETag") == 0) { + obj = new RGWMultiETag(); + } + + return obj; +} + diff --git a/src/rgw/rgw_multi.h b/src/rgw/rgw_multi.h new file mode 100644 index 0000000000000..f7dc482b411fe --- /dev/null +++ b/src/rgw/rgw_multi.h @@ -0,0 +1,52 @@ +#ifndef CEPH_RGW_MULTI_H +#define CEPH_RGW_MULTI_H + +#include +#include "rgw_xml.h" + +class RGWMultiCompleteUpload : public XMLObj +{ + std::map parts; +public: + RGWMultiCompleteUpload() {} + ~RGWMultiCompleteUpload() {} + bool xml_end(const char *el); + + std::map& get_parts() { return parts; } +}; + +class RGWMultiPart : public XMLObj +{ + string etag; + int num; +public: + RGWMultiPart() : num(0) {} + ~RGWMultiPart() {} + bool xml_end(const char *el); + + string& get_etag() { return etag; } + int get_num() { return num; } +}; + +class RGWMultiPartNumber : public XMLObj +{ +public: + RGWMultiPartNumber() {} + ~RGWMultiPartNumber() {} +}; + +class RGWMultiETag : public XMLObj +{ +public: + RGWMultiETag() {} + ~RGWMultiETag() {} +}; + +class RGWMultiXMLParser : public RGWXMLParser +{ + XMLObj *alloc_obj(const char *el); +public: + RGWMultiXMLParser() {} +}; + +#endif -- 2.39.5