edits
[iotcloud.git] / version2 / src / C / Commit.cc
index f159f71608c59bf74f427234cab8af797fee8ddc..e01a778c419643cfa93495c87cd042694b941891 100644 (file)
@@ -9,12 +9,12 @@ Commit::Commit() :
        missingParts(NULL),
        fldisComplete(false),
        hasLastPart(false),
-       keyValueUpdateSet(new Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue>()),
+       keyValueUpdateSet(new Hashset<KeyValue *, uintptr_t, 0>()),
        isDead(false),
        sequenceNumber(-1),
        machineId(-1),
        transactionSequenceNumber(-1),
-       liveKeys(new Hashset<IoTString *>) {
+       liveKeys(new Hashset<IoTString *>()) {
 }
 
 Commit::Commit(int64_t _sequenceNumber, int64_t _machineId, int64_t _transactionSequenceNumber) :
@@ -23,12 +23,27 @@ Commit::Commit(int64_t _sequenceNumber, int64_t _machineId, int64_t _transaction
        missingParts(NULL),
        fldisComplete(true),
        hasLastPart(false),
-       keyValueUpdateSet(new Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue>()),
+       keyValueUpdateSet(new Hashset<KeyValue *, uintptr_t, 0>()),
        isDead(false),
        sequenceNumber(_sequenceNumber),
        machineId(_machineId),
        transactionSequenceNumber(_transactionSequenceNumber),
-       liveKeys(new Hashset<IoTString *>) {
+       liveKeys(new Hashset<IoTString *>()) {
+}
+
+Commit::~Commit() {
+       delete parts;
+       {
+               SetIterator<KeyValue *, KeyValue *, uintptr_t, 0> * keyit = keyValueUpdateSet->iterator();
+               while(keyit->hasNext()) {
+                       delete keyit->next();
+               }
+               delete keyit;
+               delete keyValueUpdateSet;
+       }
+       delete liveKeys;
+       if (missingParts != NULL)
+               delete missingParts;
 }
 
 void Commit::addPartDecode(CommitPart *newPart) {
@@ -91,8 +106,9 @@ Vector<CommitPart *> *Commit::getParts() {
 }
 
 void Commit::addKV(KeyValue *kv) {
-       keyValueUpdateSet->add(kv);
-       liveKeys->add(kv->getKey());
+       KeyValue * kvcopy = kv->getCopy();
+       keyValueUpdateSet->add(kvcopy);
+       liveKeys->add(kvcopy->getKey());
 }
 
 void Commit::invalidateKey(IoTString *key) {
@@ -103,7 +119,7 @@ void Commit::invalidateKey(IoTString *key) {
        }
 }
 
-Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *Commit::getKeyValueUpdateSet() {
+Hashset<KeyValue *, uintptr_t, 0> *Commit::getKeyValueUpdateSet() {
        return keyValueUpdateSet;
 }
 
@@ -115,7 +131,7 @@ void Commit::setDead() {
        if (!isDead) {
                isDead = true;
                // Make all the parts of this transaction dead
-               for (int32_t partNumber = 0; partNumber < parts->size(); partNumber++) {
+               for (uint32_t partNumber = 0; partNumber < parts->size(); partNumber++) {
                        CommitPart *part = parts->get(partNumber);
                        if (parts != NULL)
                                part->setDead();
@@ -158,12 +174,13 @@ void Commit::createCommitParts() {
                commitPartCount++;
                remaining -= copySize;
        }
+       delete charData;
 }
 
 void Commit::decodeCommitData() {
        // Calculate the size of the data section
        int dataSize = 0;
-       for (int i = 0; i < parts->size(); i++) {
+       for (uint i = 0; i < parts->size(); i++) {
                CommitPart *tp = parts->get(i);
                if (tp != NULL)
                        dataSize += tp->getDataSize();
@@ -173,7 +190,7 @@ void Commit::decodeCommitData() {
        int currentPosition = 0;
 
        // Stitch all the data sections together
-       for (int i = 0; i < parts->size(); i++) {
+       for (uint i = 0; i < parts->size(); i++) {
                CommitPart *tp = parts->get(i);
                if (tp != NULL) {
                        System_arraycopy(tp->getData(), 0, combinedData, currentPosition, tp->getDataSize());
@@ -193,12 +210,13 @@ void Commit::decodeCommitData() {
                keyValueUpdateSet->add(kv);
                liveKeys->add(kv->getKey());
        }
+       delete bbDecode;
 }
 
 Array<char> *Commit::convertDataToBytes() {
        // Calculate the size of the data
        int sizeOfData = sizeof(int32_t);       // Number of Update KV's
-       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *kvit = keyValueUpdateSet->iterator();
+       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0> *kvit = keyValueUpdateSet->iterator();
        while (kvit->hasNext()) {
                KeyValue *kv = kvit->next();
                sizeOfData += kv->getSize();
@@ -219,17 +237,21 @@ Array<char> *Commit::convertDataToBytes() {
                kv->encode(bbEncode);
        }
        delete kvit;
-
-       return bbEncode->array();
+       Array<char> * array = bbEncode->array();
+       bbEncode->releaseArray();
+       delete bbEncode;
+       return array;
 }
 
-void Commit::setKVsMap(Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *newKVs) {
+void Commit::setKVsMap(Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, KeyValueEquals> *newKVs) {
        keyValueUpdateSet->clear();
-       keyValueUpdateSet->addAll(newKVs);
        liveKeys->clear();
-       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *kvit = newKVs->iterator();
+       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0, hashKeyValue, KeyValueEquals> *kvit = newKVs->iterator();
        while (kvit->hasNext()) {
-               liveKeys->add(kvit->next()->getKey());
+               KeyValue *kv = kvit->next();
+               KeyValue *kvcopy = kv->getCopy();
+               liveKeys->add(kvcopy->getKey());
+               keyValueUpdateSet->add(kvcopy);
        }
        delete kvit;
 }
@@ -240,8 +262,8 @@ Commit *Commit_merge(Commit *newer, Commit *older, int64_t newSequenceNumber) {
        } else if (newer == NULL) {
                return older;
        }
-       Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *kvSet = new Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue>();
-       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0, hashKeyValue, equalsKeyValue> *kvit = older->getKeyValueUpdateSet()->iterator();
+       Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, KeyValueEquals> *kvSet = new Hashset<KeyValue *, uintptr_t, 0, hashKeyValue, KeyValueEquals>();
+       SetIterator<KeyValue *, KeyValue *, uintptr_t, 0> *kvit = older->getKeyValueUpdateSet()->iterator();
        while (kvit->hasNext()) {
                KeyValue *kv = kvit->next();
                kvSet->add(kv);