diff options
author | George Hazan <ghazan@miranda.im> | 2020-12-04 21:03:05 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2020-12-04 21:03:05 +0300 |
commit | affd5ca9f5664a2f2f1a131b5a5cac6595fb2fc2 (patch) | |
tree | 2302bf211085bae8c7484f5f384b03f3afc4a7dd /src/mir_app | |
parent | 85370ab3a02ba4e167f20424d547d5e17f240352 (diff) |
Dbx_mdbx: now we very quickly load _all_ settings into memory to reject cache misses without any need to look into database
Diffstat (limited to 'src/mir_app')
-rw-r--r-- | src/mir_app/src/mdatabasecache.cpp | 38 |
1 files changed, 31 insertions, 7 deletions
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);
|