diff --git a/symmetric-client-clib-test/src/util/MapTest.c b/symmetric-client-clib-test/src/util/MapTest.c index a9990db128..fcea6953ca 100644 --- a/symmetric-client-clib-test/src/util/MapTest.c +++ b/symmetric-client-clib-test/src/util/MapTest.c @@ -288,6 +288,19 @@ void SymMapTest_testKeysMultiValue() { } } +void SymMapTest_testRemove() { + int mapSize = 16; + SymMap *map = SymMap_new(NULL, mapSize); + int i; + for (i = 0; i < mapSize; i++) { + map->put(map, SymStringUtils_format("%d", i), SymStringUtils_format("value %d", i)); + } + for (i = 0; i < mapSize; i++) { + map->remove(map, SymStringUtils_format("%d", i)); + } + + map->remove(map, "1"); +} int SymMapTest_CUnit() { CU_pSuite suite = CU_add_suite("SymMapTest", NULL, NULL); @@ -306,7 +319,9 @@ int SymMapTest_CUnit() { CU_add_test(suite, "SymMapTest_testEntriesMultiValue", SymMapTest_testEntriesMultiValue) == NULL || CU_add_test(suite, "SymMapTest_testKeysEmpty", SymMapTest_testKeysEmpty) == NULL || CU_add_test(suite, "SymMapTest_testKeysSingleValue", SymMapTest_testKeysSingleValue) == NULL || - CU_add_test(suite, "SymMapTest_testKeysMultiValue", SymMapTest_testKeysMultiValue) == NULL + CU_add_test(suite, "SymMapTest_testKeysMultiValue", SymMapTest_testKeysMultiValue) == NULL || + CU_add_test(suite, "SymMapTest_testRemove", SymMapTest_testRemove) == NULL || + 1==0 ) { return CUE_NOTEST; diff --git a/symmetric-client-clib/inc/db/sqlite/SqliteSqlTransaction.h b/symmetric-client-clib/inc/db/sqlite/SqliteSqlTransaction.h index 8f18f1c248..b089eb3334 100644 --- a/symmetric-client-clib/inc/db/sqlite/SqliteSqlTransaction.h +++ b/symmetric-client-clib/inc/db/sqlite/SqliteSqlTransaction.h @@ -35,7 +35,6 @@ typedef struct SymSqliteSqlTransaction { sqlite3_stmt *stmt; char *sql; unsigned short inTransaction; - void (*destroy)(struct SymSqliteSqlTransaction *this); } SymSqliteSqlTransaction; SymSqliteSqlTransaction * SymSqliteSqlTransaction_new(SymSqliteSqlTransaction *this, SymSqliteSqlTemplate *sqlTemplate); diff --git a/symmetric-client-clib/inc/model/Trigger.h b/symmetric-client-clib/inc/model/Trigger.h index 37498aac42..8e0548dc17 100644 --- a/symmetric-client-clib/inc/model/Trigger.h +++ b/symmetric-client-clib/inc/model/Trigger.h @@ -76,5 +76,6 @@ typedef struct SymTrigger { } SymTrigger; SymTrigger * SymTrigger_new(SymTrigger *this); +void SymTrigger_destroy(SymTrigger *this); #endif /* SYM_MODEL_TRIGGER_H */ diff --git a/symmetric-client-clib/inc/model/TriggerHistory.h b/symmetric-client-clib/inc/model/TriggerHistory.h index e4615e1505..a496481263 100644 --- a/symmetric-client-clib/inc/model/TriggerHistory.h +++ b/symmetric-client-clib/inc/model/TriggerHistory.h @@ -65,4 +65,6 @@ SymTriggerHistory * SymTriggerHistory_new(SymTriggerHistory *this); SymTriggerHistory * SymTriggerHistory_newWithId(SymTriggerHistory *this, int triggerHistoryId); +void SymTriggerHistory_destroy(SymTriggerHistory *this); + #endif diff --git a/symmetric-client-clib/inc/model/TriggerRouter.h b/symmetric-client-clib/inc/model/TriggerRouter.h index 8e5c4e95f1..2d754da603 100644 --- a/symmetric-client-clib/inc/model/TriggerRouter.h +++ b/symmetric-client-clib/inc/model/TriggerRouter.h @@ -46,5 +46,6 @@ typedef struct SymTriggerRouter { } SymTriggerRouter; SymTriggerRouter * SymTriggerRouter_new(SymTriggerRouter *this); +void SymTriggerRouter_destroy(SymTriggerRouter *this); #endif diff --git a/symmetric-client-clib/src/core/SymEngine.c b/symmetric-client-clib/src/core/SymEngine.c index f079ad7306..bb3c94c28c 100644 --- a/symmetric-client-clib/src/core/SymEngine.c +++ b/symmetric-client-clib/src/core/SymEngine.c @@ -149,6 +149,7 @@ void SymEngine_destroy(SymEngine *this) { this->dataService->destroy(this->dataService); this->nodeService->destroy(this->nodeService); this->parameterService->destroy(this->parameterService); + this->sequenceService->destroy(this->sequenceService); free(this); } diff --git a/symmetric-client-clib/src/db/model/Table.c b/symmetric-client-clib/src/db/model/Table.c index 6be24ccd40..fe1faeaf19 100644 --- a/symmetric-client-clib/src/db/model/Table.c +++ b/symmetric-client-clib/src/db/model/Table.c @@ -179,10 +179,10 @@ SymList * SymTable_getPrimaryKeyColumns(SymTable *this) { } void SymTable_destroy(SymTable *this) { - free(this->name); - free(this->catalog); - free(this->schema); - this->columns->destroy(this->columns); +// free(this->name); probably stack memory. +// free(this->catalog); +// free(this->schema); + this->columns->destroyAll(this->columns, (void *)SymColumn_destroy); free(this); } diff --git a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTransaction.c b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTransaction.c index d155b69fff..e19effe090 100644 --- a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTransaction.c +++ b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTransaction.c @@ -144,6 +144,6 @@ SymSqliteSqlTransaction * SymSqliteSqlTransaction_new(SymSqliteSqlTransaction *t super->commit = (void *) &SymSqliteSqlTransaction_commit; super->rollback = (void *) &SymSqliteSqlTransaction_rollback; super->close = (void *) &SymSqliteSqlTransaction_close; - this->destroy = (void *) &SymSqliteSqlTransaction_destroy; + super->destroy = (void *) &SymSqliteSqlTransaction_destroy; return this; } diff --git a/symmetric-client-clib/src/model/Channel.c b/symmetric-client-clib/src/model/Channel.c index b9503882c7..86db633936 100644 --- a/symmetric-client-clib/src/model/Channel.c +++ b/symmetric-client-clib/src/model/Channel.c @@ -21,6 +21,12 @@ #include "model/Channel.h" void SymChannel_destroy(SymChannel *this) { + if (this->createTime) { + free(this->createTime); + } + if (this->lastUpdateTime) { + free(this->lastUpdateTime); + } free(this); } diff --git a/symmetric-client-clib/src/model/Sequence.c b/symmetric-client-clib/src/model/Sequence.c index a6e9fe9891..2314d0402d 100644 --- a/symmetric-client-clib/src/model/Sequence.c +++ b/symmetric-client-clib/src/model/Sequence.c @@ -21,15 +21,9 @@ #include "model/Sequence.h" void SymSequence_destroy(SymSequence *this) { - if (this->sequenceName) { - free(this->sequenceName); - } if (this->createTime) { this->createTime->destroy(this->createTime); } - if (this->lastUpdateBy) { - free(this->lastUpdateBy); - } if (this->lastUpdateTime) { this->lastUpdateTime->destroy(this->lastUpdateTime); } diff --git a/symmetric-client-clib/src/model/TriggerHistory.c b/symmetric-client-clib/src/model/TriggerHistory.c index 555dbb0335..dec2e58c51 100644 --- a/symmetric-client-clib/src/model/TriggerHistory.c +++ b/symmetric-client-clib/src/model/TriggerHistory.c @@ -65,7 +65,7 @@ void SymTriggerHistory_destroy(SymTriggerHistory *this) { // Being selective here based on Valgrind reports and testing that // shows other fields are static memory or really owned by someone else. if (this->sourceTableName) { - free(this->sourceTableName); + // free(this->sourceTableName); } if (this->nameForInsertTrigger) { free(this->nameForInsertTrigger); diff --git a/symmetric-client-clib/src/service/RouterService.c b/symmetric-client-clib/src/service/RouterService.c index 7f2d943188..30efb6701e 100644 --- a/symmetric-client-clib/src/service/RouterService.c +++ b/symmetric-client-clib/src/service/RouterService.c @@ -216,7 +216,7 @@ static int SymRouterService_routeDataForChannel(SymRouterService *this, SymChann context->statInsertDataEventsMs += ((time(NULL) - insertTs) * 1000); } - // sqlTrans->destroy(sqlTrans); + sqlTrans->destroy(sqlTrans); context->destroy(context); return dataCount; } @@ -237,7 +237,8 @@ static int SymRouterService_routeDataForEachChannel(SymRouterService *this) { } iter->destroy(iter); channelList->destroy(channelList); - channels->destroy(channels); +// channels->destroy(channels); + channels->destroyAll(channels, (void *)SymChannel_destroy); return dataCount; } diff --git a/symmetric-client-clib/src/service/TriggerRouterService.c b/symmetric-client-clib/src/service/TriggerRouterService.c index ab923f5ee6..f7de6c366a 100644 --- a/symmetric-client-clib/src/service/TriggerRouterService.c +++ b/symmetric-client-clib/src/service/TriggerRouterService.c @@ -306,11 +306,7 @@ static SymList * buildTriggersForSymmetricTables(SymTriggerRouterService *this, triggers->add(triggers, trigger); } - if (definedTriggers->size > 0) { - definedTriggers->destroyAll(definedTriggers, (void *)((SymTrigger*)triggers->head)->destroy); - } else { - definedTriggers->destroy(definedTriggers); - } + definedTriggers->destroyAll(definedTriggers, (void *)SymTrigger_destroy); tables->destroy(tables); iter->destroy(iter); @@ -404,7 +400,10 @@ SymTriggerHistory * SymTriggerRouterService_getNewestTriggerHistoryForTrigger(Sy } args->destroy(args); - triggerHistories->destroyAll(triggerHistories, (void *) result->destroy); + if (result) { + triggerHistories->destroyAll(triggerHistories, (void *) result->destroy); + } + return result; } @@ -512,7 +511,7 @@ SymList * SymTriggerRouterService_getTriggersToSync(SymTriggerRouterService *thi } } - triggerRouters->destroy(triggerRouters); + triggerRouters->destroyAll(triggerRouters, (void *)SymTriggerRouter_destroy); return triggers; } @@ -615,7 +614,9 @@ char * SymTriggerRouterService_getTriggerName(SymTriggerRouterService *this, Sym // triggerSuffix2 = replaceCharsToShortenName(table.getName()); // } - char *triggerSuffix3 = SymTriggerRouterService_replaceCharsToShortenName(this, SymStringUtils_format("%s%s", "_", this->parameterService->getNodeGroupId(this->parameterService))); + char* triggerSuffix3Temp = SymStringUtils_format("%s%s", "_", this->parameterService->getNodeGroupId(this->parameterService)); + char *triggerSuffix3 = SymTriggerRouterService_replaceCharsToShortenName(this, triggerSuffix3Temp); + free(triggerSuffix3Temp); triggerName = SymStringUtils_format("%s%s%s%s", triggerPrefix1, triggerSuffix1, triggerSuffix2, triggerSuffix3); @@ -854,15 +855,16 @@ void SymTriggerRouterService_syncTriggers(SymTriggerRouterService *this, unsigne trigger->sourceCatalogName, trigger->sourceSchemaName, trigger->sourceTableName, 1); if (table) { SymTriggerRouterService_updateOrCreateDatabaseTriggers(this, trigger, table, activeTriggerHistories, force); + table->destroy(table); // TODO should not do this when the the cache is fully implemented. } else { SymLog_error("No table '%s' found for trigger. ", trigger->sourceTableName); } } - symmetricTableTriggers->destroy(symmetricTableTriggers); - triggers->destroy(triggers); - activeTriggerHistories->destroy(activeTriggerHistories); + symmetricTableTriggers->destroy(symmetricTableTriggers); // shallow destroy here because these objects are also in 'triggers'. + triggers->destroyAll(triggers, (void *)SymTrigger_destroy); + activeTriggerHistories->destroyAll(activeTriggerHistories, (void *)SymTriggerHistory_destroy); } } diff --git a/symmetric-client-clib/src/util/Properties.c b/symmetric-client-clib/src/util/Properties.c index cb96a2da10..9550ed5325 100644 --- a/symmetric-client-clib/src/util/Properties.c +++ b/symmetric-client-clib/src/util/Properties.c @@ -138,9 +138,12 @@ SymProperties * SymProperties_newWithFile(SymProperties *this, char *argPath) { buff->append(buff, inputBuffer); } - this = SymProperties_newWithString(NULL, buff->destroyAndReturn(buff)); + char *fileContentsRaw = buff->destroyAndReturn(buff); + this = SymProperties_newWithString(NULL, fileContentsRaw); fclose(file); + free(fileContentsRaw); + return this; }