Start port
[iotcloud.git] / version2 / src / C / TransactionPart.cc
diff --git a/version2/src/C/TransactionPart.cc b/version2/src/C/TransactionPart.cc
new file mode 100644 (file)
index 0000000..7931ae9
--- /dev/null
@@ -0,0 +1,137 @@
+
+
+class TransactionPart extends Entry {
+
+    // Max size of the part excluding the fixed size header
+    static final int MAX_NON_HEADER_SIZE = 512;
+
+    int64_t sequenceNumber = -1;
+    int64_t machineId = -1;
+    int64_t arbitratorId = -1;
+    int64_t clientLocalSequenceNumber = -1; // Sequence number of the transaction that this is a part of
+    int partNumber = -1; // Parts position in the
+    Boolean isLastPart = false;
+
+    Pair<Long, Long> transactionId = NULL;
+    Pair<Long, Integer> partId = NULL;
+
+    char[] data = NULL;
+
+    TransactionPart(Slot s, int64_t _machineId, int64_t _arbitratorId, int64_t _clientLocalSequenceNumber, int _partNumber, char[] _data, Boolean _isLastPart) {
+        super(s);
+        machineId = _machineId;
+        arbitratorId = _arbitratorId;
+        clientLocalSequenceNumber = _clientLocalSequenceNumber;
+        partNumber = _partNumber;
+        data = _data;
+        isLastPart = _isLastPart;
+
+        transactionId = new Pair<Long, Long>(machineId, clientLocalSequenceNumber);
+        partId = new Pair<Long, Integer>(clientLocalSequenceNumber, partNumber);
+
+    }
+
+    int getSize() {
+        if (data == NULL) {
+            return (4 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char));
+        }
+        return (4 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char)) + data.length;
+    }
+
+    void setSlot(Slot s) {
+        parentslot = s;
+    }
+
+    Pair<Long, Long> getTransactionId() {
+        return transactionId;
+    }
+
+    int64_t getArbitratorId() {
+        return arbitratorId;
+    }
+
+    Pair<Long, Integer> getPartId() {
+        return partId;
+    }
+
+    int getPartNumber() {
+        return partNumber;
+    }
+
+    int getDataSize() {
+        return data.length;
+    }
+
+    char[] getData() {
+        return data;
+    }
+
+    Boolean isLastPart() {
+        return isLastPart;
+    }
+
+    int64_t getMachineId() {
+        return machineId;
+    }
+
+    int64_t getClientLocalSequenceNumber() {
+        return clientLocalSequenceNumber;
+    }
+
+
+    int64_t getSequenceNumber() {
+        return sequenceNumber;
+    }
+
+    void setSequenceNumber(int64_t _sequenceNumber) {
+        sequenceNumber = _sequenceNumber;
+    }
+
+    static Entry decode(Slot s, ByteBuffer bb) {
+        int64_t sequenceNumber = bb.getLong();
+        int64_t machineId = bb.getLong();
+        int64_t arbitratorId = bb.getLong();
+        int64_t clientLocalSequenceNumber = bb.getLong();
+        int partNumber = bb.getInt();
+        int dataSize = bb.getInt();
+        Boolean isLastPart = (bb.get() == 1);
+        // Get the data
+        char[] data = new char[dataSize];
+        bb.get(data);
+
+        TransactionPart returnTransactionPart = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
+        returnTransactionPart.setSequenceNumber(sequenceNumber);
+
+        return returnTransactionPart;
+    }
+
+    void encode(ByteBuffer bb) {
+        bb.put(Entry.TypeTransactionPart);
+        bb.putLong(sequenceNumber);
+        bb.putLong(machineId);
+        bb.putLong(arbitratorId);
+        bb.putLong(clientLocalSequenceNumber);
+        bb.putInt(partNumber);
+        bb.putInt(data.length);
+
+        if (isLastPart) {
+            bb.put((char)1);
+        } else {
+            bb.put((char)0);
+        }
+
+        bb.put(data);
+    }
+
+    char getType() {
+        return Entry.TypeTransactionPart;
+    }
+
+    Entry getCopy(Slot s) {
+
+        TransactionPart copyTransaction = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
+        copyTransaction.setSequenceNumber(sequenceNumber);
+
+        return copyTransaction;
+    }
+}