]> git.proxmox.com Git - ceph.git/blame - ceph/src/cls/version/cls_version_client.cc
update sources to v12.1.0
[ceph.git] / ceph / src / cls / version / cls_version_client.cc
CommitLineData
7c673cae
FG
1#include <errno.h>
2
31f18b77 3#include "cls/version/cls_version_client.h"
7c673cae
FG
4#include "include/rados/librados.hpp"
5
6
7using namespace librados;
8
9
10void cls_version_set(librados::ObjectWriteOperation& op, obj_version& objv)
11{
12 bufferlist in;
13 cls_version_set_op call;
14 call.objv = objv;
15 ::encode(call, in);
16 op.exec("version", "set", in);
17}
18
19void cls_version_inc(librados::ObjectWriteOperation& op)
20{
21 bufferlist in;
22 cls_version_inc_op call;
23 ::encode(call, in);
24 op.exec("version", "inc", in);
25}
26
27void cls_version_inc(librados::ObjectWriteOperation& op, obj_version& objv, VersionCond cond)
28{
29 bufferlist in;
30 cls_version_inc_op call;
31 call.objv = objv;
32
33 obj_version_cond c;
34 c.cond = cond;
35 c.ver = objv;
36
37 call.conds.push_back(c);
38
39 ::encode(call, in);
40 op.exec("version", "inc_conds", in);
41}
42
43void cls_version_check(librados::ObjectOperation& op, obj_version& objv, VersionCond cond)
44{
45 bufferlist in;
46 cls_version_check_op call;
47 call.objv = objv;
48
49 obj_version_cond c;
50 c.cond = cond;
51 c.ver = objv;
52
53 call.conds.push_back(c);
54
55 ::encode(call, in);
56 op.exec("version", "check_conds", in);
57}
58
59class VersionReadCtx : public ObjectOperationCompletion {
60 obj_version *objv;
61public:
62 explicit VersionReadCtx(obj_version *_objv) : objv(_objv) {}
63 void handle_completion(int r, bufferlist& outbl) override {
64 if (r >= 0) {
65 cls_version_read_ret ret;
66 try {
67 bufferlist::iterator iter = outbl.begin();
68 ::decode(ret, iter);
69 *objv = ret.objv;
70 } catch (buffer::error& err) {
71 // nothing we can do about it atm
72 }
73 }
74 }
75};
76
77void cls_version_read(librados::ObjectReadOperation& op, obj_version *objv)
78{
79 bufferlist inbl;
80 op.exec("version", "read", inbl, new VersionReadCtx(objv));
81}
82
83int cls_version_read(librados::IoCtx& io_ctx, string& oid, obj_version *ver)
84{
85 bufferlist in, out;
86 int r = io_ctx.exec(oid, "version", "read", in, out);
87 if (r < 0)
88 return r;
89
90 cls_version_read_ret ret;
91 try {
92 bufferlist::iterator iter = out.begin();
93 ::decode(ret, iter);
94 } catch (buffer::error& err) {
95 return -EIO;
96 }
97
98 *ver = ret.objv;
99
100 return r;
101}