From 675dae55a96f8f0df9577e14e78e10acd8023567 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Thu, 13 Feb 2020 17:10:04 -0800 Subject: [PATCH] Added ability to serialize cached entries --- microstack/ILibSimpleDataStore.c | 68 ++++++++++++++++++++++++++++++++ microstack/ILibSimpleDataStore.h | 1 + 2 files changed, 69 insertions(+) diff --git a/microstack/ILibSimpleDataStore.c b/microstack/ILibSimpleDataStore.c index df47bc6..3e3fe4a 100644 --- a/microstack/ILibSimpleDataStore.c +++ b/microstack/ILibSimpleDataStore.c @@ -123,6 +123,74 @@ void ILibSimpleDataStore_Cached(ILibSimpleDataStore dataStore, char* key, int ke ILibHashtable_Put(root->cacheTable, NULL, key, keyLen, entry); } +typedef struct ILibSimpleDateStore_JSONCache +{ + char *buffer; + int offset; + int bufferLen; +}ILibSimpleDateStore_JSONCache; + +void ILibSimpleDataStore_Cached_GetJSON_count(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user) +{ + ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user; + ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data; + + if (cache->bufferLen == 0) + { + cache->bufferLen = 3; + } + else + { + ++cache->bufferLen; + } + + cache->bufferLen += (Key2Len + 3); + cache->bufferLen += (entry->valueLength + 2); +} +void ILibSimpleDataStore_Cached_GetJSON_write(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user) +{ + ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user; + ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data; + + if (cache->offset != 1) { cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, ","); } + + cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\""); + memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, Key2, Key2Len); cache->offset += Key2Len; + cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\":\""); + memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, entry->value, entry->valueLength); cache->offset += entry->valueLength; + cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\""); +} + +int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen) +{ + ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore; + if (root->cacheTable == NULL) + { + if (bufferLen < 3) + { + return(3); + } + else + { + return(sprintf_s(buffer, (size_t)bufferLen, "{}")); + } + } + ILibSimpleDateStore_JSONCache cache; + cache.buffer = NULL; + cache.offset = 0; + cache.bufferLen = 0; + ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_count, &cache); + + if (buffer == NULL || bufferLen < cache.bufferLen) { return(cache.bufferLen); } + cache.buffer = buffer; + cache.offset = sprintf_s(buffer, bufferLen, "{"); + cache.bufferLen = bufferLen; + + ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_write, &cache); + cache.offset += sprintf_s(cache.buffer + cache.offset, cache.bufferLen - cache.offset, "}"); + return(cache.offset); +} + // Write a key/value pair to file, the hash is already calculated uint64_t ILibSimpleDataStore_WriteRecord(FILE *f, char* key, int keyLen, char* value, int valueLen, char* hash) { diff --git a/microstack/ILibSimpleDataStore.h b/microstack/ILibSimpleDataStore.h index 90f5002..1da80ad 100644 --- a/microstack/ILibSimpleDataStore.h +++ b/microstack/ILibSimpleDataStore.h @@ -52,6 +52,7 @@ int ILibSimpleDataStore_Exists(char *filePath); // Close the data store. __EXPORT_TYPE void ILibSimpleDataStore_Close(ILibSimpleDataStore dataStore); __EXPORT_TYPE void ILibSimpleDataStore_Cached(ILibSimpleDataStore dataStore, char* key, int keyLen, char* value, int valueLen); +__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen); __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))