From ad9e4935f37794c114cf3704f97e21ddd1d4f515 Mon Sep 17 00:00:00 2001 From: elong Date: Mon, 26 Oct 2015 16:53:48 -0400 Subject: [PATCH] change map to contain objects instead of copying them --- symmetric-client-clib-test/src/util/MapTest.c | 10 +-- symmetric-client-clib/inc/db/sql/Row.h | 2 + .../inc/db/sql/mapper/RowMapper.h | 3 + .../inc/service/TriggerRouterService.h | 5 +- symmetric-client-clib/inc/util/Map.h | 8 +- .../db/platform/sqlite/SqliteSqlTemplate.c | 6 +- symmetric-client-clib/src/db/sql/Row.c | 32 ++++---- .../src/db/sql/mapper/RowMapper.c | 15 +++- .../src/io/reader/ProtocolDataReader.c | 2 +- .../src/io/writer/DefaultDatabaseWriter.c | 4 +- .../src/io/writer/ProtocolDataWriter.c | 5 +- .../src/service/ConfigurationService.c | 4 +- .../src/service/NodeService.c | 2 +- .../src/service/RouterService.c | 6 +- .../src/service/TriggerRouterService.c | 42 +++++----- .../src/transport/http/HttpTransportManager.c | 2 +- symmetric-client-clib/src/util/Map.c | 77 ++++++++----------- 17 files changed, 112 insertions(+), 113 deletions(-) diff --git a/symmetric-client-clib-test/src/util/MapTest.c b/symmetric-client-clib-test/src/util/MapTest.c index 377ec64bb6..a9990db128 100644 --- a/symmetric-client-clib-test/src/util/MapTest.c +++ b/symmetric-client-clib-test/src/util/MapTest.c @@ -24,7 +24,7 @@ static SymMap * SymMapTest_test_createStringMap(int keySize, char **keys, char * SymMap *map = SymMap_new(NULL, mapSize); int i; for (i = 0; i < keySize; i++) { - map->put(map, keys[i], values[i], strlen(values[i])); + map->put(map, keys[i], values[i]); } return map; } @@ -72,7 +72,7 @@ void SymMapTest_test3() { } SymMap *map = SymMap_new(NULL, 100); - map->put(map, table->name, table, sizeof(SymTable)); + map->put(map, table->name, table); SymTable *out = map->get(map, table->name); CU_ASSERT(out != NULL); @@ -139,7 +139,7 @@ void SymMapTest_testValuesEmpty() { void SymMapTest_testValuesSingleValue() { SymMap *map = SymMap_new(NULL, 100); - map->put(map, "key1", "value1", sizeof(char*)); + map->put(map, "key1", "value1"); SymList *valuesList = map->values(map); CU_ASSERT(strcmp(valuesList->get(valuesList, 0), "value1") == 0); @@ -190,7 +190,7 @@ void SymMapTest_testEntriesEmpty() { void SymMapTest_testEntriesSingleValue() { SymMap *map = SymMap_new(NULL, 100); - map->put(map, "key1", "value1", sizeof(char*)); + map->put(map, "key1", "value1"); SymList *entryList = map->entries(map); CU_ASSERT(strcmp(((SymMapEntry*)entryList->get(entryList, 0))->key, "key1") == 0); @@ -249,7 +249,7 @@ void SymMapTest_testKeysEmpty() { void SymMapTest_testKeysSingleValue() { SymMap *map = SymMap_new(NULL, 100); - map->put(map, "key1", "value1", sizeof(char*)); + map->put(map, "key1", "value1"); SymStringArray *keyList = map->keys(map); CU_ASSERT(strcmp(keyList->get(keyList, 0), "key1") == 0); diff --git a/symmetric-client-clib/inc/db/sql/Row.h b/symmetric-client-clib/inc/db/sql/Row.h index 664dc66884..761fc666ab 100644 --- a/symmetric-client-clib/inc/db/sql/Row.h +++ b/symmetric-client-clib/inc/db/sql/Row.h @@ -54,5 +54,7 @@ typedef struct SymRow { } SymRow; SymRow * SymRow_new(SymRow *this, int columnCount); +SymRowEntry * SymRowEntry_new(char *value, int sqlType, int size); +void SymRowEntry_destroy(SymRowEntry *this); #endif diff --git a/symmetric-client-clib/inc/db/sql/mapper/RowMapper.h b/symmetric-client-clib/inc/db/sql/mapper/RowMapper.h index bea491d0ac..feeeac49d5 100644 --- a/symmetric-client-clib/inc/db/sql/mapper/RowMapper.h +++ b/symmetric-client-clib/inc/db/sql/mapper/RowMapper.h @@ -23,7 +23,10 @@ #include #include +#include #include "db/sql/Row.h" +#include "util/List.h" +#include "util/Map.h" SymRow * SymRowMapper_mapper(SymRow *row); diff --git a/symmetric-client-clib/inc/service/TriggerRouterService.h b/symmetric-client-clib/inc/service/TriggerRouterService.h index 6252ff22ed..8e89bb30f3 100644 --- a/symmetric-client-clib/inc/service/TriggerRouterService.h +++ b/symmetric-client-clib/inc/service/TriggerRouterService.h @@ -86,10 +86,9 @@ SymTriggerRouterService * SymTriggerRouterService_new(SymTriggerRouterService *t SymConfigurationService *configurationService, SymSequenceService *sequenceService, SymParameterService *parameterService, SymDatabasePlatform *platform, SymDialect *symmetricDialect); -#define SYM_SQL_SELECT_TRIGGER_ROUTERS "select tr.trigger_id, tr.router_id, tr.create_time, tr.last_update_time, tr.last_update_by, tr.initial_load_order, tr.initial_load_select, tr.initial_load_delete_stmt, tr.initial_load_batch_count, tr.ping_back_enabled, tr.enabled \ -from sym_trigger_router tr \ +#define SYM_SQL_SELECT_TRIGGER_ROUTERS "from sym_trigger_router tr \ inner join sym_trigger t on tr.trigger_id=t.trigger_id \ -inner join sym_router r on tr.router_id=r.router_id " +inner join sym_router r on tr.router_id=r.router_id " #define SYM_SQL_SELECT_TRIGGERS "select t.trigger_id,t.channel_id,t.reload_channel_id,t.source_table_name,t.source_schema_name,t.source_catalog_name, \ t.sync_on_insert,t.sync_on_update,t.sync_on_delete,t.sync_on_incoming_batch,t.use_stream_lobs, \ diff --git a/symmetric-client-clib/inc/util/Map.h b/symmetric-client-clib/inc/util/Map.h index 10996326c0..ee87652b0f 100644 --- a/symmetric-client-clib/inc/util/Map.h +++ b/symmetric-client-clib/inc/util/Map.h @@ -12,7 +12,6 @@ typedef struct { char *key; void *value; - int sizeBytes; void *next; } SymMapEntry; @@ -20,8 +19,8 @@ typedef struct { typedef struct SymMap { int size; SymMapEntry **table; - void (*put)(struct SymMap *this, char *key, void *value, int size); - void (*putByInt)(struct SymMap *this, int key, void *value, int size); + void (*put)(struct SymMap *this, char *key, void *value); + void (*putByInt)(struct SymMap *this, int key, void *value); void * (*get)(struct SymMap *this, char *key); void * (*getByInt)(struct SymMap *this, int key); void * (*remove)(struct SymMap *this, char *key); @@ -29,9 +28,10 @@ typedef struct SymMap { SymStringArray * (*keys)(struct SymMap *this); SymList * (*values)(struct SymMap *this); SymList * (*entries)(struct SymMap *this); - int (*getBytesSize)(struct SymMap *this, char *key); void (*reset)(struct SymMap *this); + void (*resetAll)(struct SymMap *this, void (*destroyObject)(void *object), unsigned short shouldFreeKey); void (*destroy)(struct SymMap *this); + void (*destroyAll)(struct SymMap *this, void (*destroyObject)(void *object), unsigned short shouldFreeKey); } SymMap; SymMap *SymMap_new(SymMap *this, int size); diff --git a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c index 9a76df77bb..995124754b 100644 --- a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c +++ b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c @@ -73,8 +73,7 @@ SymList * SymSqliteSqlTemplate_query(SymSqliteSqlTemplate *this, char *sql, SymS SymRow *row = SymSqliteSqlTemplate_buildRow(stmt); void *object = map_row(row); list->add(list, object); - // TODO: need to destroy each row, and the row mapper needs to make a copy - //row->destroy(row); + row->destroy(row); } if (rc != SQLITE_DONE) { @@ -96,8 +95,7 @@ SymList * SymSqliteSqlTemplate_queryWithUserData(SymSqliteSqlTemplate *this, cha SymRow *row = SymSqliteSqlTemplate_buildRow(stmt); void *object = map_row(row, userData); list->add(list, object); - // TODO: need to destroy each row, and the row mapper needs to make a copy - //row->destroy(row); + row->destroy(row); } if (rc != SQLITE_DONE) { diff --git a/symmetric-client-clib/src/db/sql/Row.c b/symmetric-client-clib/src/db/sql/Row.c index 265bc9bb77..6fe636057d 100644 --- a/symmetric-client-clib/src/db/sql/Row.c +++ b/symmetric-client-clib/src/db/sql/Row.c @@ -20,14 +20,21 @@ */ #include "db/sql/Row.h" +void SymRowEntry_destroy(SymRowEntry *this) { + free(this); +} + +SymRowEntry * SymRowEntry_new(char *value, int sqlType, int size) { + SymRowEntry *entry = (SymRowEntry *) calloc(1, sizeof(SymRowEntry)); + entry->value = value; + entry->sqlType = sqlType; + entry->size = size; + return entry; +} + void SymRow_put(SymRow *this, char *columnName, void *value, int sqlType, int size) { - char *copyValue = NULL; - if (value != NULL) { - copyValue = (char *) memcpy(malloc(size + 1), value, size); - copyValue[size] = '\0'; - } - SymRowEntry entry = { copyValue, sqlType, size }; - this->map->put(this->map, columnName, &entry, sizeof(SymRowEntry)); + SymRowEntry *entry = SymRowEntry_new(value, sqlType, size); + this->map->put(this->map, columnName, entry); } char * SymRow_getString(SymRow *this, char *columnName) { @@ -144,16 +151,7 @@ SymDate * SymRow_dateValue(SymRow *this) { } void SymRow_destroy(SymRow *this) { - /* - int i; - for (i = 0; i < this->map->size; i++) { - if (this->map->table[i]) { - SymRowEntry *entry = (SymRowEntry *) this->map->table[i]->value; - free(entry->value); - } - } - */ - this->map->destroy(this->map); + this->map->destroyAll(this->map, (void *) &SymRowEntry_destroy, 0); free(this); } diff --git a/symmetric-client-clib/src/db/sql/mapper/RowMapper.c b/symmetric-client-clib/src/db/sql/mapper/RowMapper.c index a8db9d5a5b..9b1d4b30f1 100644 --- a/symmetric-client-clib/src/db/sql/mapper/RowMapper.c +++ b/symmetric-client-clib/src/db/sql/mapper/RowMapper.c @@ -21,6 +21,17 @@ #include "db/sql/mapper/RowMapper.h" SymRow * SymRowMapper_mapper(SymRow *row) { - // TODO: clone the row - return row; + SymRow *newRow = SymRow_new(NULL, row->map->size); + SymList *entries = row->map->entries(row->map); + SymIterator *iter = entries->iterator(entries); + while (iter->hasNext(iter)) { + SymMapEntry *entry = (SymMapEntry *) iter->next(iter); + SymRowEntry *rowEntry = (SymRowEntry *) entry->value; + char *columnName = strdup(entry->key); + char *columnValue = strdup(rowEntry->value); + newRow->put(newRow, columnName, columnValue, rowEntry->sqlType, rowEntry->size); + } + iter->destroy(iter); + entries->destroy(entries); + return newRow; } diff --git a/symmetric-client-clib/src/io/reader/ProtocolDataReader.c b/symmetric-client-clib/src/io/reader/ProtocolDataReader.c index 140e43520a..6ca0e77e53 100644 --- a/symmetric-client-clib/src/io/reader/ProtocolDataReader.c +++ b/symmetric-client-clib/src/io/reader/ProtocolDataReader.c @@ -82,7 +82,7 @@ static void SymProtocolDataReader_parseLine(int eol, void *userData) { isPrimary = this->keys->contains(this->keys, this->fields->array[i]); this->table->columns->add(this->table->columns, SymColumn_new(NULL, this->fields->array[i], isPrimary)); } - this->parsedTables->put(this->parsedTables, this->table->name, this->table, sizeof(SymTable)); + this->parsedTables->put(this->parsedTables, this->table->name, this->table); this->writer->startTable(this->writer, this->table); } else if (strcmp(token, SYM_CSV_NODEID) == 0) { SymStringBuilder_copyToField(&batch->sourceNodeId, fields->get(fields, 1)); diff --git a/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c b/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c index 9f141d8ba4..87bb60791c 100644 --- a/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c +++ b/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c @@ -50,7 +50,7 @@ static SymTable * SymDefaultDatabaseWriter_lookupTableAtTarget(SymDefaultDatabas SymTable *targetTable = this->platform->getTableFromCache(this->platform, sourceTable->catalog, sourceTable->schema, sourceTable->name, 0); if (targetTable) { table = targetTable->copyAndFilterColumns(targetTable, sourceTable->columns, 1); - this->targetTables->put(this->targetTables, tableKey, targetTable, sizeof(SymTable)); + this->targetTables->put(this->targetTables, tableKey, targetTable); } } free(tableKey); @@ -169,7 +169,7 @@ void SymDefaultDatabaseWriter_sql(SymDefaultDatabaseWriter *this, SymCsvData *da unsigned short SymDefaultDatabaseWriter_write(SymDefaultDatabaseWriter *this, SymCsvData *data) { // TODO: check if this->targetTable and if ignore missing tables is on if (!this->incomingBatch) { - return 0; + return 1; } switch (data->dataEventType) { case SYM_DATA_EVENT_INSERT: diff --git a/symmetric-client-clib/src/io/writer/ProtocolDataWriter.c b/symmetric-client-clib/src/io/writer/ProtocolDataWriter.c index 9850d29e4c..e095f3a2c9 100644 --- a/symmetric-client-clib/src/io/writer/ProtocolDataWriter.c +++ b/symmetric-client-clib/src/io/writer/ProtocolDataWriter.c @@ -85,7 +85,7 @@ static void SymProtocolDataWriter_startTable(SymProtocolDataWriter *this, SymTab SymList *pkList = table->getPrimaryKeyColumns(table); SymProtocolDataWriter_printList(this->sb, SYM_CSV_KEYS, pkList); SymProtocolDataWriter_printList(this->sb, SYM_CSV_COLUMNS, table->columns); - this->processedTables->put(this->processedTables, fullyQualifiedTableName, tableKey, (strlen(tableKey) * sizeof(char)) + 1); + this->processedTables->put(this->processedTables, fullyQualifiedTableName, tableKey); pkList->destroy(pkList); } free(fullyQualifiedTableName); @@ -156,8 +156,9 @@ size_t SymProtocolDataWriter_process(SymProtocolDataWriter *this, char *buffer, if (numBytes > 0) { memcpy(buffer, this->sb->str, numBytes); + SymLog_debug("Writing data: %s\n", this->sb->str); } -printf("buffer: %s\n", this->sb->str); + if (bufferFull) { char *leftOverData = this->sb->substring(this->sb, count, this->sb->pos); this->sb->reset(this->sb); diff --git a/symmetric-client-clib/src/service/ConfigurationService.c b/symmetric-client-clib/src/service/ConfigurationService.c index 90f571689b..4bef293140 100644 --- a/symmetric-client-clib/src/service/ConfigurationService.c +++ b/symmetric-client-clib/src/service/ConfigurationService.c @@ -83,8 +83,6 @@ SymList * SymConfigurationService_getNodeGroupLinksFor(SymConfigurationService * } } iter->destroy(iter); - // TODO: destroy NodeGroupLinks that were not used - links->destroy(links); return target; } @@ -114,7 +112,7 @@ SymMap * SymConfigurationService_getChannels(SymConfigurationService *this, unsi SymIterator *iter = list->iterator(list); while (iter->hasNext(iter)) { SymChannel *channel = (SymChannel *) iter->next(iter); - channels->put(channels, channel->channelId, channel, sizeof(SymChannel)); + channels->put(channels, channel->channelId, channel); } iter->destroy(iter); list->destroy(list); diff --git a/symmetric-client-clib/src/service/NodeService.c b/symmetric-client-clib/src/service/NodeService.c index f279d27312..df4c211a7c 100644 --- a/symmetric-client-clib/src/service/NodeService.c +++ b/symmetric-client-clib/src/service/NodeService.c @@ -33,7 +33,7 @@ static SymNode * SymNodeService_nodeMapper(SymRow *row) { node->nodeGroupId = row->getStringNew(row, "node_group_id"); node->externalId = row->getStringNew(row, "external_id"); node->syncEnabled = row->getBoolean(row, "sync_enabled"); - node->syncUrl = row->getString(row, "sync_url"); + node->syncUrl = row->getStringNew(row, "sync_url"); node->schemaVersion = row->getStringNew(row, "schema_version"); node->databaseType = row->getStringNew(row, "database_type"); node->databaseVersion = row->getStringNew(row, "database_version"); diff --git a/symmetric-client-clib/src/service/RouterService.c b/symmetric-client-clib/src/service/RouterService.c index d0a5e54da8..7841629298 100644 --- a/symmetric-client-clib/src/service/RouterService.c +++ b/symmetric-client-clib/src/service/RouterService.c @@ -78,7 +78,7 @@ static int SymRouterService_insertDataEvents(SymRouterService *this, SymChannelR SymLog_debug("About to insert a new batch for node %s on the '%s' channel.", nodeId, batch->channelId); this->outgoingBatchService->insertOutgoingBatch(this->outgoingBatchService, batch); - context->batchesByNodes->put(context->batchesByNodes, nodeId, batch, sizeof(SymOutgoingBatch)); + context->batchesByNodes->put(context->batchesByNodes, nodeId, batch); } batch->incrementEventCount(batch, dataMetaData->data->eventType); @@ -110,7 +110,7 @@ SymList * SymRouterService_findAvailableNodes(SymRouterService *this, SymTrigger SymLog_error("The router %s has no node group link configured from %s to %s", router->routerId, router->nodeGroupLink->sourceNodeGroupId, router->nodeGroupLink->targetNodeGroupId); } - context->availableNodes->put(context->availableNodes, triggerRouter->router->routerId, nodes, sizeof(SymList)); + context->availableNodes->put(context->availableNodes, triggerRouter->router->routerId, nodes); } return nodes; } @@ -267,7 +267,7 @@ SymRouterService * SymRouterService_new(SymRouterService *this, SymOutgoingBatch this->triggerRouterService = triggerRouterService; this->platform = platform; this->routers = SymMap_new(NULL, 20); - this->routers->put(this->routers, SYM_ROUTER_DEFAULT, SymDefaultDataRouter_new(NULL), sizeof(SymDefaultDataRouter)); + this->routers->put(this->routers, SYM_ROUTER_DEFAULT, SymDefaultDataRouter_new(NULL)); this->routeData = (void *) &SymRouterService_routeData; this->destroy = (void *) &SymRouterService_destroy; return this; diff --git a/symmetric-client-clib/src/service/TriggerRouterService.c b/symmetric-client-clib/src/service/TriggerRouterService.c index a14ab009c4..b66f65fc2a 100644 --- a/symmetric-client-clib/src/service/TriggerRouterService.c +++ b/symmetric-client-clib/src/service/TriggerRouterService.c @@ -174,8 +174,9 @@ SymRouter * SymTriggerRouterService_getRouterById(SymTriggerRouterService *this, SymIterator *iter = routers->iterator(routers); while (iter->hasNext(iter)) { SymRouter *router = iter->next(iter); - this->routersCache->put(this->routersCache, router->routerId, router, sizeof(SymRouter)); + this->routersCache->put(this->routersCache, router->routerId, router); } + iter->destroy(iter); } return (SymRouter *) this->routersCache->get(this->routersCache, routerId); } @@ -199,7 +200,7 @@ SymTriggerHistory * SymTriggerRouterService_getTriggerHistory(SymTriggerRouterSe args->addInt(args, histId); int error; history = sqlTemplate->queryForObject(sqlTemplate, SYM_SQL_TRIGGER_HIST, args, NULL, &error, (void *) SymTriggerRouterService_triggerHistoryMapper); - this->historyMap->putByInt(this->historyMap, histId, history, sizeof(SymTriggerHistory)); + this->historyMap->putByInt(this->historyMap, histId, history); args->destroy(args); } return history; @@ -216,7 +217,7 @@ SymList * SymTriggerRouterService_getActiveTriggerHistories(SymTriggerRouterServ SymIterator *iter = histories->iterator(histories); while (iter->hasNext(iter)) { SymTriggerHistory *triggerHistory = (SymTriggerHistory *) iter->next(iter); - this->historyMap->putByInt(this->historyMap, triggerHistory->triggerHistoryId, triggerHistory, sizeof(SymTriggerHistory)); + this->historyMap->putByInt(this->historyMap, triggerHistory->triggerHistoryId, triggerHistory); } iter->destroy(iter); return histories; @@ -324,7 +325,7 @@ SymTrigger * SymTriggerRouterService_getTriggerById(SymTriggerRouterService *thi SymIterator *iter = triggers->iterator(triggers); while (iter->hasNext(iter)) { SymTrigger *trigger = iter->next(iter); - this->triggersCache->put(this->triggersCache, trigger->triggerId, trigger, sizeof(SymTrigger)); + this->triggersCache->put(this->triggersCache, trigger->triggerId, trigger); } iter->destroy(iter); triggers->destroy(triggers); @@ -409,9 +410,8 @@ SymList * SymTriggerRouterService_enhanceTriggerRouters(SymTriggerRouterService SymRouter *router = routers->get(routers, i); char *trimmed = SymStringUtils_trim(router->routerId); char *routerId = SymStringUtils_toUpperCase(trimmed); - routersById->put(routersById, routerId, router, sizeof(SymRouter)); + routersById->put(routersById, routerId, router); free(trimmed); - free(routerId); } SymMap *triggersById = SymMap_new(NULL, 8); @@ -420,9 +420,8 @@ SymList * SymTriggerRouterService_enhanceTriggerRouters(SymTriggerRouterService SymTrigger *trigger = triggers->get(triggers, i); char *trimmed = SymStringUtils_trim(trigger->triggerId); char *triggerId = SymStringUtils_toUpperCase(trimmed); - triggersById->put(triggersById, triggerId, trigger, sizeof(SymTrigger)); + triggersById->put(triggersById, triggerId, trigger); free(trimmed); - free(triggerId); } for (i = 0; i < triggerRouters->size; i++) { @@ -436,9 +435,7 @@ SymList * SymTriggerRouterService_enhanceTriggerRouters(SymTriggerRouterService triggerRouter->router = routersById->get(routersById, routerId ); free(triggerIdTrimmed); - free(triggerId); free(routerIdTrimmed); - free(routerId); } routers->destroy(routers); @@ -450,12 +447,15 @@ SymList * SymTriggerRouterService_enhanceTriggerRouters(SymTriggerRouterService SymList * SymTriggerRouterService_getTriggerRouters(SymTriggerRouterService *this) { SymSqlTemplate *sqlTemplate = this->platform->getSqlTemplate(this->platform); + SymStringBuilder *sql = SymStringBuilder_newWithString("select "); + sql->append(sql, SYM_SQL_SELECT_TRIGGER_ROUTERS_COLUMN_LIST); + sql->append(sql, SYM_SQL_SELECT_TRIGGER_ROUTERS); int error; - SymList* triggerRouters = sqlTemplate->query(sqlTemplate, SYM_SQL_SELECT_TRIGGER_ROUTERS, NULL, NULL, &error, (void *) SymTriggerRouterService_triggerRouterMapper); - + SymList* triggerRouters = sqlTemplate->query(sqlTemplate, sql->str, NULL, NULL, &error, (void *) SymTriggerRouterService_triggerRouterMapper); triggerRouters = SymTriggerRouterService_enhanceTriggerRouters(this, triggerRouters); + sql->destroy(sql); return triggerRouters; } @@ -892,6 +892,8 @@ static SymList * SymTriggerRouterService_buildTriggerRoutersForSymmetricTables(S triggerRouter->initialLoadOrder = initialLoadOrder++; triggerRouters->add(triggerRouters, triggerRouter); } + iter->destroy(iter); + triggers->destroy(triggers); return triggerRouters; } @@ -901,7 +903,9 @@ static SymList * SymTriggerRouterService_getConfigurationTablesTriggerRoutersFor SymIterator *iter = links->iterator(links); while (iter->hasNext(iter)) { SymNodeGroupLink *nodeGroupLink = (SymNodeGroupLink *) iter->next(iter); - triggerRouters->addAll(triggerRouters, SymTriggerRouterService_buildTriggerRoutersForSymmetricTables(this, nodeGroupLink, NULL)); + SymList *triggerRoutersSym = SymTriggerRouterService_buildTriggerRoutersForSymmetricTables(this, nodeGroupLink, NULL); + triggerRouters->addAll(triggerRouters, triggerRoutersSym); + triggerRoutersSym->destroy(triggerRoutersSym); } iter->destroy(iter); return triggerRouters; @@ -918,6 +922,7 @@ static void SymTriggerRouterService_mergeInConfigurationTablesTriggerRoutersForC configuredInDatabase->add(configuredInDatabase, trigger); } } + virtualConfigTriggers->destroy(virtualConfigTriggers); iter->destroy(iter); } @@ -960,18 +965,18 @@ static SymTriggerRoutersCache * SymTriggerRouterService_getTriggerRoutersCacheFo SymList *list = triggerRoutersByTriggerId->get(triggerRoutersByTriggerId, triggerId); if (list == NULL) { list = SymList_new(NULL); - triggerRoutersByTriggerId->put(triggerRoutersByTriggerId, triggerId, list, sizeof(SymList)); + triggerRoutersByTriggerId->put(triggerRoutersByTriggerId, triggerId, list); } list->add(list, triggerRouter); - routers->put(routers, triggerRouter->router->routerId, triggerRouter->router, sizeof(SymRouter)); + routers->put(routers, triggerRouter->router->routerId, triggerRouter->router); } } iter->destroy(iter); - SymTriggerRoutersCache *cache = (SymTriggerRoutersCache *) calloc(1, sizeof(SymTriggerRoutersCache)); + cache = (SymTriggerRoutersCache *) calloc(1, sizeof(SymTriggerRoutersCache)); cache->routersByRouterId = routers; cache->triggerRoutersByTriggerId = triggerRoutersByTriggerId; - newTriggerRouterCacheByNodeGroupId->put(newTriggerRouterCacheByNodeGroupId, myNodeGroupId, cache, sizeof(SymTriggerRoutersCache)); + newTriggerRouterCacheByNodeGroupId->put(newTriggerRouterCacheByNodeGroupId, myNodeGroupId, cache); this->triggerRouterCacheByNodeGroupId = newTriggerRouterCacheByNodeGroupId; cache = this->triggerRouterCacheByNodeGroupId == NULL ? NULL: this->triggerRouterCacheByNodeGroupId->get(this->triggerRouterCacheByNodeGroupId, myNodeGroupId); @@ -980,7 +985,8 @@ static SymTriggerRoutersCache * SymTriggerRouterService_getTriggerRoutersCacheFo } SymMap * SymTriggerRouterService_getTriggerRoutersForCurrentNode(SymTriggerRouterService * this, unsigned short refreshCache) { - return SymTriggerRouterService_getTriggerRoutersCacheForCurrentNode(this, refreshCache)->triggerRoutersByTriggerId; + SymTriggerRoutersCache *cache = SymTriggerRouterService_getTriggerRoutersCacheForCurrentNode(this, refreshCache); + return cache->triggerRoutersByTriggerId; } void SymTriggerRouterService_destroy(SymTriggerRouterService * this) { diff --git a/symmetric-client-clib/src/transport/http/HttpTransportManager.c b/symmetric-client-clib/src/transport/http/HttpTransportManager.c index d51b279c12..f16adb3f78 100644 --- a/symmetric-client-clib/src/transport/http/HttpTransportManager.c +++ b/symmetric-client-clib/src/transport/http/HttpTransportManager.c @@ -134,7 +134,7 @@ static SymMap * SymHttpTransportManager_getParametersFromQueryUrl(char *paramete if (nameValuePair->size == 2) { char *value = curl_easy_unescape(curl, nameValuePair->get(nameValuePair, 1), 0, NULL); SymStringUtils_replaceChar(value, '+', ' '); - parameters->put(parameters, nameValuePair->get(nameValuePair, 0), value, strlen(value) * sizeof(char) + 1); + parameters->put(parameters, nameValuePair->get(nameValuePair, 0), value); curl_free(value); } } diff --git a/symmetric-client-clib/src/util/Map.c b/symmetric-client-clib/src/util/Map.c index d9d2322dba..9c46afdfd8 100644 --- a/symmetric-client-clib/src/util/Map.c +++ b/symmetric-client-clib/src/util/Map.c @@ -31,30 +31,20 @@ static int SymMap_hash(SymMap *this, char *key) { return hash % this->size; } -static SymMapEntry * SymMap_newEntry(char *key, void *value, int size) { +static SymMapEntry * SymMap_newEntry(char *key, void *value) { SymMapEntry *entry; if ((entry = malloc(sizeof(SymMapEntry))) == NULL) { return NULL; } - if ((entry->key = strdup(key)) == NULL) { - return NULL; - } - - if (value != NULL) { - entry->value = memcpy(malloc(size), value, size); - entry->sizeBytes = size; - } else { - entry->value = NULL; - entry->sizeBytes = 0; - } - + entry->key = key; + entry->value = value; entry->next = NULL; return entry; } -void SymMap_put(SymMap *this, char *key, void *value, int size) { +void SymMap_put(SymMap *this, char *key, void *value) { int hash = SymMap_hash(this, key); SymMapEntry *next = this->table[hash]; @@ -66,17 +56,9 @@ void SymMap_put(SymMap *this, char *key, void *value, int size) { } if (next != NULL && next->key != NULL && strcmp(key, next->key) == 0) { - free(next->value); - next->value = malloc(size); - if (value != NULL) { - memcpy(next->value, value, size); - next->sizeBytes = size; - } else { - next->value = NULL; - next->sizeBytes = 0; - } + next->value = value; } else { - SymMapEntry *entry = SymMap_newEntry(key, value, size); + SymMapEntry *entry = SymMap_newEntry(key, value); if (next == this->table[hash]) { entry->next = next; @@ -90,9 +72,9 @@ void SymMap_put(SymMap *this, char *key, void *value, int size) { } } -void SymMap_putByInt(SymMap *this, int key, void *value, int size) { +void SymMap_putByInt(SymMap *this, int key, void *value) { char *id = SymStringUtils_format("%d", key); - SymMap_put(this, id, value, size); + SymMap_put(this, id, value); free(id); } @@ -168,21 +150,6 @@ SymList * SymMap_entries(SymMap *this) { return entries; } -int SymMap_getBytesSize(SymMap *this, char *key) { - int hash = SymMap_hash(this, key); - - SymMapEntry *entry = this->table[hash]; - while (entry != NULL && entry->key != NULL && strcmp(key, entry->key) > 0) { - entry = entry->next; - } - - if (entry == NULL || entry->key == NULL || strcmp(key, entry->key) != 0) { - return 0; - } else { - return entry->sizeBytes; - } -} - void * SymMap_remove(SymMap *this, char *key) { int hash = SymMap_hash(this, key); SymMapEntry *entry = this->table[hash]; @@ -191,7 +158,6 @@ void * SymMap_remove(SymMap *this, char *key) { while (entry != NULL) { if (entry->key != NULL && strcmp(key, entry->key) == 0) { result = entry->value; - free(entry->key); entry->key = NULL; entry->value = NULL; break; @@ -209,7 +175,7 @@ void * SymMap_removeByInt(SymMap *this, int key) { return result; } -void SymMap_reset(SymMap *this) { +void SymMap_resetAll(SymMap *this, void (*destroyObject)(void *object), unsigned short shouldFreeKey) { SymMapEntry *entry = NULL; int index = 0; @@ -220,8 +186,14 @@ void SymMap_reset(SymMap *this) { while (currentEntry != NULL) { SymMapEntry *nextEntry = currentEntry->next; - free(currentEntry->key); - free(currentEntry->value); + if (destroyObject) { + destroyObject(currentEntry->value); + } + if (shouldFreeKey) { + free(currentEntry->key); + } + currentEntry->key = NULL; + currentEntry->value = NULL; free(currentEntry); currentEntry = nextEntry; } @@ -230,9 +202,19 @@ void SymMap_reset(SymMap *this) { } } +void SymMap_reset(SymMap *this) { + SymMap_resetAll(this, NULL, 0); +} + void SymMap_destroy(SymMap *this) { - // TODO: free all the malloc'ed memory this->reset(this); + free(this->table); + free(this); +} + +void SymMap_destroyAll(SymMap *this, void (*destroyObject)(void *object), unsigned short shouldFreeKey) { + SymMap_resetAll(this, destroyObject, shouldFreeKey); + free(this->table); free(this); } @@ -245,13 +227,14 @@ SymMap * SymMap_new(SymMap *this, int size) { this->keys = (void *) &SymMap_keys; this->values = (void *) &SymMap_values; this->entries = (void *) &SymMap_entries; - this->getBytesSize = (void *) &SymMap_getBytesSize; this->put = (void *) &SymMap_put; this->putByInt = (void *) &SymMap_putByInt; this->remove = (void *) &SymMap_remove; this->removeByInt = (void *) &SymMap_removeByInt; this->reset = (void *) &SymMap_reset; + this->resetAll = (void *) &SymMap_resetAll; this->destroy = (void *) &SymMap_destroy; + this->destroyAll = (void *) &SymMap_destroyAll; if (size < 1) { size = 1;