From 42f1ea97cf67d3f9f9c96481db4676bcc145af78 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Fri, 27 Mar 2020 21:14:39 -0700 Subject: [PATCH] Added db size threshold option --- meshcore/agentcore.c | 6 ++++++ microstack/ILibSimpleDataStore.c | 18 +++++++++++++++++- microstack/ILibSimpleDataStore.h | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 0bb555d..a9b2550 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -3459,6 +3459,11 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) } free(host); } +void MeshServer_DbWarning(ILibSimpleDataStore db, uint64_t size, void *user) +{ + MeshAgentHostContainer *agent = (MeshAgentHostContainer*)user; + MeshAgent_sendConsoleText(agent->meshCoreCtx, "Database Size Warning: [%u bytes]", size); +} void MeshServer_Connect(MeshAgentHostContainer *agent) { unsigned int timeout; @@ -3469,6 +3474,7 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) util_random(sizeof(int), (char*)&timeout); gRemoteMouseRenderDefault = ILibSimpleDataStore_Get(agent->masterDb, "remoteMouseRender", NULL, 0); ILibSimpleDataStore_ConfigCompact(agent->masterDb, ILibSimpleDataStore_GetInt(agent->masterDb, "compactDirtyMinimum", 0)); + ILibSimpleDataStore_ConfigSizeLimit(agent->masterDb, ILibSimpleDataStore_GetInt(agent->masterDb, "dbWarningSizeThreshold", 0), MeshServer_DbWarning, agent); agent->disableUpdate = ILibSimpleDataStore_Get(agent->masterDb, "disableUpdate", NULL, 0); agent->forceUpdate = ILibSimpleDataStore_Get(agent->masterDb, "forceUpdate", NULL, 0); agent->logUpdate = ILibSimpleDataStore_Get(agent->masterDb, "logUpdate", NULL, 0); diff --git a/microstack/ILibSimpleDataStore.c b/microstack/ILibSimpleDataStore.c index 1aa7c1f..9be9b88 100644 --- a/microstack/ILibSimpleDataStore.c +++ b/microstack/ILibSimpleDataStore.c @@ -50,6 +50,9 @@ typedef struct ILibSimpleDataStore_Root uint64_t fileSize; uint64_t dirtySize; uint64_t minimumDirtySize; + uint64_t warningSize; + ILibSimpleDataStore_SizeWarningHandler warningSink; + void* warningSinkUser; int error; } ILibSimpleDataStore_Root; @@ -602,6 +605,7 @@ __EXPORT_TYPE void ILibSimpleDataStore_Close(ILibSimpleDataStore dataStore) // Store a key/value pair in the data store __EXPORT_TYPE int ILibSimpleDataStore_PutEx(ILibSimpleDataStore dataStore, char* key, int keyLen, char* value, int valueLen) { + int ret; char hash[SHA384HASHSIZE]; ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore; ILibSimpleDataStore_TableEntry *entry; @@ -628,7 +632,12 @@ __EXPORT_TYPE int ILibSimpleDataStore_PutEx(ILibSimpleDataStore dataStore, char* root->fileSize = ILibSimpleDataStore_GetPosition(root->dataFile); // Update the size of the data store; // Add the record to the data store - return ILibHashtable_Put(root->keyTable, NULL, key, keyLen, entry) == NULL ? 0 : 1; + ret = ILibHashtable_Put(root->keyTable, NULL, key, keyLen, entry) == NULL ? 0 : 1; + if (root->warningSize > 0 && root->fileSize > root->warningSize && root->warningSink != NULL) + { + root->warningSink(root, root->fileSize, root->warningSinkUser); + } + return(ret); } __EXPORT_TYPE int ILibSimpleDataStore_GetInt(ILibSimpleDataStore dataStore, char* key, int defaultValue) @@ -800,6 +809,13 @@ __EXPORT_TYPE void ILibSimpleDataStore_EnumerateKeys(ILibSimpleDataStore dataSto if (handler != NULL) { ILibHashtable_Enumerate(root->keyTable, ILibSimpleDataStore_EnumerateKeysSink, users); } } +__EXPORT_TYPE void ILibSimpleDataStore_ConfigSizeLimit(ILibSimpleDataStore dataStore, uint64_t sizeLimit, ILibSimpleDataStore_SizeWarningHandler handler, void *user) +{ + ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore; + root->warningSize = sizeLimit; + root->warningSink = sizeLimit > 0 ? handler : NULL; + root->warningSinkUser = sizeLimit > 0 ? user : NULL; +} __EXPORT_TYPE void ILibSimpleDataStore_ConfigCompact(ILibSimpleDataStore dataStore, uint64_t minimumDirtySize) { ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore; diff --git a/microstack/ILibSimpleDataStore.h b/microstack/ILibSimpleDataStore.h index 1a60fc6..5aa52e2 100644 --- a/microstack/ILibSimpleDataStore.h +++ b/microstack/ILibSimpleDataStore.h @@ -39,6 +39,7 @@ typedef void* ILibSimpleDataStore; const extern int ILibMemory_SimpleDataStore_CONTAINERSIZE; typedef void(*ILibSimpleDataStore_KeyEnumerationHandler)(ILibSimpleDataStore sender, char* Key, int KeyLen, void *user); +typedef void(*ILibSimpleDataStore_SizeWarningHandler)(ILibSimpleDataStore sender, uint64_t size, void *user); // Create the data store. __EXPORT_TYPE ILibSimpleDataStore ILibSimpleDataStore_CreateEx2(char* filePath, int userExtraMemorySize, int readonly); @@ -55,6 +56,7 @@ __EXPORT_TYPE void ILibSimpleDataStore_Cached(ILibSimpleDataStore dataStore, cha __EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen); __EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSONEx(ILibSimpleDataStore dataStore, char *buffer, int bufferLen); __EXPORT_TYPE void ILibSimpleDataStore_ConfigCompact(ILibSimpleDataStore dataStore, uint64_t minimumDirtySize); +__EXPORT_TYPE void ILibSimpleDataStore_ConfigSizeLimit(ILibSimpleDataStore dataStore, uint64_t sizeLimit, ILibSimpleDataStore_SizeWarningHandler handler, void *user); __EXPORT_TYPE int ILibSimpleDataStore_PutEx(ILibSimpleDataStore dataStore, char* key, int keyLen, char* value, int valueLen); #define ILibSimpleDataStore_Put(dataStore, key, value) ILibSimpleDataStore_PutEx(dataStore, key, (int)strnlen_s(key, ILibSimpleDataStore_MaxKeyLength), value, (int)strnlen_s(value, ILibSimpleDataStore_MaxUnspecifiedValueLen))