From affd5ca9f5664a2f2f1a131b5a5cac6595fb2fc2 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 4 Dec 2020 21:03:05 +0300 Subject: Dbx_mdbx: now we very quickly load _all_ settings into memory to reject cache misses without any need to look into database --- src/mir_app/src/mdatabasecache.cpp | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/mir_app/src/mdatabasecache.cpp b/src/mir_app/src/mdatabasecache.cpp index 2ddd3cf44c..8893fcd7a4 100644 --- a/src/mir_app/src/mdatabasecache.cpp +++ b/src/mir_app/src/mdatabasecache.cpp @@ -154,15 +154,39 @@ char* MDatabaseCache::GetCachedSetting(const char *szModuleName, const char *szS void MDatabaseCache::SetCachedVariant(DBVARIANT* s /* new */, DBVARIANT* d /* cached */) { - char* szSave = (d->type == DBVT_UTF8 || d->type == DBVT_ASCIIZ) ? d->pszVal : nullptr; + void *szSave = nullptr; + if (d->type & DBVTF_VARIABLELENGTH) + szSave = (d->type == DBVT_UTF8 || d->type == DBVT_ASCIIZ) ? (void*)d->pszVal : d->pbVal; memcpy(d, s, sizeof(DBVARIANT)); - if ((s->type == DBVT_UTF8 || s->type == DBVT_ASCIIZ) && s->pszVal != nullptr) { - if (szSave != nullptr) - d->pszVal = (char*)mir_realloc(szSave, mir_strlen(s->pszVal) + 1); - else - d->pszVal = (char*)mir_alloc(mir_strlen(s->pszVal) + 1); - mir_strcpy(d->pszVal, s->pszVal); + + if (s->type & DBVTF_VARIABLELENGTH) { + // string variable length value + if (s->type == DBVT_UTF8 || s->type == DBVT_ASCIIZ) { + if (s->pszVal == nullptr) { + mir_free(szSave); + return; + } + + if (szSave != nullptr) + d->pszVal = (char*)mir_realloc(szSave, mir_strlen(s->pszVal) + 1); + else + d->pszVal = (char*)mir_alloc(mir_strlen(s->pszVal) + 1); + strcpy(d->pszVal, s->pszVal); + } + // binary variable length value + else { + if (s->pbVal == nullptr) { + mir_free(szSave); + return; + } + + if (szSave != nullptr) + d->pbVal = (BYTE*)mir_realloc(szSave, s->cpbVal); + else + d->pbVal = (BYTE*)mir_alloc(s->cpbVal); + memcpy(d->pbVal, s->pbVal, s->cpbVal); + } } else if (szSave != nullptr) mir_free(szSave); -- cgit v1.2.3