]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #ifndef CEPH_RGW_MULTI_H | |
5 | #define CEPH_RGW_MULTI_H | |
6 | ||
7 | #include <map> | |
8 | #include "rgw_xml.h" | |
9 | #include "rgw_rados.h" | |
10 | ||
11 | #define MP_META_SUFFIX ".meta" | |
12 | #define MULTIPART_UPLOAD_ID_PREFIX_LEGACY "2/" | |
13 | #define MULTIPART_UPLOAD_ID_PREFIX "2~" // must contain a unique char that may not come up in gen_rand_alpha() | |
14 | ||
15 | class RGWMultiCompleteUpload : public XMLObj | |
16 | { | |
17 | public: | |
18 | RGWMultiCompleteUpload() {} | |
19 | ~RGWMultiCompleteUpload() override {} | |
20 | bool xml_end(const char *el) override; | |
21 | ||
22 | std::map<int, string> parts; | |
23 | }; | |
24 | ||
25 | class RGWMultiPart : public XMLObj | |
26 | { | |
27 | string etag; | |
28 | int num; | |
29 | public: | |
30 | RGWMultiPart() : num(0) {} | |
31 | ~RGWMultiPart() override {} | |
32 | bool xml_end(const char *el) override; | |
33 | ||
34 | string& get_etag() { return etag; } | |
35 | int get_num() { return num; } | |
36 | }; | |
37 | ||
38 | class RGWMultiPartNumber : public XMLObj | |
39 | { | |
40 | public: | |
41 | RGWMultiPartNumber() {} | |
42 | ~RGWMultiPartNumber() override {} | |
43 | }; | |
44 | ||
45 | class RGWMultiETag : public XMLObj | |
46 | { | |
47 | public: | |
48 | RGWMultiETag() {} | |
49 | ~RGWMultiETag() override {} | |
50 | }; | |
51 | ||
52 | class RGWMultiXMLParser : public RGWXMLParser | |
53 | { | |
54 | XMLObj *alloc_obj(const char *el) override; | |
55 | public: | |
56 | RGWMultiXMLParser() {} | |
57 | ~RGWMultiXMLParser() override {} | |
58 | }; | |
59 | ||
60 | class MultipartMetaFilter : public RGWAccessListFilter { | |
61 | public: | |
62 | MultipartMetaFilter() {} | |
63 | bool filter(string& name, string& key) override { | |
64 | int len = name.size(); | |
65 | if (len < 6) | |
66 | return false; | |
67 | ||
68 | size_t pos = name.find(MP_META_SUFFIX, len - 5); | |
69 | if (pos == string::npos) | |
70 | return false; | |
71 | ||
72 | pos = name.rfind('.', pos - 1); | |
73 | if (pos == string::npos) | |
74 | return false; | |
75 | ||
76 | key = name.substr(0, pos); | |
77 | ||
78 | return true; | |
79 | } | |
80 | }; | |
81 | ||
82 | extern bool is_v2_upload_id(const string& upload_id); | |
83 | ||
84 | extern int list_multipart_parts(RGWRados *store, RGWBucketInfo& bucket_info, CephContext *cct, | |
85 | const string& upload_id, | |
86 | string& meta_oid, int num_parts, | |
87 | int marker, map<uint32_t, RGWUploadPartInfo>& parts, | |
88 | int *next_marker, bool *truncated, | |
89 | bool assume_unsorted = false); | |
90 | ||
91 | extern int list_multipart_parts(RGWRados *store, struct req_state *s, | |
92 | const string& upload_id, | |
93 | string& meta_oid, int num_parts, | |
94 | int marker, map<uint32_t, RGWUploadPartInfo>& parts, | |
95 | int *next_marker, bool *truncated, | |
96 | bool assume_unsorted = false); | |
97 | ||
98 | extern int abort_multipart_upload(RGWRados *store, CephContext *cct, RGWObjectCtx *obj_ctx, | |
99 | RGWBucketInfo& bucket_info, RGWMPObj& mp_obj); | |
100 | ||
101 | #endif |