Ref counting
[iotcloud.git] / version2 / src / C / CommitPart.cc
1 #include "CommitPart.h"
2 #include "ByteBuffer.h"
3
4 CommitPart::CommitPart(Slot *s, int64_t _machineId, int64_t _sequenceNumber, int64_t _transactionSequenceNumber, int _partNumber, Array<char> *_data, bool _isLastPart) :
5         Entry(s),
6         machineId(_machineId),
7         sequenceNumber(_sequenceNumber),
8         transactionSequenceNumber(_transactionSequenceNumber),
9         partNumber(_partNumber),
10         fldisLastPart(_isLastPart),
11         refCount(1),
12         data(_data),
13         partId(Pair<int64_t, int32_t>(sequenceNumber, partNumber)),
14         commitId(Pair<int64_t, int64_t>(machineId, sequenceNumber)) {
15 }
16
17 CommitPart::~CommitPart() {
18         delete data;
19 }
20
21 int CommitPart::getSize() {
22         if (data == NULL) {
23                 return (3 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char));
24         }
25         return (3 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char)) + data->length();
26 }
27
28 int CommitPart::getPartNumber() {
29         return partNumber;
30 }
31
32 int CommitPart::getDataSize() {
33         return data->length();
34 }
35
36 Array<char> *CommitPart::getData() {
37         return data;
38 }
39
40 Pair<int64_t, int32_t> * CommitPart::getPartId() {
41         return & partId;
42 }
43
44 Pair<int64_t, int64_t> CommitPart::getCommitId() {
45         return commitId;
46 }
47
48 bool CommitPart::isLastPart() {
49         return fldisLastPart;
50 }
51
52 int64_t CommitPart::getMachineId() {
53         return machineId;
54 }
55
56 int64_t CommitPart::getTransactionSequenceNumber() {
57         return transactionSequenceNumber;
58 }
59
60 int64_t CommitPart::getSequenceNumber() {
61         return sequenceNumber;
62 }
63
64 Entry *CommitPart_decode(Slot *s, ByteBuffer *bb) {
65         int64_t machineId = bb->getLong();
66         int64_t sequenceNumber = bb->getLong();
67         int64_t transactionSequenceNumber = bb->getLong();
68         int partNumber = bb->getInt();
69         int dataSize = bb->getInt();
70         bool isLastPart = bb->get() == 1;
71
72         // Get the data
73         Array<char> *data = new Array<char>(dataSize);
74         bb->get(data);
75
76         return new CommitPart(s, machineId, sequenceNumber, transactionSequenceNumber, partNumber, data, isLastPart);
77 }
78
79 void CommitPart::encode(ByteBuffer *bb) {
80         bb->put(TypeCommitPart);
81         bb->putLong(machineId);
82         bb->putLong(sequenceNumber);
83         bb->putLong(transactionSequenceNumber);
84         bb->putInt(partNumber);
85         bb->putInt(data->length());
86
87         if (fldisLastPart) {
88                 bb->put((char)1);
89         } else {
90                 bb->put((char)0);
91         }
92
93         bb->put(data);
94 }
95
96 char CommitPart::getType() {
97         return TypeCommitPart;
98 }
99
100 Entry *CommitPart::getCopy(Slot *s) {
101         return new CommitPart(s, machineId, sequenceNumber, transactionSequenceNumber, partNumber, new Array<char>(data), fldisLastPart);
102 }