]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | #include "cyan_object.h" |
2 | #include "include/encoding.h" | |
3 | ||
4 | namespace ceph::os { | |
5 | ||
6 | size_t Object::get_size() const { | |
7 | return data.length(); | |
8 | } | |
9 | ||
10 | int Object::read(uint64_t offset, uint64_t len, bufferlist &bl) | |
11 | { | |
12 | bl.substr_of(data, offset, len); | |
13 | return bl.length(); | |
14 | } | |
15 | ||
16 | int Object::write(uint64_t offset, const bufferlist &src) | |
17 | { | |
18 | unsigned len = src.length(); | |
19 | // before | |
20 | bufferlist newdata; | |
21 | if (get_size() >= offset) { | |
22 | newdata.substr_of(data, 0, offset); | |
23 | } else { | |
24 | if (get_size()) { | |
25 | newdata.substr_of(data, 0, get_size()); | |
26 | } | |
27 | newdata.append_zero(offset - get_size()); | |
28 | } | |
29 | ||
30 | newdata.append(src); | |
31 | ||
32 | // after | |
33 | if (get_size() > offset + len) { | |
34 | bufferlist tail; | |
35 | tail.substr_of(data, offset + len, get_size() - (offset + len)); | |
36 | newdata.append(tail); | |
37 | } | |
38 | ||
39 | data.claim(newdata); | |
40 | return 0; | |
41 | } | |
42 | ||
43 | int Object::clone(Object *src, uint64_t srcoff, uint64_t len, | |
44 | uint64_t dstoff) | |
45 | { | |
46 | bufferlist bl; | |
47 | if (srcoff == dstoff && len == src->get_size()) { | |
48 | data = src->data; | |
49 | return 0; | |
50 | } | |
51 | bl.substr_of(src->data, srcoff, len); | |
52 | return write(dstoff, bl); | |
53 | ||
54 | } | |
55 | ||
56 | int Object::truncate(uint64_t size) | |
57 | { | |
58 | if (get_size() > size) { | |
59 | bufferlist bl; | |
60 | bl.substr_of(data, 0, size); | |
61 | data.claim(bl); | |
62 | } else if (get_size() == size) { | |
63 | // do nothing | |
64 | } else { | |
65 | data.append_zero(size - get_size()); | |
66 | } | |
67 | return 0; | |
68 | } | |
69 | ||
70 | void Object::encode(bufferlist& bl) const { | |
71 | ENCODE_START(1, 1, bl); | |
72 | encode(data, bl); | |
73 | encode(xattr, bl); | |
74 | encode(omap_header, bl); | |
75 | encode(omap, bl); | |
76 | ENCODE_FINISH(bl); | |
77 | } | |
78 | ||
79 | void Object::decode(bufferlist::const_iterator& p) { | |
80 | DECODE_START(1, p); | |
81 | decode(data, p); | |
82 | decode(xattr, p); | |
83 | decode(omap_header, p); | |
84 | decode(omap, p); | |
85 | DECODE_FINISH(p); | |
86 | } | |
87 | ||
88 | } |