summaryrefslogtreecommitdiff
path: root/plugins/Dbx_mdbx/src/dbsettings.cpp
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-01-07 19:37:08 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-01-07 19:37:08 +0300
commitff65292a817e82bf5fd58811cfa436a8c5232bd9 (patch)
tree697237c9680b0212e8d8cc24fcbb75cdae4554fd /plugins/Dbx_mdbx/src/dbsettings.cpp
parent5508a77c6103f979697dd72d5a72347a354d020d (diff)
more common code moved to MDatabaseCommon
Diffstat (limited to 'plugins/Dbx_mdbx/src/dbsettings.cpp')
-rw-r--r--plugins/Dbx_mdbx/src/dbsettings.cpp239
1 files changed, 16 insertions, 223 deletions
diff --git a/plugins/Dbx_mdbx/src/dbsettings.cpp b/plugins/Dbx_mdbx/src/dbsettings.cpp
index 429403a359..6a8f182125 100644
--- a/plugins/Dbx_mdbx/src/dbsettings.cpp
+++ b/plugins/Dbx_mdbx/src/dbsettings.cpp
@@ -82,233 +82,30 @@ void CDbxMDBX::FillSettings()
/////////////////////////////////////////////////////////////////////////////////////////
-#define VLT(n) ((n == DBVT_UTF8 || n == DBVT_ENCRYPTED)?DBVT_ASCIIZ:n)
-
-static bool ValidLookupName(const char *szModule, const char *szSetting)
-{
- if (!strcmp(szModule, META_PROTO))
- return strcmp(szSetting, "IsSubcontact") && strcmp(szSetting, "ParentMetaID");
-
- return false;
-}
-
-int CDbxMDBX::GetContactSettingWorker(MCONTACT contactID, const char *szModule, const char *szSetting, DBVARIANT *dbv, int isStatic)
+BOOL CDbxMDBX::WriteContactSettingWorker(MCONTACT contactID, DBCONTACTWRITESETTING &dbcws)
{
- if (szSetting == nullptr || szModule == nullptr)
- return 1;
-
- DBVARIANT *pCachedValue;
- size_t settingNameLen = strlen(szSetting);
- size_t moduleNameLen = strlen(szModule);
- {
- mir_cslock lck(m_csDbAccess);
-
-LBL_Seek:
- char *szCachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, moduleNameLen, settingNameLen);
-
- pCachedValue = m_cache->GetCachedValuePtr(contactID, szCachedSettingName, 0);
- if (pCachedValue == nullptr) {
- // if nothing was faound, try to lookup the same setting from meta's default contact
- if (contactID) {
- DBCachedContact *cc = m_cache->GetCachedContact(contactID);
- if (cc && cc->IsMeta() && ValidLookupName(szModule, szSetting)) {
- if (contactID = db_mc_getDefault(contactID)) {
- szModule = Proto_GetBaseAccountName(contactID);
- if (szModule == nullptr) // smth went wrong
- return 1;
-
- moduleNameLen = strlen(szModule);
- goto LBL_Seek;
- }
- }
- }
-
- // otherwise fail
- return 1;
- }
- }
-
- switch(pCachedValue->type) {
- case DBVT_ASCIIZ:
- case DBVT_UTF8:
- dbv->type = pCachedValue->type;
- if (isStatic) {
- int cbLen = (int)mir_strlen(pCachedValue->pszVal);
- int cbOrigLen = dbv->cchVal;
- cbOrigLen--;
- if (cbLen < cbOrigLen)
- cbOrigLen = cbLen;
- memcpy(dbv->pszVal, pCachedValue->pszVal, cbOrigLen);
- dbv->pszVal[cbOrigLen] = 0;
- dbv->cchVal = cbLen;
- }
- else {
- dbv->pszVal = (char *)mir_alloc(strlen(pCachedValue->pszVal) + 1);
- strcpy(dbv->pszVal, pCachedValue->pszVal);
- dbv->cchVal = pCachedValue->cchVal;
- }
- break;
-
- case DBVT_BLOB:
- dbv->type = DBVT_BLOB;
- if (isStatic) {
- if (pCachedValue->cpbVal < dbv->cpbVal)
- dbv->cpbVal = pCachedValue->cpbVal;
- memcpy(dbv->pbVal, pCachedValue->pbVal, dbv->cpbVal);
- }
- else {
- dbv->pbVal = (BYTE *)mir_alloc(pCachedValue->cpbVal);
- memcpy(dbv->pbVal, pCachedValue->pbVal, pCachedValue->cpbVal);
- }
- dbv->cpbVal = pCachedValue->cpbVal;
- break;
-
- case DBVT_ENCRYPTED:
- if (m_crypto != nullptr) {
- size_t realLen;
- ptrA decoded(m_crypto->decodeString(pCachedValue->pbVal, pCachedValue->cpbVal, &realLen));
- if (decoded == nullptr)
- return 1;
-
- dbv->type = DBVT_UTF8;
- if (isStatic) {
- dbv->cchVal--;
- if (realLen < dbv->cchVal)
- dbv->cchVal = WORD(realLen);
- memcpy(dbv->pszVal, decoded, dbv->cchVal);
- dbv->pszVal[dbv->cchVal] = 0;
- dbv->cchVal = WORD(realLen);
- }
- else {
- dbv->pszVal = (char *)mir_alloc(1 + realLen);
- memcpy(dbv->pszVal, decoded, realLen);
- dbv->pszVal[realLen] = 0;
- }
- break;
- }
- return 1;
-
- default:
- memcpy(dbv, pCachedValue, sizeof(DBVARIANT));
- }
-
- return 0;
-}
-
-BOOL CDbxMDBX::WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws)
-{
- if (dbcws == nullptr || dbcws->szSetting == nullptr || dbcws->szModule == nullptr || m_bReadOnly)
- return 1;
-
- // the db format can't tolerate more than 255 bytes of space (incl. null) for settings+module name
- size_t settingNameLen = strlen(dbcws->szSetting);
- size_t moduleNameLen = strlen(dbcws->szModule);
-
- // used for notifications
- DBCONTACTWRITESETTING dbcwNotif = *dbcws;
- if (dbcwNotif.value.type == DBVT_WCHAR) {
- if (dbcwNotif.value.pszVal != nullptr) {
- T2Utf val(dbcwNotif.value.pwszVal);
- if (!val)
- return 1;
-
- dbcwNotif.value.pszVal = NEWSTR_ALLOCA(val);
- dbcwNotif.value.type = DBVT_UTF8;
- }
- else return 1;
- }
-
- if (dbcwNotif.szModule == nullptr || dbcwNotif.szSetting == nullptr)
- return 1;
-
- DBCONTACTWRITESETTING dbcwWork = dbcwNotif;
-
- mir_ptr<BYTE> pEncoded(nullptr);
- bool bIsEncrypted = false;
- switch (dbcwWork.value.type) {
- case DBVT_BYTE: case DBVT_WORD: case DBVT_DWORD:
- break;
-
- case DBVT_ASCIIZ:
- case DBVT_UTF8:
- bIsEncrypted = m_bEncrypted || IsSettingEncrypted(dbcws->szModule, dbcws->szSetting);
- if (dbcwWork.value.pszVal == nullptr)
- return 1;
-
- dbcwWork.value.cchVal = (WORD)strlen(dbcwWork.value.pszVal);
- if (bIsEncrypted) {
- size_t len;
- BYTE *pResult = m_crypto->encodeString(dbcwWork.value.pszVal, &len);
- if (pResult != nullptr) {
- pEncoded = dbcwWork.value.pbVal = pResult;
- dbcwWork.value.cpbVal = (WORD)len;
- dbcwWork.value.type = DBVT_ENCRYPTED;
- }
- }
- break;
-
- case DBVT_BLOB:
- case DBVT_ENCRYPTED:
- if (dbcwWork.value.pbVal == nullptr)
- return 1;
- break;
-
- default:
- return 1;
- }
-
- mir_cslockfull lck(m_csDbAccess);
- char *szCachedSettingName = m_cache->GetCachedSetting(dbcwWork.szModule, dbcwWork.szSetting, moduleNameLen, settingNameLen);
-
- DBVARIANT *pCachedValue = m_cache->GetCachedValuePtr(contactID, szCachedSettingName, 1);
- if (pCachedValue != nullptr) {
- bool bIsIdentical = false;
- if (pCachedValue->type == dbcwWork.value.type) {
- switch (dbcwWork.value.type) {
- case DBVT_BYTE: bIsIdentical = pCachedValue->bVal == dbcwWork.value.bVal; break;
- case DBVT_WORD: bIsIdentical = pCachedValue->wVal == dbcwWork.value.wVal; break;
- case DBVT_DWORD: bIsIdentical = pCachedValue->dVal == dbcwWork.value.dVal; break;
- case DBVT_UTF8:
- case DBVT_ASCIIZ: bIsIdentical = strcmp(pCachedValue->pszVal, dbcwWork.value.pszVal) == 0; break;
- case DBVT_BLOB:
- case DBVT_ENCRYPTED:
- if (pCachedValue->cpbVal == dbcwWork.value.cchVal)
- bIsIdentical = memcmp(pCachedValue->pbVal, dbcwWork.value.pbVal, dbcwWork.value.cchVal);
- break;
- }
- if (bIsIdentical)
- return 0;
- }
- m_cache->SetCachedVariant(&dbcwWork.value, pCachedValue);
- }
-
- // for resident settings we simply emulate change hook and return
- if (szCachedSettingName[-1] != 0) {
- lck.unlock();
- NotifyEventHooks(g_hevSettingChanged, contactID, (LPARAM)&dbcwNotif);
- return 0;
- }
+ size_t settingNameLen = mir_strlen(dbcws.szSetting);
// write down a setting to database
DBSettingKey *keyVal = (DBSettingKey *)_alloca(sizeof(DBSettingKey) + settingNameLen);
keyVal->hContact = contactID;
- keyVal->dwModuleId = GetModuleID(dbcws->szModule);
- memcpy(&keyVal->szSettingName, dbcws->szSetting, settingNameLen + 1);
+ keyVal->dwModuleId = GetModuleID(dbcws.szModule);
+ memcpy(&keyVal->szSettingName, dbcws.szSetting, settingNameLen + 1);
MDBX_val key = { keyVal, sizeof(DBSettingKey) + settingNameLen }, data;
- switch (dbcwWork.value.type) {
+ switch (dbcws.value.type) {
case DBVT_BYTE: data.iov_len = 2; break;
case DBVT_WORD: data.iov_len = 3; break;
case DBVT_DWORD: data.iov_len = 5; break;
case DBVT_ASCIIZ:
case DBVT_UTF8:
- data.iov_len = 3 + dbcwWork.value.cchVal; break;
+ data.iov_len = 3 + dbcws.value.cchVal; break;
case DBVT_BLOB:
case DBVT_ENCRYPTED:
- data.iov_len = 3 + dbcwWork.value.cpbVal; break;
+ data.iov_len = 3 + dbcws.value.cpbVal; break;
default:
return 1;
@@ -317,24 +114,24 @@ BOOL CDbxMDBX::WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *db
data.iov_base = _alloca(data.iov_len);
BYTE *pBlob = (BYTE*)data.iov_base;
- *pBlob++ = dbcwWork.value.type;
- switch (dbcwWork.value.type) {
- case DBVT_BYTE: *pBlob = dbcwWork.value.bVal; break;
- case DBVT_WORD: *(WORD*)pBlob = dbcwWork.value.wVal; break;
- case DBVT_DWORD: *(DWORD*)pBlob = dbcwWork.value.dVal; break;
+ *pBlob++ = dbcws.value.type;
+ switch (dbcws.value.type) {
+ case DBVT_BYTE: *pBlob = dbcws.value.bVal; break;
+ case DBVT_WORD: *(WORD*)pBlob = dbcws.value.wVal; break;
+ case DBVT_DWORD: *(DWORD*)pBlob = dbcws.value.dVal; break;
case DBVT_ASCIIZ:
case DBVT_UTF8:
- *(WORD*)pBlob = dbcwWork.value.cchVal;
+ *(WORD*)pBlob = dbcws.value.cchVal;
pBlob += 2;
- memcpy(pBlob, dbcwWork.value.pszVal, dbcwWork.value.cchVal);
+ memcpy(pBlob, dbcws.value.pszVal, dbcws.value.cchVal);
break;
case DBVT_BLOB:
case DBVT_ENCRYPTED:
- *(WORD*)pBlob = dbcwWork.value.cpbVal;
+ *(WORD*)pBlob = dbcws.value.cpbVal;
pBlob += 2;
- memcpy(pBlob, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
+ memcpy(pBlob, dbcws.value.pbVal, dbcws.value.cpbVal);
}
{
@@ -343,11 +140,7 @@ BOOL CDbxMDBX::WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *db
return 1;
}
- // notify
- lck.unlock();
-
DBFlush();
- NotifyEventHooks(g_hevSettingChanged, contactID, (LPARAM)&dbcwNotif);
return 0;
}