edits
[iotcloud.git] / version2 / src / C / TransactionPart.cc
1
2
3 class TransactionPart extends Entry {
4
5         // Max size of the part excluding the fixed size header
6         static final int MAX_NON_HEADER_SIZE = 512;
7
8         int64_t sequenceNumber = -1;
9         int64_t machineId = -1;
10         int64_t arbitratorId = -1;
11         int64_t clientLocalSequenceNumber = -1;         // Sequence number of the transaction that this is a part of
12         int partNumber = -1;    // Parts position in the
13         bool isLastPart = false;
14
15         Pair<int64_t, int64_t> transactionId = NULL;
16         Pair<int64_t int32_t> partId = NULL;
17
18         char[] data = NULL;
19
20         TransactionPart(Slot s, int64_t _machineId, int64_t _arbitratorId, int64_t _clientLocalSequenceNumber, int _partNumber, char[] _data, bool _isLastPart) {
21                 super(s);
22                 machineId = _machineId;
23                 arbitratorId = _arbitratorId;
24                 clientLocalSequenceNumber = _clientLocalSequenceNumber;
25                 partNumber = _partNumber;
26                 data = _data;
27                 isLastPart = _isLastPart;
28
29                 transactionId = new Pair<int64_t, int64_t>(machineId, clientLocalSequenceNumber);
30                 partId = new Pair<int64_t int32_t>(clientLocalSequenceNumber, partNumber);
31
32         }
33
34         int getSize() {
35                 if (data == NULL) {
36                         return (4 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char));
37                 }
38                 return (4 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char)) + data.length;
39         }
40
41         void setSlot(Slot s) {
42                 parentslot = s;
43         }
44
45         Pair<int64_t, int64_t> getTransactionId() {
46                 return transactionId;
47         }
48
49         int64_t getArbitratorId() {
50                 return arbitratorId;
51         }
52
53         Pair<int64_t int32_t> getPartId() {
54                 return partId;
55         }
56
57         int getPartNumber() {
58                 return partNumber;
59         }
60
61         int getDataSize() {
62                 return data.length;
63         }
64
65         char[] getData() {
66                 return data;
67         }
68
69         bool isLastPart() {
70                 return isLastPart;
71         }
72
73         int64_t getMachineId() {
74                 return machineId;
75         }
76
77         int64_t getClientLocalSequenceNumber() {
78                 return clientLocalSequenceNumber;
79         }
80
81
82         int64_t getSequenceNumber() {
83                 return sequenceNumber;
84         }
85
86         void setSequenceNumber(int64_t _sequenceNumber) {
87                 sequenceNumber = _sequenceNumber;
88         }
89
90         static Entry decode(Slot s, ByteBuffer bb) {
91                 int64_t sequenceNumber = bb->getLong();
92                 int64_t machineId = bb->getLong();
93                 int64_t arbitratorId = bb->getLong();
94                 int64_t clientLocalSequenceNumber = bb->getLong();
95                 int partNumber = bb->getInt();
96                 int dataSize = bb->getInt();
97                 bool isLastPart = (bb->get() == 1);
98                 // Get the data
99                 char[] data = new char[dataSize];
100                 bb->get(data);
101
102                 TransactionPart returnTransactionPart = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
103                 returnTransactionPart.setSequenceNumber(sequenceNumber);
104
105                 return returnTransactionPart;
106         }
107
108         void encode(ByteBuffer bb) {
109                 bb->put(Entry.TypeTransactionPart);
110                 bb->putLong(sequenceNumber);
111                 bb->putLong(machineId);
112                 bb->putLong(arbitratorId);
113                 bb->putLong(clientLocalSequenceNumber);
114                 bb->putInt(partNumber);
115                 bb->putInt(data.length);
116
117                 if (isLastPart) {
118                         bb->put((char)1);
119                 } else {
120                         bb->put((char)0);
121                 }
122
123                 bb->put(data);
124         }
125
126         char getType() {
127                 return Entry.TypeTransactionPart;
128         }
129
130         Entry getCopy(Slot s) {
131
132                 TransactionPart copyTransaction = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
133                 copyTransaction.setSequenceNumber(sequenceNumber);
134
135                 return copyTransaction;
136         }
137 }