From c37dc2e138de005c66b2b117892b78ff897d5f92 Mon Sep 17 00:00:00 2001 From: mmichalek Date: Wed, 14 Oct 2015 15:21:54 -0400 Subject: [PATCH 1/6] Add isBlank() --- .../src/util/StringUtilsTest.c | 10 +++++++++- symmetric-client-clib/inc/util/StringUtils.h | 1 + symmetric-client-clib/src/util/StringUtils.c | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/symmetric-client-clib-test/src/util/StringUtilsTest.c b/symmetric-client-clib-test/src/util/StringUtilsTest.c index d2dba933da..df8b12de41 100644 --- a/symmetric-client-clib-test/src/util/StringUtilsTest.c +++ b/symmetric-client-clib-test/src/util/StringUtilsTest.c @@ -53,6 +53,12 @@ void SymStringUtilsTest_test_toLowerCase() { CU_ASSERT(strcmp(Sym_toLowerCase(""), "") == 0); } +void SymStringUtilsTest_test_isBlank() { + CU_ASSERT(Sym_isBlank("t") == 0); + CU_ASSERT(Sym_isBlank(" t") == 0); + CU_ASSERT(Sym_isBlank("some string") == 0); +} + int SymStringUtilsTest_CUnit() { CU_pSuite suite = CU_add_suite("SymStringUtilsTest", NULL, NULL); if (suite == NULL) { @@ -61,7 +67,9 @@ int SymStringUtilsTest_CUnit() { if (CU_add_test(suite, "SymStringUtilsTest_testTrim", SymStringUtilsTest_testTrim) == NULL || CU_add_test(suite, "SymStringUtilsTest_test_toUpperCase", SymStringUtilsTest_test_toUpperCase) == NULL || - CU_add_test(suite, "SymStringUtilsTest_test_toLowerCase", SymStringUtilsTest_test_toLowerCase) == NULL) { + CU_add_test(suite, "SymStringUtilsTest_test_toLowerCase", SymStringUtilsTest_test_toLowerCase) == NULL || + CU_add_test(suite, "SymStringUtilsTest_test_isBlank", SymStringUtilsTest_test_isBlank) == NULL || + 1==0) { return CUE_NOTEST; } return CUE_SUCCESS; diff --git a/symmetric-client-clib/inc/util/StringUtils.h b/symmetric-client-clib/inc/util/StringUtils.h index b3e7d5a193..94e164bc3a 100644 --- a/symmetric-client-clib/inc/util/StringUtils.h +++ b/symmetric-client-clib/inc/util/StringUtils.h @@ -26,5 +26,6 @@ char *Sym_trim(char *str); char *Sym_toUpperCase(char *str); char *Sym_toLowerCase(char *str); +unsigned short Sym_isBlank(char *str); #endif /* INC_UTIL_STRINGUTILS_H_ */ diff --git a/symmetric-client-clib/src/util/StringUtils.c b/symmetric-client-clib/src/util/StringUtils.c index 1b3611504c..8c4972c554 100644 --- a/symmetric-client-clib/src/util/StringUtils.c +++ b/symmetric-client-clib/src/util/StringUtils.c @@ -80,3 +80,23 @@ char *Sym_toLowerCase(char *str) { return newString; } + +unsigned short Sym_isBlank(char *str) { + if (str == NULL) { + return 1; + } + + int strLen = strlen(str); + if (strLen == 0) { + return 1; + } + + int i; + for (i = 0; i < strLen; i++) { + if (!isspace(str[i])) { + return 0; + } + } + + return 1; +} From d25db3db80a5fd485febaa5c27de52f58c77a91b Mon Sep 17 00:00:00 2001 From: mmichalek Date: Wed, 14 Oct 2015 16:46:14 -0400 Subject: [PATCH 2/6] More work on syncTriggers. --- .../src/core/SymEngineTest.c | 2 +- symmetric-client-clib/inc/core/SymEngine.h | 3 +- symmetric-client-clib/inc/model/Trigger.h | 8 +- .../inc/service/SequenceService.h | 3 + .../inc/service/TriggerRouterService.h | 163 +---- symmetric-client-clib/src/core/SymEngine.c | 11 +- .../src/db/platform/sqlite/SqlitePlatform.c | 10 +- .../src/service/SequenceService.c | 16 + .../src/service/TriggerRouterService.c | 655 +++--------------- 9 files changed, 181 insertions(+), 690 deletions(-) diff --git a/symmetric-client-clib-test/src/core/SymEngineTest.c b/symmetric-client-clib-test/src/core/SymEngineTest.c index 4440c31520..11349c4c27 100644 --- a/symmetric-client-clib-test/src/core/SymEngineTest.c +++ b/symmetric-client-clib-test/src/core/SymEngineTest.c @@ -37,7 +37,7 @@ void SymEngineTest_test1() { SymEngine *engine = SymEngine_new(NULL, prop); CU_ASSERT(engine->start(engine) == 0); - CU_ASSERT(engine->syncTriggers(engine) == 0); + engine->syncTriggers(engine); engine->pullService->pullData(engine->pullService); diff --git a/symmetric-client-clib/inc/core/SymEngine.h b/symmetric-client-clib/inc/core/SymEngine.h index 874e6db5b9..0822c1f141 100644 --- a/symmetric-client-clib/inc/core/SymEngine.h +++ b/symmetric-client-clib/inc/core/SymEngine.h @@ -62,11 +62,12 @@ typedef struct SymEngine { SymIncomingBatchService *incomingBatchService; SymOutgoingBatchService *outgoingBatchService; SymConfigurationService *configurationService; + SymSequenceService *sequenceService; unsigned short (*start)(struct SymEngine *this); unsigned short (*stop)(struct SymEngine *this); unsigned short (*uninstall)(struct SymEngine *this); - unsigned short (*syncTriggers)(struct SymEngine *this); + void (*syncTriggers)(struct SymEngine *this); void (*destroy)(struct SymEngine *this); } SymEngine; diff --git a/symmetric-client-clib/inc/model/Trigger.h b/symmetric-client-clib/inc/model/Trigger.h index 5889968c26..ed08a3c7a9 100644 --- a/symmetric-client-clib/inc/model/Trigger.h +++ b/symmetric-client-clib/inc/model/Trigger.h @@ -33,12 +33,13 @@ typedef struct SymTrigger { char *channelId; char *reloadChannelId; unsigned short syncOnUpdate; + unsigned short syncOnInsert; unsigned short syncOnDelete; unsigned short syncOnIncomingBatch; - unsigned short useStreamLogs; - unsigned short useCaptureLogs; + unsigned short useStreamLobs; + unsigned short useCaptureLobs; unsigned short useCaptureOldData; - unsigned short *useHandleKeyUpdates; + unsigned short useHandleKeyUpdates; char *nameForInsertTrigger; char *nameForUpdateTrigger; char *nameForDeleteTrigger; @@ -50,6 +51,7 @@ typedef struct SymTrigger { char *customOnInsertText; char *customOnDeleteText; char *excludedColumnNames; + char *syncKeyNames; /** * This is a SQL expression that creates a unique id which the sync process * can use to 'group' events together and commit together. diff --git a/symmetric-client-clib/inc/service/SequenceService.h b/symmetric-client-clib/inc/service/SequenceService.h index fc5260df98..b825c5c2e1 100644 --- a/symmetric-client-clib/inc/service/SequenceService.h +++ b/symmetric-client-clib/inc/service/SequenceService.h @@ -27,6 +27,9 @@ typedef struct SymSequenceService { void (*init)(struct SymSequenceService *this); long (*nextVal)(struct SymSequenceService *this, char *name); long (*currVal)(struct SymSequenceService *this, char *name); + void (*destroy)(struct SymSequenceService *this); } SymSequenceService; +SymSequenceService * SymSequenceService_new(SymSequenceService *this); + #endif diff --git a/symmetric-client-clib/inc/service/TriggerRouterService.h b/symmetric-client-clib/inc/service/TriggerRouterService.h index bb553d7ae4..4e671877fb 100644 --- a/symmetric-client-clib/inc/service/TriggerRouterService.h +++ b/symmetric-client-clib/inc/service/TriggerRouterService.h @@ -36,146 +36,41 @@ #include "model/Router.h" #include "io/data/DataEventType.h" #include "db/sql/SqlTemplate.h" - - -typedef struct SymTriggerSelector { - SymList* triggers; - struct SymList * (*select)(struct SymTriggerSelector *this); - void (*destroy)(struct SymTriggerSelector * this); -} SymTriggerSelector; - -SymTriggerSelector * SymTriggerSelector_new(SymTriggerSelector *this, SymList *triggers); - - -typedef struct SymTriggerRoutersCache { - SymMap* triggerRoutersByTriggerId; - SymMap* routersByRouterId; - void (*destroy)(struct SymTriggerSelector * this); -} SymTriggerRoutersCache; - -SymTriggerRoutersCache * SymTriggerRoutersCache_new(SymTriggerRoutersCache *this); - +#include "common/ParameterConstants.h" +#include "common/Log.h" +#include "model/TriggerRouter.h" +#include +#include "util/StringUtils.h" +#include "service/SequenceService.h" typedef struct SymTriggerRouterService { - long routersCacheTime; - SymMap* routersCache; - - SymList* triggerRoutersCache; - long triggerRouterPerNodeCacheTime; - - SymMap* triggersCache; - long triggersCacheTime; - long triggerRoutersCacheTime; - - SymMap* triggerRouterCacheByNodeGroupId; - - long triggerRouterPerChannelCacheTime; - - SymParameterService *parameterService; SymConfigurationService *configurationService; + SymSequenceService *sequenceService; + SymParameterService *parameterService; SymDatabasePlatform *platform; - unsigned short (*refreshFromDatabase)(struct SymTriggerRouterService *this); - SymList* (*getTriggers)(struct SymTriggerRouterService *this, unsigned short replaceTokens); - unsigned short (*isTriggerBeingUsed)(struct SymTriggerRouterService *this, char *triggerId); - unsigned short (*doesTriggerExist)(struct SymTriggerRouterService *this, char *triggerId); - unsigned short (*doesTriggerExistForTable)(struct SymTriggerRouterService *this, char *tableName); - void (*deleteTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger); - void (*dropTriggers)(struct SymTriggerRouterService *this); - void (*dropTriggersForTables)(struct SymTriggerRouterService *this, SymList *tables); - void (*deleteTriggerHistory)(struct SymTriggerRouterService *this, SymTriggerHistory *history); - void (*createTriggersOnChannelForTables)(struct SymTriggerRouterService *this, char *channelId, char *catalogName, - char *schemaName, SymList *tables, char *lastUpdateBy); - SymList* (*createTriggersOnChannelForTablesWithReturn)(struct SymTriggerRouterService *this, - char *channelId, char *catalogName, char *schemaName, SymList *tables, char *lastUpdateBy); - SymList* (*findMatchingTriggers)(struct SymTriggerRouterService *this, SymList *triggers, - char *catalog, char *schema, char *table); - void (*inactivateTriggerHistory)(struct SymTriggerRouterService *this, SymTriggerHistory *history); - SymMap* (*getHistoryRecords)(struct SymTriggerRouterService *this); - unsigned short (*isTriggerNameInUse)(struct SymTriggerRouterService *this, SymList *activeTriggerHistories, - char *triggerId, char *triggerName); - SymTriggerHistory* (*findTriggerHistory)(struct SymTriggerRouterService *this, - char *catalogName, char *schemaName, char *tableName); - SymList* (*findTriggerHistories)(struct SymTriggerRouterService *this, - char *catalogName, char *schemaName, char *tableName); - SymTriggerHistory* (*getTriggerHistory)(struct SymTriggerRouterService *this, int histId); - SymList* (*getActiveTriggerHistoriesForTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger); - SymTriggerHistory* (*getNewestTriggerHistoryForTrigger)(struct SymTriggerRouterService *this, - char *triggerId, char *catalogName, char *schemaName, char *tableName); - SymList* (*getActiveTriggerHistoriesFromCache)(struct SymTriggerRouterService *this); - SymList* (*getActiveTriggerHistories)(struct SymTriggerRouterService *this); - SymList * (*getActiveTriggerHistoriesForTable)(struct SymTriggerRouterService *this, char *tableName); - SymList* (*buildTriggersForSymmetricTables)(struct SymTriggerRouterService *this, SymStringArray *tablesToExclude); - SymTrigger* (*buildTriggerForSymmetricTable)(struct SymTriggerRouterService *this, char *tableName); - SymList* (*buildTriggerRoutersForSymmetricTables)(struct SymTriggerRouterService *this, - char *version, SymNodeGroupLink *nodeGroupLink, SymStringArray *tablesToExclude); - char* (*buildSymmetricTableRouterId)(struct SymTriggerRouterService *this, - char *triggerId, char *sourceNodeGroupdId, char *targetNodeGroupId); - SymTriggerRouter * (*buildTriggerRoutersForSymmetricTablesWithNodeGroupLink)(struct SymTriggerRouterService *this, - char *version, SymTrigger *trigger, SymNodeGroupLink *nodeGroupLink); - SymList * (*getTriggerRouterForTableForCurrentNode)(struct SymTriggerRouterService *this, SymNodeGroupLink *link, char *catalogName, char *schemaName, char *tableName, unsigned short refreshCache); - unsigned short (*isMatch)(struct SymTriggerRouterService *this, SymNodeGroupLink *link, SymTriggerRouter *router); - unsigned short (*isMatchTableName)(struct SymTriggerRouterService *this, char *catalogName, char *schemaName, char *tableName, SymTrigger *trigger); - SymList * (*getConfigurationTablesTriggerRoutersForCurrentNode)(struct SymTriggerRouterService *this, char *sourceNodeGroupId); - void (*mergeInConfigurationTablesTriggerRoutersForCurrentNode)(struct SymTriggerRouterService *this, char *sourceNodeGroupId, SymList *configuredInDatabase); - unsigned short (*doesTriggerRouterExistInList)(struct SymTriggerRouterService *this, SymList *triggerRouters, SymTriggerRouter *triggerRouter); - SymTriggerRouter * (*getTriggerRouterForCurrentNode)(struct SymTriggerRouterService *this, char *triggerId, char *routerId, unsigned short refreshCache); - SymMap * (*getTriggerRoutersForCurrentNode)(struct SymTriggerRouterService *this, unsigned short refreshCache); - SymList * (*getTriggersForCurrentNode)(struct SymTriggerRouterService *this, unsigned short refreshCache); - SymTriggerRoutersCache * (*getTriggerRoutersCacheForCurrentNode)(struct SymTriggerRouterService *this, unsigned short refreshCache); - SymRouter * (*getActiveRouterByIdForCurrentNode)(struct SymTriggerRouterService *this, char *routerId, unsigned short refreshCache); - SymList * (*getRoutersByGroupLink)(struct SymTriggerRouterService *this, SymNodeGroupLink *link); - SymTrigger * (*getTriggerForCurrentNodeById)(struct SymTriggerRouterService *this, char *triggerId); - SymTrigger * (*getTriggerById)(struct SymTriggerRouterService *this, char *triggerId, unsigned short refreshCache); - SymRouter * (*getRouterById)(struct SymTriggerRouterService *this, char *routerId, unsigned short refreshCache); - SymList * (*getRouters)(struct SymTriggerRouterService *this, unsigned short replaceVariables); - char * (*getTriggerRouterSql)(struct SymTriggerRouterService *this, char *sql); - SymList * (*getTriggerRouters)(struct SymTriggerRouterService *this, unsigned short refreshCache); - SymList * (*getAllTriggerRoutersForCurrentNode)(struct SymTriggerRouterService *this, char *sourceNodeGroupId); - SymList * (*getAllTriggerRoutersForReloadForCurrentNode)(struct SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId); - SymTriggerRouter * (*findTriggerRouterById)(struct SymTriggerRouterService *this, char *triggerId, char *routerId); - SymList * (*enhanceTriggerRouters)(struct SymTriggerRouterService *this, SymList *triggerRouters); - SymMap * (*getTriggerRoutersByChannel)(struct SymTriggerRouterService *this, char *nodeGroupId, unsigned short refreshCache); - void (*insert)(struct SymTriggerRouterService *this, SymTriggerHistory *newHistRecord); - void (*deleteTriggerRouterWithId)(struct SymTriggerRouterService *this, char *triggerId, char *routerId); - void (*deleteTriggerRouter)(struct SymTriggerRouterService *this, SymTriggerRouter *triggerRouter); - void (*saveTriggerRouter)(struct SymTriggerRouterService *this, SymTriggerRouter *triggerRouter, unsigned short updateTriggerRouterTableOnly); - void (*resetTriggerRouterCacheByNodeGroupId)(struct SymTriggerRouterService *this); - void (*saveRouter)(struct SymTriggerRouterService *this, SymRouter *router); - unsigned short (*isRouterBeingUsed)(struct SymTriggerRouterService *this, char *routerId); - void (*deleteRouter)(struct SymTriggerRouterService *this, SymRouter *router); - void (*saveTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger); - void (*clearCache)(struct SymTriggerRouterService *this); - SymList * (*getTriggerIdsFrom)(struct SymTriggerRouterService *this, SymList *triggersThatShouldBeActive); - SymTrigger * (*getTriggerFromList)(struct SymTriggerRouterService *this, char *triggerId, SymList *triggersThatShouldBeActive); - void (*inactivateTriggers)(struct SymTriggerRouterService *this, SymList *triggersThatShouldBeActive, SymStringBuilder *sqlBuffer, SymList *activeTriggerHistories); - unsigned short (*isEqual)(struct SymTriggerRouterService *this, char *one, char *two, unsigned short ignoreCase); - void (*dropTriggersForTriggerHistory)(struct SymTriggerRouterService *this, SymTriggerHistory *history, SymStringBuilder *sqlBuffer); - SymList * (*toList)(struct SymTriggerRouterService *this, SymList *source); - SymList * (*getTablesForTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger, SymList *triggers, unsigned short useTableCache); - unsigned short (*containsExactMatchForSourceTableName)(struct SymTriggerRouterService *this, SymTable *table, SymList *triggers, unsigned short ignoreCase); - void (*updateOrCreateDatabaseTriggers)(struct SymTriggerRouterService *this, SymList *triggers, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories, unsigned short useTableCache); - void (*updateOrCreateDatabaseTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger, SymList *triggers, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories, unsigned short useTableCache); - void (*syncTrigger)(struct SymTriggerRouterService *this, SymTrigger *trigger, unsigned short force, unsigned short verifyInDatabase); - void (*updateOrCreateDatabaseTriggersForTable)(struct SymTriggerRouterService *this, SymTrigger *trigger, SymTable *table, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories); - SymTriggerHistory * (*rebuildTriggerIfNecessary)(struct SymTriggerRouterService *this, SymStringBuilder *sqlBuffer, unsigned short forceRebuild, SymTrigger *trigger, SymDataEventType *dmlType, char *reason, SymTriggerHistory *oldhist, SymTriggerHistory *hist, unsigned short triggerIsActive, SymTable *table, SymList *activeTriggerHistories); - char * (*replaceCharsToShortenName)(struct SymTriggerRouterService *this, char *triggerName); - char * (*getTriggerName)(struct SymTriggerRouterService *this, SymDataEventType *dml, int maxTriggerNameLength, SymTrigger *trigger, SymTable *table, SymList *activeTriggerHistories); - SymTriggerHistory * (*mapRow)(struct SymTriggerRouterService *this, SymRow *rs); - SymNodeGroupLink * (*getNodeGroupLink)(struct SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId); -// SymRouter * (*mapRow)(struct SymTriggerRouterService *this, SymRow *rs); -// SymTrigger * (*mapRow)(struct SymTriggerRouterService *this, SymRow *rs); -// SymTriggerRouter * (*mapRow)(struct SymTriggerRouterService *this, SymRow *rs); - void (*addExtraConfigTable)(struct SymTriggerRouterService *this, char *table); - SymMap * (*getFailedTriggers)(struct SymTriggerRouterService *this); - SymTriggerHistory * (*findTriggerHistoryForGenericSync)(struct SymTriggerRouterService *this); - SymMap * (*fillTriggerRoutersByHistIdAndSortHist)(struct SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId, SymList *triggerHistories); - SymList * (*getSortedTablesFor)(struct SymTriggerRouterService *this, SymList *histories); - int (*syncTriggers)(struct SymTriggerRouterService *this, SymStringBuilder *sqlBuffer, unsigned short force); // - int (*syncTriggersWithTable)(struct SymTriggerRouterService *this, SymTable *table, unsigned short force); // - void (*destroy)(struct SymTriggerRouterService *this); // + void (*syncTriggers)(struct SymTriggerRouterService *this, unsigned short force); + void (*destroy)(struct SymTriggerRouterService *this); } SymTriggerRouterService; -SymTriggerRouterService * SymTriggerRouterService_new(SymTriggerRouterService * this, SymParameterService *parameterService, SymDatabasePlatform *platform, SymConfigurationService *configurationService); +SymTriggerRouterService * SymTriggerRouterService_new(SymTriggerRouterService *this, + SymConfigurationService *configurationService, SymSequenceService *sequenceService, + SymParameterService *parameterService, SymDatabasePlatform *platform); + +#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 \ +inner join sym_trigger t on tr.trigger_id=t.trigger_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, \ +t.use_capture_lobs,t.use_capture_old_data,t.use_handle_key_updates, \ +t.excluded_column_names, t.sync_key_names, \ +t.name_for_delete_trigger,t.name_for_insert_trigger,t.name_for_update_trigger, \ +t.sync_on_insert_condition,t.sync_on_update_condition,t.sync_on_delete_condition, \ +t.custom_on_insert_text,t.custom_on_update_text,t.custom_on_delete_text, \ +t.tx_id_expression,t.external_select,t.channel_expression,t.create_time as t_create_time, \ +t.last_update_time as t_last_update_time, t.last_update_by as t_last_update_by \ +from sym_trigger t order by trigger_id asc " #endif diff --git a/symmetric-client-clib/src/core/SymEngine.c b/symmetric-client-clib/src/core/SymEngine.c index ee4b8d27bb..f2ed773d9c 100644 --- a/symmetric-client-clib/src/core/SymEngine.c +++ b/symmetric-client-clib/src/core/SymEngine.c @@ -62,7 +62,7 @@ unsigned short SymEngine_start(SymEngine *this) { SymLog_info("Starting registered node [group=%s, id=%s, externalId=%s]", node->nodeGroupId, node->nodeId, node->externalId); if (this->parameterService->is(this->parameterService, AUTO_SYNC_TRIGGERS_AT_STARTUP, 1)) { - this->triggerRouterService->syncTriggers(this->triggerRouterService, NULL, 0); + this->triggerRouterService->syncTriggers(this->triggerRouterService, 0); } else { SymLog_info("%s is turned off.", AUTO_SYNC_TRIGGERS_AT_STARTUP); @@ -96,8 +96,8 @@ unsigned short SymEngine_stop(SymEngine *this) { return 0; } -unsigned short SymEngine_syncTriggers(SymEngine *this) { - return this->triggerRouterService->syncTriggers(this->triggerRouterService, NULL, 0); +void SymEngine_syncTriggers(SymEngine *this) { + this->triggerRouterService->syncTriggers(this->triggerRouterService, 0); } unsigned short SymEngine_uninstall(SymEngine *this) { @@ -129,10 +129,13 @@ SymEngine * SymEngine_new(SymEngine *this, SymProperties *properties) { this->platform = SymDatabasePlatformFactory_create(properties); this->dialect = SymDialectFactory_create(this->platform); + this->sequenceService = SymSequenceService_new(NULL); + this->configurationService = SymConfigurationService_new(NULL, this->platform); this->parameterService = SymParameterService_new(NULL, properties); - this->triggerRouterService = SymTriggerRouterService_new(NULL, this->parameterService, this->platform, this->configurationService); + this->triggerRouterService = SymTriggerRouterService_new(NULL, this->configurationService, + this->sequenceService, this->parameterService, this->platform); this->transportManager = SymTransportManagerFactory_create(SYM_PROTOCOL_HTTP, this->parameterService); this->nodeService = SymNodeService_new(NULL, this->platform); this->incomingBatchService = SymIncomingBatchService_new(NULL, this->platform, this->parameterService); diff --git a/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c b/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c index bcc9bf5bb2..6f28e2fc8b 100644 --- a/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c +++ b/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c @@ -48,11 +48,11 @@ SymSqliteSqlTemplate * SymSqlitePlatform_getSqlTemplate(SymSqlitePlatform *this) void SymSqlitePlatform_destroy(SymDatabasePlatform *super) { SymLog_info("Closing SQLite database"); - SymSqlitePlatform *this = (SymSqlitePlatform *) super; - sqlite3_close(this->db); - this->sqlTemplate->destroy(this->sqlTemplate); - free(super->ddlReader); - free(this); +// SymSqlitePlatform *this = (SymSqlitePlatform *) super; +// sqlite3_close(this->db); +// this->sqlTemplate->destroy(this->sqlTemplate); +// free(super->ddlReader); +// free(this); } SymSqlitePlatform * SymSqlitePlatform_new(SymSqlitePlatform *this, SymProperties *properties) { diff --git a/symmetric-client-clib/src/service/SequenceService.c b/symmetric-client-clib/src/service/SequenceService.c index 933da51778..386caac6e3 100644 --- a/symmetric-client-clib/src/service/SequenceService.c +++ b/symmetric-client-clib/src/service/SequenceService.c @@ -34,3 +34,19 @@ long SymSequenceService_currVal(SymSequenceService *this, char * name) { void SymSequenceService_init(SymSequenceService *this) { SymLog_info("SymSequenceService_init"); } + +void SymSequenceService_destroy(SymSequenceService *this) { + free(this); +} + +SymSequenceService * SymSequenceService_new(SymSequenceService *this) { + if (this == NULL) { + this = (SymSequenceService *) calloc(1, sizeof(SymSequenceService)); + } + + this->nextVal = (void *) &SymSequenceService_nextVal; + this->currVal = (void *) &SymSequenceService_currVal; + this->init = (void *) &SymSequenceService_init; + this->destroy = (void *) &SymSequenceService_destroy; + return this; +} diff --git a/symmetric-client-clib/src/service/TriggerRouterService.c b/symmetric-client-clib/src/service/TriggerRouterService.c index 073b721917..a05be339e9 100644 --- a/symmetric-client-clib/src/service/TriggerRouterService.c +++ b/symmetric-client-clib/src/service/TriggerRouterService.c @@ -18,27 +18,22 @@ * specific language governing permissions and limitations * under the License. */ -#include -#include "common/ParameterConstants.h" -#include "common/Log.h" -#include "model/TriggerRouter.h" -#include - -#define SYM_SQL_TRIGGER_ROUTERS_COLUMN_LIST "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 " -#define SYM_SQL_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 " +#include "service/TriggerRouterService.h" static SymTriggerRouter * SymTriggerRouterService_triggerRouterMapper(SymRow *row) { SymTriggerRouter *triggerRouter = SymTriggerRouter_new(NULL); + + triggerRouter->trigger = SymTrigger_new(NULL); + triggerRouter->trigger->triggerId = row->getStringNew(row, "trigger_id"); + + triggerRouter->router = SymRouter_new(NULL); + triggerRouter->router->routerId = row->getStringNew(row, "router_id"); + triggerRouter->enabled = row->getBoolean(row, "enabled"); triggerRouter->initialLoadOrder = row->getInt(row, "initial_load_order"); triggerRouter->initialLoadSelect = row->getStringNew(row, "initial_load_select"); triggerRouter->initialLoadDeleteStmt = row->getStringNew(row, "initial_load_delete_stmt"); triggerRouter->initialLoadBatchCount = row->getInt(row, "initial_load_batch_count"); - - // TODO load up the Trigger and the Router. - triggerRouter->createTime = row->getDate(row, "create_time"); triggerRouter->lastUpdateTime = row->getDate(row, "last_update_time"); triggerRouter->lastUpdateBy = row->getStringNew(row, "last_update_by"); @@ -47,331 +42,110 @@ static SymTriggerRouter * SymTriggerRouterService_triggerRouterMapper(SymRow *ro return triggerRouter; } -SymList * SymTriggerSelector_select(SymTriggerSelector *this) { - SymList *filtered = SymList_new(NULL); - - if (this->triggers == NULL) { - return filtered; - } - - SymIterator *iter = this->triggers->iterator(this->triggers); - while (iter->hasNext(iter)) { - SymTriggerRouter *trigger = (SymTriggerRouter *) iter->next(iter); - - // TODO check for duplicate trigger ID's. -- if (!filtered.contains(trigger.getTrigger())) - filtered->add(filtered, trigger); +static SymTrigger * SymTriggerRouterService_triggerMapper(SymRow *row) { + SymTrigger *trigger = SymTrigger_new(NULL); + + trigger->triggerId = row->getStringNew(row, "trigger_id"); + trigger->channelId = row->getStringNew(row, "channel_id"); + trigger->reloadChannelId = row->getStringNew(row, "reload_channel_id"); + trigger->sourceTableName = row->getStringNew(row, "source_table_name"); + trigger->syncOnInsert = row->getBoolean(row, "sync_on_insert"); + trigger->syncOnUpdate = row->getBoolean(row, "sync_on_update"); + trigger->syncOnDelete = row->getBoolean(row, "sync_on_delete"); + trigger->syncOnIncomingBatch = row->getBoolean(row, "sync_on_incoming_batch"); + trigger->useStreamLobs = row->getBoolean(row, "use_stream_lobs"); + trigger->useCaptureLobs = row->getBoolean(row, "use_capture_lobs"); + trigger->useCaptureOldData = row->getBoolean(row, "use_capture_old_data"); + trigger->useHandleKeyUpdates = row->getBoolean(row, "use_handle_key_updates"); + trigger->nameForDeleteTrigger = row->getStringNew(row, "name_for_delete_trigger"); + trigger->nameForInsertTrigger = row->getStringNew(row, "name_for_insert_trigger"); + trigger->nameForUpdateTrigger = row->getStringNew(row, "name_for_update_trigger"); + char *schema = row->getStringNew(row, "source_schema_name"); + trigger->sourceSchemaName = schema; + char *catalog = row->getStringNew(row, "source_catalog_name"); + trigger->sourceCatalogName = catalog; + + char *condition = row->getStringNew(row, "sync_on_insert_condition"); + if (!Sym_isBlank(condition)) { + trigger->syncOnInsertCondition = condition; } - return filtered; -} - -void SymTriggerSelector_destroy(SymTriggerSelector * this) { - this->triggers->destroy(this->triggers); - free(this); -} - -SymTriggerSelector * SymTriggerSelector_new(SymTriggerSelector *this, SymList *triggers) { - if (this == NULL) { - this = (SymTriggerSelector*) calloc(1, sizeof(SymTriggerSelector)); + condition = row->getStringNew(row, "sync_on_update_condition"); + if (!Sym_isBlank(condition)) { + trigger->syncOnUpdateCondition = condition; } - this->triggers = triggers; - this->select = (void *) &SymTriggerSelector_select; - - this->destroy = (void *) &SymTriggerSelector_destroy; - return this; -} - -void SymTriggerRoutersCache_destroy(SymTriggerSelector * this) { - this->triggers->destroy(this->triggers); - free(this); -} - -SymTriggerRoutersCache * SymTriggerRoutersCache_new(SymTriggerRoutersCache *this) { - if (this == NULL) { - this = (SymTriggerRoutersCache*) calloc(1, sizeof(SymTriggerRoutersCache)); + condition = row->getStringNew(row, "sync_on_delete_condition"); + if (!Sym_isBlank(condition)) { + trigger->syncOnDeleteCondition = condition; } - this->destroy = (void *) &SymTriggerRoutersCache_destroy; - return this; -} - -unsigned short SymTriggerRouterService_refreshFromDatabase(SymTriggerRouterService *this) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getTriggers(SymTriggerRouterService *this, unsigned short replaceTokens) { - // TODO - return NULL; -} -unsigned short SymTriggerRouterService_isTriggerBeingUsed(SymTriggerRouterService *this, char *triggerId) { - // TODO - return 0; -} - -unsigned short SymTriggerRouterService_doesTriggerExist(SymTriggerRouterService *this, char *triggerId) { - // TODO - return 0; -} - -unsigned short SymTriggerRouterService_doesTriggerExistForTable(SymTriggerRouterService *this, char *tableName) { - // TODO - return 0; -} - -void SymTriggerRouterService_deleteTrigger(SymTriggerRouterService *this, SymTrigger *trigger) { - // TODO -} + char *text = row->getStringNew(row, "custom_on_insert_text"); + if (!Sym_isBlank(text)) { + trigger->customOnInsertText = text; + } + text = row->getStringNew(row, "custom_on_update_text"); + if (!Sym_isBlank(text)) { + trigger->customOnUpdateText = text; + } + text = row->getStringNew(row, "custom_on_delete_text"); + if (!Sym_isBlank(text)) { + trigger->customOnDeleteText = text; + } -void SymTriggerRouterService_dropTriggers(SymTriggerRouterService *this) { - // TODO -} + condition = row->getStringNew(row, "external_select"); + if (!Sym_isBlank(condition)) { + trigger->externalSelect = condition; + } -void SymTriggerRouterService_dropTriggersForTables(SymTriggerRouterService *this, SymList *tables) { - // TODO -} + trigger->channelExpression = row->getStringNew(row, "channel_expression"); + trigger->txIdExpression = row->getStringNew(row, "tx_id_expression"); -void SymTriggerRouterService_deleteTriggerHistory(SymTriggerRouterService *this, SymTriggerHistory *history) { - // TODO -} + trigger->createTime = row->getDate(row, "t_create_time"); + trigger->lastUpdateTime = row->getDate(row, "t_last_update_time"); + trigger->lastUpdateBy = row->getStringNew(row, "t_last_update_by"); + trigger->excludedColumnNames = row->getStringNew(row, "excluded_column_names"); + trigger->syncKeyNames = row->getStringNew(row, "sync_key_names"); -void SymTriggerRouterService_createTriggersOnChannelForTables(SymTriggerRouterService *this, char *channelId, char *catalogName, char *schemaName, SymList *tables, char *lastUpdateBy) { - // TODO + return trigger; } -SymList * SymTriggerRouterService_createTriggersOnChannelForTablesWithReturn(SymTriggerRouterService *this, char *channelId, char *catalogName, char *schemaName, SymList *tables, char *lastUpdateBy) { - // TODO - return 0; -} +SymList * SymTriggerRouterService_getTriggers(SymTriggerRouterService *this, unsigned short replaceTokens) { + SymSqlTemplate *sqlTemplate = this->platform->getSqlTemplate(this->platform); -SymList * SymTriggerRouterService_findMatchingTriggers(SymTriggerRouterService *this, SymList *triggers, char *catalog, char *schema, char *table) { - // TODO - return 0; + int error; + SymList* triggers = sqlTemplate->query(sqlTemplate, SYM_SQL_SELECT_TRIGGERS, NULL, NULL, &error, (void *) SymTriggerRouterService_triggerMapper); + return triggers; } void SymTriggerRouterService_inactivateTriggerHistory(SymTriggerRouterService *this, SymTriggerHistory *history) { // TODO } -SymMap * SymTriggerRouterService_getHistoryRecords(SymTriggerRouterService *this) { - // TODO - return 0; -} - unsigned short SymTriggerRouterService_isTriggerNameInUse(SymTriggerRouterService *this, SymList *activeTriggerHistories, char *triggerId, char *triggerName) { // TODO return 0; } -SymTriggerHistory * SymTriggerRouterService_findTriggerHistory(SymTriggerRouterService *this, char *catalogName, char *schemaName, char *tableName) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_findTriggerHistories(SymTriggerRouterService *this, char *catalogName, char *schemaName, char *tableName) { - // TODO - return 0; -} - -SymTriggerHistory * SymTriggerRouterService_getTriggerHistory(SymTriggerRouterService *this, int histId) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getActiveTriggerHistoriesForTrigger(SymTriggerRouterService *this, SymTrigger *trigger) { - // TODO - return 0; -} - SymTriggerHistory * SymTriggerRouterService_getNewestTriggerHistoryForTrigger(SymTriggerRouterService *this, char *triggerId, char *catalogName, char *schemaName, char *tableName) { // TODO return 0; } -SymList * SymTriggerRouterService_getActiveTriggerHistoriesFromCache(SymTriggerRouterService *this) { - // TODO - return 0; -} - SymList * SymTriggerRouterService_getActiveTriggerHistories(SymTriggerRouterService *this) { // TODO return 0; } -SymList * SymTriggerRouterService_getActiveTriggerHistoriesForTable(SymTriggerRouterService *this, char *tableName) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_buildTriggersForSymmetricTables(SymTriggerRouterService *this, char *version, char *tablesToExclude) { - // TODO - return 0; -} - -SymTrigger * SymTriggerRouterService_buildTriggerForSymmetricTable(SymTriggerRouterService *this, char *tableName) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_buildTriggerRoutersForSymmetricTables(SymTriggerRouterService *this, char *version, SymNodeGroupLink *nodeGroupLink, char *tablesToExclude) { - // TODO - return 0; -} - -char * SymTriggerRouterService_buildSymmetricTableRouterId(SymTriggerRouterService *this, char *triggerId, char *sourceNodeGroupId, char *targetNodeGroupId) { - // TODO - return 0; -} - -SymTriggerRouter * SymTriggerRouterService_buildTriggerRoutersForSymmetricTablesWithNodeGroupLink(SymTriggerRouterService *this, char *version, SymTrigger *trigger, SymNodeGroupLink *nodeGroupLink) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getTriggerRouterForTableForCurrentNode(SymTriggerRouterService *this, SymNodeGroupLink *link, char *catalogName, char *schemaName, char *tableName, unsigned short refreshCache) { - // TODO - return 0; -} - -unsigned short SymTriggerRouterService_isMatch(SymTriggerRouterService *this, SymNodeGroupLink *link, SymTriggerRouter *router) { - // TODO - return 0; -} - -unsigned short SymTriggerRouterService_isMatchTableName(SymTriggerRouterService *this, char *catalogName, char *schemaName, char *tableName, SymTrigger *trigger) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getConfigurationTablesTriggerRoutersForCurrentNode(SymTriggerRouterService *this, char *sourceNodeGroupId) { - // TODO - return 0; -} - -void SymTriggerRouterService_mergeInConfigurationTablesTriggerRoutersForCurrentNode(SymTriggerRouterService *this, char *sourceNodeGroupId, SymList *configuredInDatabase) { - // TODO -} - -unsigned short SymTriggerRouterService_doesTriggerRouterExistInList(SymTriggerRouterService *this, SymList *triggerRouters, SymTriggerRouter *triggerRouter) { - // TODO - return 0; -} - -SymTriggerRouter * SymTriggerRouterService_getTriggerRouterForCurrentNode(SymTriggerRouterService *this, char *triggerId, char *routerId, unsigned short refreshCache) { - // TODO - return 0; -} - -SymMap* SymTriggerRouterService_getTriggerRoutersForCurrentNode(SymTriggerRouterService *this, unsigned short refreshCache) { - return this->getTriggerRoutersCacheForCurrentNode(this, refreshCache)->triggerRoutersByTriggerId; -} - -SymList* SymTriggerRouterService_getTriggersForCurrentNode(SymTriggerRouterService *this, unsigned short refreshCache) { - SymMap *triggerRouters = SymTriggerRouterService_getTriggerRoutersForCurrentNode(this, refreshCache); - SymList *triggers = SymList_new(NULL); - - - - // SymTriggerSelector *triggerSelector = SymTriggerSelector_new(NULL, NULL /** todo */); - // return triggerSelector->select(triggerSelector); -// SymMap *triggerRouters = this->getTriggerRoutersCacheForCurrentNode(this, refreshCache); - // TODO >>>>>>>> - - return NULL; -} - -SymTriggerRoutersCache* SymTriggerRouterService_getTriggerRoutersCacheForCurrentNode(SymTriggerRouterService *this, unsigned short refreshCache) { - char* myNodeGroupId = this->parameterService->getNodeGroupId(this->parameterService); - long triggerRouterCacheTimeoutInMs = this->parameterService->getLong(this->parameterService, CACHE_TIMEOUT_TRIGGER_ROUTER_IN_MS, 1000); - SymTriggerRoutersCache *cache = this->triggerRouterCacheByNodeGroupId == NULL ? NULL - : this->triggerRouterCacheByNodeGroupId->get(this->triggerRouterCacheByNodeGroupId, myNodeGroupId); - time_t currentTimeMillis = time(NULL)*1000; - - if (cache == NULL - || refreshCache - || currentTimeMillis - this->triggerRouterPerNodeCacheTime > triggerRouterCacheTimeoutInMs) { - this->triggerRouterPerNodeCacheTime = currentTimeMillis; - SymMap *newTriggerRouterCacheByNodeGroupId = SymMap_new(NULL, 8); - SymList *triggerRouters = this->getAllTriggerRoutersForCurrentNode(this, myNodeGroupId); - // TODO <<<<<<<<< - } - - return NULL; -} - -SymRouter * SymTriggerRouterService_getActiveRouterByIdForCurrentNode(SymTriggerRouterService *this, char *routerId, unsigned short refreshCache) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getRoutersByGroupLink(SymTriggerRouterService *this, SymNodeGroupLink *link) { - // TODO - return 0; -} - -SymTrigger * SymTriggerRouterService_getTriggerForCurrentNodeById(SymTriggerRouterService *this, char *triggerId) { - // TODO - return 0; -} - -SymTrigger * SymTriggerRouterService_getTriggerById(SymTriggerRouterService *this, char *triggerId, unsigned short refreshCache) { - // TODO - return 0; -} - -SymRouter * SymTriggerRouterService_getRouterById(SymTriggerRouterService *this, char *routerId, unsigned short refreshCache) { - // TODO - return 0; -} - SymList * SymTriggerRouterService_getRouters(SymTriggerRouterService *this, unsigned short replaceVariables) { // TODO return 0; } char * SymTriggerRouterService_getTriggerRouterSql(SymTriggerRouterService *this, char *sql) { - char *sqlSuffix = ""; - if (strcmp(sql, "activeTriggersForSourceNodeGroupSql")) { - sqlSuffix = " where r.source_node_group_id = ? "; - } - - SymStringBuilder *buff = SymStringBuilder_new(NULL); - buff->append(buff, SYM_SQL_TRIGGER_ROUTERS_COLUMN_LIST); - buff->append(buff, SYM_SQL_TRIGGER_ROUTERS); - buff->append(buff, sqlSuffix); - - return buff->destroyAndReturn(buff); -} - -SymList * SymTriggerRouterService_getTriggerRouters(SymTriggerRouterService *this, unsigned short refreshCache) { // TODO return 0; } -SymList * SymTriggerRouterService_getAllTriggerRoutersForCurrentNode(SymTriggerRouterService *this, char *sourceNodeGroupId) { - SymSqlTemplate *sqlTemplate = this->platform->getSqlTemplate(this->platform); - - char *triggerRouterSql = this->getTriggerRouterSql(this, "activeTriggersForSourceNodeGroupSql"); - - SymStringArray *args = SymStringArray_new(NULL); - args->add(args, sourceNodeGroupId); - int error; - SymList* triggers = sqlTemplate->query(sqlTemplate, triggerRouterSql, args, NULL, &error, (void *) SymTriggerRouterService_triggerRouterMapper); - args->destroy(args); - - SymList *triggerRouters = - this->enhanceTriggerRouters(this, triggers); - - - - return 0; -} - -SymList * SymTriggerRouterService_getAllTriggerRoutersForReloadForCurrentNode(SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId) { - // TODO - return 0; -} - -SymTriggerRouter * SymTriggerRouterService_findTriggerRouterById(SymTriggerRouterService *this, char *triggerId, char *routerId) { +SymList * SymTriggerRouterService_getTriggerRouters(SymTriggerRouterService *this) { // TODO return 0; } @@ -381,111 +155,40 @@ SymList * SymTriggerRouterService_enhanceTriggerRouters(SymTriggerRouterService return 0; } -SymMap * SymTriggerRouterService_getTriggerRoutersByChannel(SymTriggerRouterService *this, char *nodeGroupId, unsigned short refreshCache) { - // TODO - return 0; -} - void SymTriggerRouterService_insert(SymTriggerRouterService *this, SymTriggerHistory *newHistRecord) { // TODO } -void SymTriggerRouterService_deleteTriggerRouterWithId(SymTriggerRouterService *this, char *triggerId, char *routerId) { - // TODO -} - -void SymTriggerRouterService_deleteTriggerRouter(SymTriggerRouterService *this, SymTriggerRouter *triggerRouter) { - // TODO -} - -void SymTriggerRouterService_saveTriggerRouter(SymTriggerRouterService *this, SymTriggerRouter *triggerRouter, unsigned shortupdateTriggerRouterTableOnly) { - // TODO -} - -void SymTriggerRouterService_resetTriggerRouterCacheByNodeGroupId(SymTriggerRouterService *this) { - // TODO -} - -void SymTriggerRouterService_saveRouter(SymTriggerRouterService *this, SymRouter *router) { - // TODO -} - -unsigned short SymTriggerRouterService_isRouterBeingUsed(SymTriggerRouterService *this, char *routerId) { - // TODO - return 0; -} - -void SymTriggerRouterService_deleteRouter(SymTriggerRouterService *this, SymRouter *router) { - // TODO -} - -void SymTriggerRouterService_saveTrigger(SymTriggerRouterService *this, SymTrigger *trigger) { - // TODO -} - -void SymTriggerRouterService_clearCache(SymTriggerRouterService *this) { - this->triggerRouterPerNodeCacheTime = 0; - this->triggerRouterPerChannelCacheTime = 0; - this->triggerRoutersCacheTime = 0; - this->routersCacheTime = 0; - this->triggersCacheTime = 0; -} - -SymList * SymTriggerRouterService_getTriggerIdsFrom(SymTriggerRouterService *this, SymList *triggersThatShouldBeActive) { - // TODO - return 0; -} - -SymTrigger * SymTriggerRouterService_getTriggerFromList(SymTriggerRouterService *this, char *triggerId, SymList *triggersThatShouldBeActive) { - // TODO - return 0; -} - -void SymTriggerRouterService_inactivateTriggers(SymTriggerRouterService *this, SymList *triggersThatShouldBeActive, SymStringBuilder *sqlBuffer, SymList *activeTriggerHistories) { - // TODO -} - -unsigned short SymTriggerRouterService_isEqual(SymTriggerRouterService *this, char *one, char *two, unsigned short ignoreCase) { - // TODO - return 0; -} - -void SymTriggerRouterService_dropTriggersForTriggerHistory(SymTriggerRouterService *this, SymTriggerHistory *history, SymStringBuilder *sqlBuffer) { - // TODO -} - -SymList * SymTriggerRouterService_toList(SymTriggerRouterService *this, SymList *source) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getTablesForTrigger(SymTriggerRouterService *this, SymTrigger *trigger, SymList *triggers, unsigned shortuseTableCache) { - // TODO - return 0; -} - -unsigned short SymTriggerRouterService_containsExactMatchForSourceTableName(SymTriggerRouterService *this, SymTable *table, SymList *triggers, unsigned short ignoreCase) { - // TODO - return 0; -} +SymList * SymTriggerRouterService_getTriggersToSync(SymTriggerRouterService *this) { + char *nodeGroupId = this->parameterService->getNodeGroupId(this->parameterService); + SymList *triggers = SymList_new(NULL); + SymList *triggerRouters = SymTriggerRouterService_getTriggerRouters(this); + + int i; + for (i = 0; i < triggerRouters->size; i++) { + SymTriggerRouter *triggerRouter = triggerRouters->get(triggerRouters, i); + unsigned short nodeGroupIdMatches = strcmp(nodeGroupId, triggerRouter->router->nodeGroupLink->sourceNodeGroupId); + if (nodeGroupIdMatches) { + triggers->add(triggers, triggerRouter->trigger); + } + } -void SymTriggerRouterService_updateOrCreateDatabaseTriggers(SymTriggerRouterService *this, SymList *triggers, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories, unsigned shortuseTableCache) { - // TODO + return triggers; } -void SymTriggerRouterService_updateOrCreateDatabaseTrigger(SymTriggerRouterService *this, SymTrigger *trigger, SymList *triggers, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories, unsigned shortuseTableCache) { +void SymTriggerRouterService_inactivateTriggers(SymTriggerRouterService *this, SymList *triggersThatShouldBeActive, SymList *activeTriggerHistories) { // TODO } -void SymTriggerRouterService_syncTrigger(SymTriggerRouterService *this, SymTrigger *trigger, unsigned short force, unsigned short verifyInDatabase) { +void SymTriggerRouterService_dropTriggers(SymTriggerRouterService *this, SymTriggerHistory *history) { // TODO } -void SymTriggerRouterService_updateOrCreateDatabaseTriggersForTable(SymTriggerRouterService *this, SymTrigger *trigger, SymTable *table, SymStringBuilder *sqlBuffer, unsigned short force, unsigned short verifyInDatabase, SymList *activeTriggerHistories) { +void SymTriggerRouterService_updateOrCreateDatabaseTriggers(SymTriggerRouterService *this, SymTrigger *trigger, SymTable *table, SymList *activeTriggerHistories, unsigned short force) { // TODO } -SymTriggerHistory * SymTriggerRouterService_rebuildTriggerIfNecessary(SymTriggerRouterService *this, SymStringBuilder *sqlBuffer, unsigned short forceRebuild, SymTrigger *trigger, SymDataEventType *dmlType, char *reason, SymTriggerHistory *oldhist, SymTriggerHistory *hist, unsigned short triggerIsActive, SymTable *table, SymList *activeTriggerHistories) { +SymTriggerHistory * SymTriggerRouterService_rebuildTriggerIfNecessary(SymTriggerRouterService *this, unsigned short forceRebuild, SymTrigger *trigger, SymDataEventType *dmlType, char *reason, SymTriggerHistory *oldhist, SymTriggerHistory *hist, unsigned short triggerIsActive, SymTable *table, SymList *activeTriggerHistories) { // TODO return 0; } @@ -500,185 +203,53 @@ char * SymTriggerRouterService_getTriggerName(SymTriggerRouterService *this, Sym return 0; } -//SymTriggerHistory * SymTriggerHistoryMapper_mapRow(SymTriggerRouterService *this, SymRow *rs) { -// // TODO -//} - -SymNodeGroupLink * SymRouterMapper_getNodeGroupLink(SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId) { - // TODO - return 0; -} - -//SymRouter * SymRouterMapper_mapRow(SymTriggerRouterService *this, SymRow *rs) { -// // TODO -//} -// -//SymTrigger * SymTriggerMapper_mapRow(SymTriggerRouterService *this, SymRow *rs) { -// // TODO -//} -// -//SymTriggerRouter * SymTriggerRouterMapper_mapRow(SymTriggerRouterService *this, SymRow *rs) { -// // TODO -//} - -void SymTriggerRouterService_addExtraConfigTable(SymTriggerRouterService *this, char *table) { - // TODO -} - -SymMap * SymTriggerRouterService_getFailedTriggers(SymTriggerRouterService *this) { - // TODO - return 0; -} - -SymTriggerHistory * SymTriggerRouterService_findTriggerHistoryForGenericSync(SymTriggerRouterService *this) { +SymTriggerHistory * SymTriggerHistoryMapper_mapRow(SymTriggerRouterService *this, SymRow *rs) { // TODO return 0; } -SymMap * SymTriggerRouterService_fillTriggerRoutersByHistIdAndSortHist(SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId, SymList *triggerHistories) { - // TODO - return 0; -} - -SymList * SymTriggerRouterService_getSortedTablesFor(SymTriggerRouterService *this, SymList *histories) { +SymNodeGroupLink * SymRouterMapper_getNodeGroupLink(SymTriggerRouterService *this, char *sourceNodeGroupId, char *targetNodeGroupId) { // TODO return 0; } +void SymTriggerRouterService_syncTriggers(SymTriggerRouterService *this, unsigned short force) { + unsigned short autoSyncTriggers = this->parameterService->is(this->parameterService, AUTO_SYNC_TRIGGERS, 1); - -int SymTriggerRouterService_syncTriggers (SymTriggerRouterService *this, SymStringBuilder *sqlBuffer, unsigned short force) { - // This gets called by SymEngine at startup. - SymLog_info("SymTriggerRouterService_syncTriggers_withTable"); - - unsigned short autoSyncTriggers = this->parameterService->is(this->parameterService, AUTO_SYNC_TRIGGERS, 1); - - if (autoSyncTriggers) { - SymLog_info("Synchronizing triggers"); - this->platform->resetCachedTableModel(this->platform); - this->clearCache(this); - this->configurationService->clearCache(this->configurationService); - - SymList* triggersForCurrentNode = this->getTriggersForCurrentNode(this, 0); - - // TODO >>>>>>>> - } - - return 0; -} - -int SymTriggerRouterService_syncTriggersWithTable(SymTriggerRouterService *this, SymTable *table, unsigned short force) { - // TODO - unsigned short ignoreCase = this->parameterService->is(this->parameterService, AUTO_SYNC_TRIGGERS_AT_STARTUP, 0); - - SymLog_info("SymTriggerRouterService_syncTriggers_withTable"); - return 0; + if (autoSyncTriggers) { + SymLog_info("Synchronizing triggers"); + SymList *triggers = SymTriggerRouterService_getTriggersToSync(this); + SymList *activeTriggerHistories = SymTriggerRouterService_getActiveTriggerHistories(this); + SymTriggerRouterService_inactivateTriggers(this, triggers, activeTriggerHistories); + int i; + for (i = 0; i < triggers->size; i++) { + SymTrigger *trigger = triggers->get(triggers, i); + SymTable *table = this->platform->getTableFromCache(this->platform, + trigger->sourceCatalogName, trigger->sourceSchemaName, trigger->sourceTableName, 1); + SymTriggerRouterService_updateOrCreateDatabaseTriggers(this, trigger, table, activeTriggerHistories, force); + } + } } void SymTriggerRouterService_destroy(SymTriggerRouterService * this) { free(this); } -SymTriggerRouterService * SymTriggerRouterService_new(SymTriggerRouterService * this, SymParameterService *parameterService, SymDatabasePlatform *platform, SymConfigurationService *configurationService) { +SymTriggerRouterService * SymTriggerRouterService_new(SymTriggerRouterService *this, + SymConfigurationService *configurationService, SymSequenceService *sequenceService, + SymParameterService *parameterService, SymDatabasePlatform *platform) { + if (this == NULL) { this = (SymTriggerRouterService*) calloc(1, sizeof(SymTriggerRouterService)); } + + this->configurationService = configurationService; + this->sequenceService = sequenceService; this->parameterService = parameterService; this->platform = platform; - this->configurationService = configurationService; - - this->refreshFromDatabase = (void *) &SymTriggerRouterService_refreshFromDatabase; - this->getTriggers = (void *) &SymTriggerRouterService_getTriggers; - this->getTriggers = (void *) &SymTriggerRouterService_getTriggers; - this->isTriggerBeingUsed = (void *) &SymTriggerRouterService_isTriggerBeingUsed; - this->doesTriggerExist = (void *) &SymTriggerRouterService_doesTriggerExist; - this->doesTriggerExistForTable = (void *) &SymTriggerRouterService_doesTriggerExistForTable; - this->deleteTrigger = (void *) &SymTriggerRouterService_deleteTrigger; - this->dropTriggers = (void *) &SymTriggerRouterService_dropTriggers; - this->dropTriggersForTables = (void *) &SymTriggerRouterService_dropTriggersForTables; - this->deleteTriggerHistory = (void *) &SymTriggerRouterService_deleteTriggerHistory; - this->createTriggersOnChannelForTables = (void *) &SymTriggerRouterService_createTriggersOnChannelForTables; - this->createTriggersOnChannelForTablesWithReturn = (void *) &SymTriggerRouterService_createTriggersOnChannelForTablesWithReturn; - this->findMatchingTriggers = (void *) &SymTriggerRouterService_findMatchingTriggers; - this->inactivateTriggerHistory = (void *) &SymTriggerRouterService_inactivateTriggerHistory; - this->getHistoryRecords = (void *) &SymTriggerRouterService_getHistoryRecords; - this->isTriggerNameInUse = (void *) &SymTriggerRouterService_isTriggerNameInUse; - this->findTriggerHistory = (void *) &SymTriggerRouterService_findTriggerHistory; - this->findTriggerHistories = (void *) &SymTriggerRouterService_findTriggerHistories; - this->getTriggerHistory = (void *) &SymTriggerRouterService_getTriggerHistory; - this->getActiveTriggerHistoriesForTrigger = (void *) &SymTriggerRouterService_getActiveTriggerHistoriesForTrigger; - this->getNewestTriggerHistoryForTrigger = (void *) &SymTriggerRouterService_getNewestTriggerHistoryForTrigger; - this->getActiveTriggerHistoriesFromCache = (void *) &SymTriggerRouterService_getActiveTriggerHistoriesFromCache; - this->getActiveTriggerHistories = (void *) &SymTriggerRouterService_getActiveTriggerHistories; - this->getActiveTriggerHistoriesForTable = (void *) &SymTriggerRouterService_getActiveTriggerHistoriesForTable; - this->buildTriggersForSymmetricTables = (void *) &SymTriggerRouterService_buildTriggersForSymmetricTables; - this->buildTriggerForSymmetricTable = (void *) &SymTriggerRouterService_buildTriggerForSymmetricTable; - this->buildTriggerRoutersForSymmetricTables = (void *) &SymTriggerRouterService_buildTriggerRoutersForSymmetricTables; - this->buildSymmetricTableRouterId = (void *) &SymTriggerRouterService_buildSymmetricTableRouterId; - this->buildTriggerRoutersForSymmetricTablesWithNodeGroupLink = (void *) &SymTriggerRouterService_buildTriggerRoutersForSymmetricTablesWithNodeGroupLink; - this->getTriggerRouterForTableForCurrentNode = (void *) &SymTriggerRouterService_getTriggerRouterForTableForCurrentNode; - this->isMatch = (void *) &SymTriggerRouterService_isMatch; - this->isMatchTableName = (void *) &SymTriggerRouterService_isMatchTableName; - this->getConfigurationTablesTriggerRoutersForCurrentNode = (void *) &SymTriggerRouterService_getConfigurationTablesTriggerRoutersForCurrentNode; - this->mergeInConfigurationTablesTriggerRoutersForCurrentNode = (void *) &SymTriggerRouterService_mergeInConfigurationTablesTriggerRoutersForCurrentNode; - this->doesTriggerRouterExistInList = (void *) &SymTriggerRouterService_doesTriggerRouterExistInList; - this->getTriggerRouterForCurrentNode = (void *) &SymTriggerRouterService_getTriggerRouterForCurrentNode; - this->getTriggerRoutersForCurrentNode = (void *) &SymTriggerRouterService_getTriggerRoutersForCurrentNode; - this->getTriggersForCurrentNode = (void *) &SymTriggerRouterService_getTriggersForCurrentNode; - this->getTriggerRoutersCacheForCurrentNode = (void *) &SymTriggerRouterService_getTriggerRoutersCacheForCurrentNode; - this->getActiveRouterByIdForCurrentNode = (void *) &SymTriggerRouterService_getActiveRouterByIdForCurrentNode; - this->getRoutersByGroupLink = (void *) &SymTriggerRouterService_getRoutersByGroupLink; - this->getTriggerForCurrentNodeById = (void *) &SymTriggerRouterService_getTriggerForCurrentNodeById; - this->getTriggerById = (void *) &SymTriggerRouterService_getTriggerById; - this->getRouterById = (void *) &SymTriggerRouterService_getRouterById; - this->getRouters = (void *) &SymTriggerRouterService_getRouters; - this->getTriggerRouterSql = (void *) &SymTriggerRouterService_getTriggerRouterSql; - this->getTriggerRouters = (void *) &SymTriggerRouterService_getTriggerRouters; - this->getAllTriggerRoutersForCurrentNode = (void *) &SymTriggerRouterService_getAllTriggerRoutersForCurrentNode; - this->getAllTriggerRoutersForReloadForCurrentNode = (void *) &SymTriggerRouterService_getAllTriggerRoutersForReloadForCurrentNode; - this->findTriggerRouterById = (void *) &SymTriggerRouterService_findTriggerRouterById; - this->enhanceTriggerRouters = (void *) &SymTriggerRouterService_enhanceTriggerRouters; - this->getTriggerRoutersByChannel = (void *) &SymTriggerRouterService_getTriggerRoutersByChannel; - this->getTriggerRoutersByChannel = (void *) &SymTriggerRouterService_getTriggerRoutersByChannel; - this->insert = (void *) &SymTriggerRouterService_insert; - this->deleteTriggerRouterWithId = (void *) &SymTriggerRouterService_deleteTriggerRouterWithId; - this->deleteTriggerRouter = (void *) &SymTriggerRouterService_deleteTriggerRouter; - this->saveTriggerRouter = (void *) &SymTriggerRouterService_saveTriggerRouter; - this->resetTriggerRouterCacheByNodeGroupId = (void *) &SymTriggerRouterService_resetTriggerRouterCacheByNodeGroupId; - this->saveRouter = (void *) &SymTriggerRouterService_saveRouter; - this->isRouterBeingUsed = (void *) &SymTriggerRouterService_isRouterBeingUsed; - this->deleteRouter = (void *) &SymTriggerRouterService_deleteRouter; - this->saveTrigger = (void *) &SymTriggerRouterService_saveTrigger; - this->clearCache = (void *) &SymTriggerRouterService_clearCache; - this->getTriggerIdsFrom = (void *) &SymTriggerRouterService_getTriggerIdsFrom; - this->getTriggerFromList = (void *) &SymTriggerRouterService_getTriggerFromList; - this->inactivateTriggers = (void *) &SymTriggerRouterService_inactivateTriggers; - this->isEqual = (void *) &SymTriggerRouterService_isEqual; - this->dropTriggersForTriggerHistory = (void *) &SymTriggerRouterService_dropTriggersForTriggerHistory; - this->toList = (void *) &SymTriggerRouterService_toList; - this->getTablesForTrigger = (void *) &SymTriggerRouterService_getTablesForTrigger; - this->containsExactMatchForSourceTableName = (void *) &SymTriggerRouterService_containsExactMatchForSourceTableName; - this->updateOrCreateDatabaseTriggers = (void *) &SymTriggerRouterService_updateOrCreateDatabaseTriggers; - this->updateOrCreateDatabaseTrigger = (void *) &SymTriggerRouterService_updateOrCreateDatabaseTrigger; - this->syncTrigger = (void *) &SymTriggerRouterService_syncTrigger; - this->updateOrCreateDatabaseTriggersForTable = (void *) &SymTriggerRouterService_updateOrCreateDatabaseTriggersForTable; - this->rebuildTriggerIfNecessary = (void *) &SymTriggerRouterService_rebuildTriggerIfNecessary; - this->replaceCharsToShortenName = (void *) &SymTriggerRouterService_replaceCharsToShortenName; - this->getTriggerName = (void *) &SymTriggerRouterService_getTriggerName; -// this->mapRow = (void *) &SymTriggerHistoryMapper_mapRow; - this->getNodeGroupLink = (void *) &SymRouterMapper_getNodeGroupLink; -// this->mapRow = (void *) &SymRouterMapper_mapRow; -// this->mapRow = (void *) &SymTriggerMapper_mapRow; -// this->mapRow = (void *) &SymTriggerRouterMapper_mapRow; - this->addExtraConfigTable = (void *) &SymTriggerRouterService_addExtraConfigTable; - this->getFailedTriggers = (void *) &SymTriggerRouterService_getFailedTriggers; - this->findTriggerHistoryForGenericSync = (void *) &SymTriggerRouterService_findTriggerHistoryForGenericSync; - this->fillTriggerRoutersByHistIdAndSortHist = (void *) &SymTriggerRouterService_fillTriggerRoutersByHistIdAndSortHist; - this->getSortedTablesFor = (void *) &SymTriggerRouterService_getSortedTablesFor; - this->syncTriggers = (void *) &SymTriggerRouterService_syncTriggers; - this->syncTriggersWithTable = (void *) &SymTriggerRouterService_syncTriggersWithTable; + this->destroy = (void *) &SymTriggerRouterService_destroy; return this; } From 18b0a2b462d9fc6b6f899682cb1919abd3fc5776 Mon Sep 17 00:00:00 2001 From: gwilmer Date: Wed, 14 Oct 2015 17:16:28 -0400 Subject: [PATCH 3/6] Refactor Wrapper so it can be used for other products. --- .../symmetric/wrapper/AbstractWrapper.java | 82 +++++++++++++++++++ .../jumpmind/symmetric/wrapper/Wrapper.java | 74 ++--------------- 2 files changed, 87 insertions(+), 69 deletions(-) create mode 100644 symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/AbstractWrapper.java diff --git a/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/AbstractWrapper.java b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/AbstractWrapper.java new file mode 100644 index 0000000000..bcc31ea5ff --- /dev/null +++ b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/AbstractWrapper.java @@ -0,0 +1,82 @@ +package org.jumpmind.symmetric.wrapper; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +public abstract class AbstractWrapper { + + + protected static void run(String[] args, String applHomeDir, String configFileName) { + + checkArgs(args); + System.setProperty("java.io.tmpdir", applHomeDir + File.separator + "tmp"); + + WrapperService service = WrapperService.getInstance(); + try { + service.loadConfig(configFileName); + } catch (FileNotFoundException e) { + System.out.println("Missing config file " + args[1]); + System.out.println(e.getMessage()); + System.exit(Constants.RC_MISSING_CONFIG_FILE); + } catch (IOException e) { + System.out.println("Cannot read config file " + args[1]); + System.out.println(e.getMessage()); + System.exit(Constants.RC_FAIL_READ_CONFIG_FILE); + } + + try { + if (args[0].equalsIgnoreCase("start")) { + service.start(); + } else if (args[0].equalsIgnoreCase("exec")) { + service.execJava(false); + } else if (args[0].equalsIgnoreCase("init")) { + service.init(); + } else if (args[0].equalsIgnoreCase("stop")) { + service.stop(); + } else if (args[0].equalsIgnoreCase("restart")) { + service.restart(); + } else if (args[0].equalsIgnoreCase("install")) { + service.install(); + } else if (args[0].equalsIgnoreCase("uninstall")) { + service.uninstall(); + } else if (args[0].equalsIgnoreCase("status")) { + service.status(); + } else if (args[0].equalsIgnoreCase("console")) { + service.console(); + } else { + System.out.println("ERROR: Invalid argument"); + printUsage(); + System.exit(Constants.RC_INVALID_ARGUMENT); + } + } catch (WrapperException e) { + System.out.println("Error " + e.getErrorCode() + ": " + e.getMessage()); + if (e.getCause() != null) { + System.out.println("Exception " + e.getCause().getClass().getSimpleName() + ": " + + e.getCause().getMessage()); + } + if (e.getNativeErrorCode() > 0) { + System.out.println("Native error " + e.getErrorCode()); + } + System.exit(e.getErrorCode()); + } + } + + private static void checkArgs(String[] args) { + if (args.length < 1) { + printUsage(); + System.exit(Constants.RC_BAD_USAGE); + } + } + + protected static void printUsage() { + System.out.println("Usage: "); + System.out.println(" start - Start service"); + System.out.println(" stop - Stop service"); + System.out.println(" restart - Restart service"); + System.out.println(" install - Install service"); + System.out.println(" uninstall - Uninstall service"); + System.out.println(" status - Status of service"); + System.out.println(" console - Run from console"); + } +} diff --git a/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/Wrapper.java b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/Wrapper.java index f617f09885..02fa81fc57 100644 --- a/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/Wrapper.java +++ b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/Wrapper.java @@ -21,18 +21,13 @@ package org.jumpmind.symmetric.wrapper; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -public class Wrapper { +public class Wrapper extends AbstractWrapper { public static void main(String[] args) throws Exception { - if (args.length < 1) { - printUsage(); - System.exit(Constants.RC_BAD_USAGE); - } - + String dir = System.getenv(Constants.ENV_SYM_HOME); + if (dir == null || dir.equals("")) { // Backwards compatible with 3.6 by allowing config file argument to determine home if (args.length > 1) { @@ -47,67 +42,8 @@ public static void main(String[] args) throws Exception { System.exit(Constants.RC_MISSING_SYM_HOME); } } - System.setProperty("java.io.tmpdir", dir + File.separator + "tmp"); String configFile = dir + File.separator + "conf" + File.separator + "sym_service.conf"; - - WrapperService service = WrapperService.getInstance(); - try { - service.loadConfig(configFile); - } catch (FileNotFoundException e) { - System.out.println("Missing config file " + args[1]); - System.out.println(e.getMessage()); - System.exit(Constants.RC_MISSING_CONFIG_FILE); - } catch (IOException e) { - System.out.println("Cannot read config file " + args[1]); - System.out.println(e.getMessage()); - System.exit(Constants.RC_FAIL_READ_CONFIG_FILE); - } - - try { - if (args[0].equalsIgnoreCase("start")) { - service.start(); - } else if (args[0].equalsIgnoreCase("exec")) { - service.execJava(false); - } else if (args[0].equalsIgnoreCase("init")) { - service.init(); - } else if (args[0].equalsIgnoreCase("stop")) { - service.stop(); - } else if (args[0].equalsIgnoreCase("restart")) { - service.restart(); - } else if (args[0].equalsIgnoreCase("install")) { - service.install(); - } else if (args[0].equalsIgnoreCase("uninstall")) { - service.uninstall(); - } else if (args[0].equalsIgnoreCase("status")) { - service.status(); - } else if (args[0].equalsIgnoreCase("console")) { - service.console(); - } else { - System.out.println("ERROR: Invalid argument"); - printUsage(); - System.exit(Constants.RC_INVALID_ARGUMENT); - } - } catch (WrapperException e) { - System.out.println("Error " + e.getErrorCode() + ": " + e.getMessage()); - if (e.getCause() != null) { - System.out.println("Exception " + e.getCause().getClass().getSimpleName() + ": " - + e.getCause().getMessage()); - } - if (e.getNativeErrorCode() > 0) { - System.out.println("Native error " + e.getErrorCode()); - } - System.exit(e.getErrorCode()); - } - } - - private static void printUsage() { - System.out.println("Usage: "); - System.out.println(" start - Start service"); - System.out.println(" stop - Stop service"); - System.out.println(" restart - Restart service"); - System.out.println(" install - Install service"); - System.out.println(" uninstall - Uninstall service"); - System.out.println(" status - Status of service"); - System.out.println(" console - Run from console"); + + run(args, dir, configFile); } } From d5ebfad9f8749c6a631a3bee955c0ee5b44efef0 Mon Sep 17 00:00:00 2001 From: mmichalek Date: Thu, 15 Oct 2015 08:42:13 -0400 Subject: [PATCH 4/6] Implement NodeGroupLink. --- .../src/model/NodeGroupLink.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 symmetric-client-clib/src/model/NodeGroupLink.c diff --git a/symmetric-client-clib/src/model/NodeGroupLink.c b/symmetric-client-clib/src/model/NodeGroupLink.c new file mode 100644 index 0000000000..733d6a8ad6 --- /dev/null +++ b/symmetric-client-clib/src/model/NodeGroupLink.c @@ -0,0 +1,34 @@ +/** + * Licensed to JumpMind Inc under one or more contributor + * license agreements. See the NOTICE file distributed + * with this work for additional information regarding + * copyright ownership. JumpMind Inc licenses this file + * to you under the GNU General Public License, version 3.0 (GPLv3) + * (the "License"); you may not use this file except in compliance + * with the License. + * + * You should have received a copy of the GNU General Public License, + * version 3.0 (GPLv3) along with this library; if not, see + * . + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#include "model/NodeGroupLink.h" + + +void SymNodeGroupLink_destroy(SymNodeGroupLink *this) { + free(this); +} + +SymNodeGroupLink * SymNodeGroupLink_new(SymNodeGroupLink *this) { + if (this == NULL) { + this = (SymNodeGroupLink *) calloc(1, sizeof(SymNodeGroupLink)); + } + this->destroy = (void *) &SymNodeGroupLink_destroy; + return this; +} From 5fe3a3f883c864ed651888274137da4569775045 Mon Sep 17 00:00:00 2001 From: mmichalek Date: Thu, 15 Oct 2015 10:18:21 -0400 Subject: [PATCH 5/6] Add isNotBlank() for readability and consistency with the Java code. --- symmetric-client-clib/inc/util/StringUtils.h | 1 + symmetric-client-clib/src/util/StringUtils.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/symmetric-client-clib/inc/util/StringUtils.h b/symmetric-client-clib/inc/util/StringUtils.h index 94e164bc3a..b8cf97b0ca 100644 --- a/symmetric-client-clib/inc/util/StringUtils.h +++ b/symmetric-client-clib/inc/util/StringUtils.h @@ -27,5 +27,6 @@ char *Sym_trim(char *str); char *Sym_toUpperCase(char *str); char *Sym_toLowerCase(char *str); unsigned short Sym_isBlank(char *str); +unsigned short Sym_isNotBlank(char *str); #endif /* INC_UTIL_STRINGUTILS_H_ */ diff --git a/symmetric-client-clib/src/util/StringUtils.c b/symmetric-client-clib/src/util/StringUtils.c index 8c4972c554..caccf2769a 100644 --- a/symmetric-client-clib/src/util/StringUtils.c +++ b/symmetric-client-clib/src/util/StringUtils.c @@ -100,3 +100,7 @@ unsigned short Sym_isBlank(char *str) { return 1; } + +unsigned short Sym_isNotBlank(char *str) { + return ! Sym_isBlank(str); +} From 0196aa386de2b91c3b2135e7ce47fc474963ebe0 Mon Sep 17 00:00:00 2001 From: mmichalek Date: Thu, 15 Oct 2015 10:22:44 -0400 Subject: [PATCH 6/6] Add implementation for TriggerHistory. --- .../inc/model/TriggerHistory.h | 4 +++ .../src/model/TriggerHistory.c | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 symmetric-client-clib/src/model/TriggerHistory.c diff --git a/symmetric-client-clib/inc/model/TriggerHistory.h b/symmetric-client-clib/inc/model/TriggerHistory.h index 18ca059eea..762b0ce4db 100644 --- a/symmetric-client-clib/inc/model/TriggerHistory.h +++ b/symmetric-client-clib/inc/model/TriggerHistory.h @@ -50,6 +50,10 @@ typedef struct SymTriggerHistory { long triggerRowHash; long triggerTemplateHash; char *lastTriggerBuildReason; + + void (*destroy)(struct SymTriggerHistory *this); } SymTriggerHistory; +SymTriggerHistory * SymTriggerHistory_new(SymTriggerHistory *this); + #endif diff --git a/symmetric-client-clib/src/model/TriggerHistory.c b/symmetric-client-clib/src/model/TriggerHistory.c new file mode 100644 index 0000000000..fcf8a5f4b1 --- /dev/null +++ b/symmetric-client-clib/src/model/TriggerHistory.c @@ -0,0 +1,34 @@ +/** + * Licensed to JumpMind Inc under one or more contributor + * license agreements. See the NOTICE file distributed + * with this work for additional information regarding + * copyright ownership. JumpMind Inc licenses this file + * to you under the GNU General Public License, version 3.0 (GPLv3) + * (the "License"); you may not use this file except in compliance + * with the License. + * + * You should have received a copy of the GNU General Public License, + * version 3.0 (GPLv3) along with this library; if not, see + * . + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#include "model/TriggerHistory.h" + + +void SymTriggerHistory_destroy(SymTriggerHistory *this) { + free(this); +} + +SymTriggerHistory * SymTriggerHistory_new(SymTriggerHistory *this) { + if (this == NULL) { + this = (SymTriggerHistory *) calloc(1, sizeof(SymTriggerHistory)); + } + this->destroy = (void *) &SymTriggerHistory_destroy; + return this; +}