Ref counting
[iotcloud.git] / version2 / src / C / PendingTransaction.cc
index be7575f7e9aac70bf87ba2f0108408f411b1d0ee..c0d32a37e3c8d155f203733d2086c3538329626c 100644 (file)
@@ -27,7 +27,7 @@ void PendingTransaction::addKV(KeyValue *newKV) {
        KeyValue *rmKV = NULL;
 
        // Make sure there are no duplicates
-       SetIterator<KeyValue *> *kvit = keyValueUpdateSet->iterator();
+       SetIterator<KeyValue *, KeyValue *> *kvit = keyValueUpdateSet->iterator();
        while (kvit->hasNext()) {
                KeyValue *kv = kvit->next();
                if (kv->getKey()->equals(newKV->getKey())) {
@@ -71,7 +71,7 @@ bool PendingTransaction::checkArbitrator(int64_t arb) {
 }
 
 bool PendingTransaction::evaluateGuard(Hashtable<IoTString *, KeyValue *> *keyValTableCommitted, Hashtable<IoTString *, KeyValue *> *keyValTableSpeculative, Hashtable<IoTString *, KeyValue *> *keyValTablePendingTransSpeculative) {
-       SetIterator<KeyValue *> *kvit = keyValueGuardSet->iterator();
+       SetIterator<KeyValue *, KeyValue *> *kvit = keyValueGuardSet->iterator();
        while (kvit->hasNext()) {
                KeyValue *kvGuard = kvit->next();
                // First check if the key is in the speculative table, this is the
@@ -116,7 +116,7 @@ Transaction *PendingTransaction::createTransaction() {
        Array<char> *charData = convertDataToBytes();
 
        int currentPosition = 0;
-       for(int remaining = charData->length(); remaining > 0;) {
+       for (int remaining = charData->length(); remaining > 0;) {
                bool isLastPart = false;
                // determine how much to copy
                int copySize = TransactionPart_MAX_NON_HEADER_SIZE;
@@ -124,22 +124,24 @@ Transaction *PendingTransaction::createTransaction() {
                        copySize = remaining;
                        isLastPart = true;//last bit of data so last part
                }
-               
+
                // Copy to a smaller version
                Array<char> *partData = new Array<char>(copySize);
                System_arraycopy(charData, currentPosition, partData, 0, copySize);
 
                TransactionPart *part = new TransactionPart(NULL, machineId, arbitrator, clientLocalSequenceNumber, transactionPartCount, partData, isLastPart);
                newTransaction->addPartEncode(part);
-
+               part->releaseRef();
+               
                // Update position, count and remaining
                currentPosition += copySize;
                transactionPartCount++;
                remaining -= copySize;
        }
-
+       delete charData;
+       
        // Add the Guard Conditions
-       SetIterator<KeyValue *> *kvit = keyValueGuardSet->iterator();
+       SetIterator<KeyValue *, KeyValue *> *kvit = keyValueGuardSet->iterator();
        while (kvit->hasNext()) {
                KeyValue *kv = kvit->next();
                newTransaction->addGuardKV(kv);
@@ -170,7 +172,7 @@ Array<char> *PendingTransaction::convertDataToBytes() {
        bbEncode->putInt(keyValueUpdateSet->size());
 
        // Encode all the guard conditions
-       SetIterator<KeyValue *> *kvit = keyValueGuardSet->iterator();
+       SetIterator<KeyValue *, KeyValue *> *kvit = keyValueGuardSet->iterator();
        while (kvit->hasNext()) {
                KeyValue *kv = kvit->next();
                kv->encode(bbEncode);
@@ -185,5 +187,8 @@ Array<char> *PendingTransaction::convertDataToBytes() {
        }
        delete kvit;
 
-       return bbEncode->array();
+       Array<char> *array = bbEncode->array();
+       bbEncode->releaseArray();
+       delete bbEncode;
+       return array;
 }