summaryrefslogtreecommitdiff
path: root/plugins
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
parent5508a77c6103f979697dd72d5a72347a354d020d (diff)
more common code moved to MDatabaseCommon
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Db3x_mmap/src/dbcrypt.cpp2
-rw-r--r--plugins/Db3x_mmap/src/dbintf.h5
-rw-r--r--plugins/Db3x_mmap/src/dbsettings.cpp190
-rw-r--r--plugins/Db3x_mmap/src/ui.cpp2
-rw-r--r--plugins/Dbx_mdbx/src/dbintf.h10
-rw-r--r--plugins/Dbx_mdbx/src/dbsettings.cpp239
-rw-r--r--plugins/Dbx_mdbx/src/ui.cpp2
-rwxr-xr-xplugins/Dbx_sqlite/src/dbintf.h6
-rwxr-xr-xplugins/Dbx_sqlite/src/dbsettings.cpp282
-rw-r--r--plugins/Import/src/dbrw/dbintf.h2
-rw-r--r--plugins/Import/src/dbrw/dbsettings.cpp6
11 files changed, 140 insertions, 606 deletions
diff --git a/plugins/Db3x_mmap/src/dbcrypt.cpp b/plugins/Db3x_mmap/src/dbcrypt.cpp
index 9913802065..c76f3feb4e 100644
--- a/plugins/Db3x_mmap/src/dbcrypt.cpp
+++ b/plugins/Db3x_mmap/src/dbcrypt.cpp
@@ -95,7 +95,7 @@ void sttContactEnum(MCONTACT contactID, const char *szModule, CDb3Mmap *db)
for (auto &p : arSettings) {
size_t len;
- BYTE *pResult = db->m_crypto->encodeString(p->szValue, &len);
+ BYTE *pResult = db->getCrypt()->encodeString(p->szValue, &len);
if (pResult != nullptr) {
DBCONTACTWRITESETTING dbcws = { szModule, p->szVar };
dbcws.value.type = DBVT_ENCRYPTED;
diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h
index 17f634e051..e839d56e4f 100644
--- a/plugins/Db3x_mmap/src/dbintf.h
+++ b/plugins/Db3x_mmap/src/dbintf.h
@@ -61,7 +61,6 @@ DBHeader
#define WSOFS_END 0xFFFFFFFF
#define WS_ERROR 0xFFFFFFFF
-#define DBVT_ENCRYPTED 250
#define DBVT_UNENCRYPTED 251
#define MARKED_READ (DBEF_READ | DBEF_SENT)
@@ -234,7 +233,7 @@ public:
STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) override;
STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv, int isStatic) override;
- STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws) override;
+ STDMETHODIMP_(BOOL) WriteContactSettingWorker(MCONTACT contactID, DBCONTACTWRITESETTING &dbcws) override;
STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting) override;
STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param) override;
@@ -275,8 +274,6 @@ public:
PBYTE m_pDbCache;
HANDLE m_hMap;
- MICryptoEngine *m_crypto;
-
protected:
DWORD m_dwFileSize, m_dwMaxContactId;
diff --git a/plugins/Db3x_mmap/src/dbsettings.cpp b/plugins/Db3x_mmap/src/dbsettings.cpp
index c36b001d1d..e5586921dc 100644
--- a/plugins/Db3x_mmap/src/dbsettings.cpp
+++ b/plugins/Db3x_mmap/src/dbsettings.cpp
@@ -219,125 +219,18 @@ LBL_Seek:
return 1;
}
-STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws)
+STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSettingWorker(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
- int settingNameLen = (int)mir_strlen(dbcws->szSetting);
- int moduleNameLen = (int)mir_strlen(dbcws->szModule);
- if (settingNameLen > 0xFE) {
-#ifdef _DEBUG
- OutputDebugStringA("WriteContactSetting() got a > 255 setting name length. \n");
-#endif
- return 1;
- }
- if (moduleNameLen > 0xFE) {
-#ifdef _DEBUG
- OutputDebugStringA("WriteContactSetting() got a > 255 module name length. \n");
-#endif
- return 1;
- }
-
- // used for notifications
- DBCONTACTWRITESETTING dbcwNotif = *dbcws;
- if (dbcwNotif.value.type == DBVT_WCHAR) {
- if (dbcwNotif.value.pszVal != nullptr) {
- char* val = mir_utf8encodeW(dbcwNotif.value.pwszVal);
- if (val == nullptr)
- return 1;
-
- dbcwNotif.value.pszVal = (char*)alloca(mir_strlen(val) + 1);
- mir_strcpy(dbcwNotif.value.pszVal, val);
- mir_free(val);
- dbcwNotif.value.type = DBVT_UTF8;
- }
- else return 1;
- }
-
- if (dbcwNotif.szModule == nullptr || dbcwNotif.szSetting == nullptr)
- return 1;
-
- DBCONTACTWRITESETTING dbcwWork = dbcwNotif;
- char *szCachedSettingName = m_cache->GetCachedSetting(dbcwWork.szModule, dbcwWork.szSetting, moduleNameLen, settingNameLen);
- bool bIsResident = szCachedSettingName[-1] != 0;
-
- 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 = !bIsResident && (m_bEncrypted || IsSettingEncrypted(dbcws->szModule, dbcws->szSetting));
- LBL_WriteString:
- if (dbcwWork.value.pszVal == nullptr)
- return 1;
- dbcwWork.value.cchVal = (WORD)mir_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_UNENCRYPTED:
- dbcwNotif.value.type = dbcwWork.value.type = DBVT_UTF8;
- goto LBL_WriteString;
-
- case DBVT_BLOB: case DBVT_ENCRYPTED:
- if (dbcwWork.value.pbVal == nullptr)
- return 1;
- break;
- default:
- return 1;
- }
-
- mir_cslockfull lck(m_csDbAccess);
+ log1(" write database as %s", printVariant(&dbcws.value));
+ DWORD settingNameLen = (DWORD)mir_strlen(dbcws.szSetting);
DWORD ofsBlobPtr, ofsContact = GetContactOffset(contactID);
if (ofsContact == 0) {
_ASSERT(false); // contact doesn't exist?
return 2;
}
- log3("set [%08p] %s (%p)", hContact, szCachedSettingName, szCachedSettingName);
-
- // we don't cache blobs and passwords
- if (dbcwWork.value.type != DBVT_BLOB && dbcwWork.value.type != DBVT_ENCRYPTED && !bIsEncrypted) {
- 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 = mir_strcmp(pCachedValue->pszVal, dbcwWork.value.pszVal) == 0; break;
- }
- if (bIsIdentical)
- return 0;
- }
- m_cache->SetCachedVariant(&dbcwWork.value, pCachedValue);
- }
- if (bIsResident) {
- lck.unlock();
- log2(" set resident as %s (%p)", printVariant(&dbcwWork.value), pCachedValue);
- NotifyEventHooks(g_hevSettingChanged, contactID, (LPARAM)&dbcwWork);
- return 0;
- }
- }
- else m_cache->GetCachedValuePtr(contactID, szCachedSettingName, -1);
-
- log1(" write database as %s", printVariant(&dbcwWork.value));
-
- DWORD ofsModuleName = GetModuleNameOfs(dbcwWork.szModule);
+ DWORD ofsModuleName = GetModuleNameOfs(dbcws.szModule);
DBContact dbc = *(DBContact*)DBRead(ofsContact, nullptr);
if (dbc.signature != DBCONTACT_SIGNATURE)
return 1;
@@ -348,15 +241,15 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
DBContactSettings dbcs;
DWORD ofsSettingsGroup = GetSettingsGroupOfsByModuleNameOfs(&dbc, ofsModuleName);
if (ofsSettingsGroup == 0) { //module group didn't exist - make it
- switch (dbcwWork.value.type) {
+ switch (dbcws.value.type) {
case DBVT_ASCIIZ: case DBVT_UTF8:
- bytesRequired = dbcwWork.value.cchVal + 2;
+ bytesRequired = dbcws.value.cchVal + 2;
break;
case DBVT_BLOB: case DBVT_ENCRYPTED:
- bytesRequired = dbcwWork.value.cpbVal + 2;
+ bytesRequired = dbcws.value.cpbVal + 2;
break;
default:
- bytesRequired = dbcwWork.value.type;
+ bytesRequired = dbcws.value.type;
}
bytesRequired += 2 + settingNameLen;
bytesRequired += (DB_SETTINGS_RESIZE_GRANULARITY - (bytesRequired % DB_SETTINGS_RESIZE_GRANULARITY)) % DB_SETTINGS_RESIZE_GRANULARITY;
@@ -380,7 +273,7 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
pBlob = (PBYTE)DBRead(ofsBlobPtr, &bytesRemaining);
while (pBlob[0]) {
NeedBytes(settingNameLen + 1);
- if (pBlob[0] == settingNameLen && !memcmp(pBlob + 1, dbcwWork.szSetting, settingNameLen))
+ if (pBlob[0] == settingNameLen && !memcmp(pBlob + 1, dbcws.szSetting, settingNameLen))
break;
NeedBytes(1);
MoveAlong(pBlob[0] + 1);
@@ -394,9 +287,9 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
MoveAlong(1 + settingNameLen);
// if different type or variable length and length is different
NeedBytes(3);
- if (pBlob[0] != dbcwWork.value.type ||
- ((pBlob[0] == DBVT_ASCIIZ || pBlob[0] == DBVT_UTF8) && *(PWORD)(pBlob + 1) != dbcwWork.value.cchVal) ||
- ((pBlob[0] == DBVT_BLOB || pBlob[0] == DBVT_ENCRYPTED) && *(PWORD)(pBlob + 1) != dbcwWork.value.cpbVal))
+ if (pBlob[0] != dbcws.value.type ||
+ ((pBlob[0] == DBVT_ASCIIZ || pBlob[0] == DBVT_UTF8) && *(PWORD)(pBlob + 1) != dbcws.value.cchVal) ||
+ ((pBlob[0] == DBVT_BLOB || pBlob[0] == DBVT_ENCRYPTED) && *(PWORD)(pBlob + 1) != dbcws.value.cpbVal))
{
// bin it
NeedBytes(3);
@@ -418,26 +311,23 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
else {
// replace existing setting at pBlob
MoveAlong(1); // skip data type
- switch (dbcwWork.value.type) {
- case DBVT_BYTE: DBWrite(ofsBlobPtr, &dbcwWork.value.bVal, 1); break;
- case DBVT_WORD: DBWrite(ofsBlobPtr, &dbcwWork.value.wVal, 2); break;
- case DBVT_DWORD: DBWrite(ofsBlobPtr, &dbcwWork.value.dVal, 4); break;
+ switch (dbcws.value.type) {
+ case DBVT_BYTE: DBWrite(ofsBlobPtr, &dbcws.value.bVal, 1); break;
+ case DBVT_WORD: DBWrite(ofsBlobPtr, &dbcws.value.wVal, 2); break;
+ case DBVT_DWORD: DBWrite(ofsBlobPtr, &dbcws.value.dVal, 4); break;
case DBVT_BLOB:
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pbVal, dbcws.value.cpbVal);
break;
case DBVT_ENCRYPTED:
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pbVal, dbcws.value.cpbVal);
break;
case DBVT_UTF8:
case DBVT_ASCIIZ:
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pszVal, dbcwWork.value.cchVal);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pszVal, dbcws.value.cchVal);
break;
}
// quit
DBFlush(1);
- lck.unlock();
- // notify
- NotifyEventHooks(g_hevSettingChanged, contactID, (LPARAM)&dbcwNotif);
return 0;
}
}
@@ -446,15 +336,15 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
// cannot do a simple replace, add setting to end of list
// pBlob already points to end of list
// see if it fits
- switch (dbcwWork.value.type) {
+ switch (dbcws.value.type) {
case DBVT_ASCIIZ: case DBVT_UTF8:
- bytesRequired = dbcwWork.value.cchVal + 2;
+ bytesRequired = dbcws.value.cchVal + 2;
break;
case DBVT_BLOB: case DBVT_ENCRYPTED:
- bytesRequired = dbcwWork.value.cpbVal + 2;
+ bytesRequired = dbcws.value.cpbVal + 2;
break;
default:
- bytesRequired = dbcwWork.value.type;
+ bytesRequired = dbcws.value.type;
}
bytesRequired += 2 + settingNameLen;
@@ -501,31 +391,31 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
// we now have a place to put it and enough space: make it
DBWrite(ofsBlobPtr, &settingNameLen, 1);
- DBWrite(ofsBlobPtr + 1, (PVOID)dbcwWork.szSetting, settingNameLen);
+ DBWrite(ofsBlobPtr + 1, (PVOID)dbcws.szSetting, settingNameLen);
MoveAlong(1 + settingNameLen);
- DBWrite(ofsBlobPtr, &dbcwWork.value.type, 1);
+ DBWrite(ofsBlobPtr, &dbcws.value.type, 1);
MoveAlong(1);
- switch (dbcwWork.value.type) {
- case DBVT_BYTE: DBWrite(ofsBlobPtr, &dbcwWork.value.bVal, 1); MoveAlong(1); break;
- case DBVT_WORD: DBWrite(ofsBlobPtr, &dbcwWork.value.wVal, 2); MoveAlong(2); break;
- case DBVT_DWORD: DBWrite(ofsBlobPtr, &dbcwWork.value.dVal, 4); MoveAlong(4); break;
+ switch (dbcws.value.type) {
+ case DBVT_BYTE: DBWrite(ofsBlobPtr, &dbcws.value.bVal, 1); MoveAlong(1); break;
+ case DBVT_WORD: DBWrite(ofsBlobPtr, &dbcws.value.wVal, 2); MoveAlong(2); break;
+ case DBVT_DWORD: DBWrite(ofsBlobPtr, &dbcws.value.dVal, 4); MoveAlong(4); break;
case DBVT_BLOB:
- DBWrite(ofsBlobPtr, &dbcwWork.value.cpbVal, 2);
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
- MoveAlong(2 + dbcwWork.value.cpbVal);
+ DBWrite(ofsBlobPtr, &dbcws.value.cpbVal, 2);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pbVal, dbcws.value.cpbVal);
+ MoveAlong(2 + dbcws.value.cpbVal);
break;
case DBVT_ENCRYPTED:
- DBWrite(ofsBlobPtr, &dbcwWork.value.cpbVal, 2);
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
- MoveAlong(2 + dbcwWork.value.cpbVal);
+ DBWrite(ofsBlobPtr, &dbcws.value.cpbVal, 2);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pbVal, dbcws.value.cpbVal);
+ MoveAlong(2 + dbcws.value.cpbVal);
break;
case DBVT_UTF8: case DBVT_ASCIIZ:
- DBWrite(ofsBlobPtr, &dbcwWork.value.cchVal, 2);
- DBWrite(ofsBlobPtr + 2, dbcwWork.value.pszVal, dbcwWork.value.cchVal);
- MoveAlong(2 + dbcwWork.value.cchVal);
+ DBWrite(ofsBlobPtr, &dbcws.value.cchVal, 2);
+ DBWrite(ofsBlobPtr + 2, dbcws.value.pszVal, dbcws.value.cchVal);
+ MoveAlong(2 + dbcws.value.cchVal);
break;
}
@@ -534,10 +424,6 @@ STDMETHODIMP_(BOOL) CDb3Mmap::WriteContactSetting(MCONTACT contactID, DBCONTACTW
// quit
DBFlush(1);
- lck.unlock();
-
- // notify
- NotifyEventHooks(g_hevSettingChanged, contactID, (LPARAM)&dbcwNotif);
return 0;
}
diff --git a/plugins/Db3x_mmap/src/ui.cpp b/plugins/Db3x_mmap/src/ui.cpp
index 9b084edb4a..19e8a1c4f2 100644
--- a/plugins/Db3x_mmap/src/ui.cpp
+++ b/plugins/Db3x_mmap/src/ui.cpp
@@ -159,7 +159,7 @@ static bool CheckOldPassword(HWND hwndDlg, CDb3Mmap *db)
if (db->usesPassword()) {
wchar_t buf[100];
GetDlgItemText(hwndDlg, IDC_OLDPASS, buf, _countof(buf));
- if (!db->m_crypto->checkPassword(T2Utf(buf))) {
+ if (!db->getCrypt()->checkPassword(T2Utf(buf))) {
SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Wrong old password entered!"));
return false;
}
diff --git a/plugins/Dbx_mdbx/src/dbintf.h b/plugins/Dbx_mdbx/src/dbintf.h
index cf3bda9553..0705359342 100644
--- a/plugins/Dbx_mdbx/src/dbintf.h
+++ b/plugins/Dbx_mdbx/src/dbintf.h
@@ -32,8 +32,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define DBMODE_SHARED 0x0001
#define DBMODE_READONLY 0x0002
-#define DBVT_ENCRYPTED 250
-
#define MARKED_READ (DBEF_READ | DBEF_SENT)
#include <pshpack1.h>
@@ -173,7 +171,7 @@ class CDbxMDBX : public MDatabaseCommon, public MIDatabaseChecker, public MZeroe
// database stuff
ptrW m_pwszProfileName;
- bool m_safetyMode = true, m_bReadOnly, m_bEncrypted, m_bUsesPassword;
+ bool m_safetyMode = true, m_bReadOnly, m_bUsesPassword;
MDBX_env *m_env;
MDBX_txn *m_pWriteTran;
@@ -278,8 +276,7 @@ public:
STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) override;
- STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT contactID, const char *szModule, const char *szSetting, DBVARIANT *dbv, int isStatic) override;
- STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws) override;
+ STDMETHODIMP_(BOOL) WriteContactSettingWorker(MCONTACT contactID, DBCONTACTWRITESETTING &dbcws) override;
STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT contactID, const char *szModule, const char *szSetting) override;
STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param) override;
@@ -307,7 +304,4 @@ protected:
STDMETHODIMP_(VOID) Destroy();
DBCHeckCallback *cb;
-
-public:
- MICryptoEngine *m_crypto;
};
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;
}
diff --git a/plugins/Dbx_mdbx/src/ui.cpp b/plugins/Dbx_mdbx/src/ui.cpp
index c788d5b0ec..971f31c8db 100644
--- a/plugins/Dbx_mdbx/src/ui.cpp
+++ b/plugins/Dbx_mdbx/src/ui.cpp
@@ -48,7 +48,7 @@ static bool CheckOldPassword(HWND hwndDlg, CDbxMDBX *db)
wchar_t buf[100];
GetDlgItemText(hwndDlg, IDC_OLDPASS, buf, _countof(buf));
pass_ptrA oldPass(mir_utf8encodeW(buf));
- if (!db->m_crypto->checkPassword(oldPass))
+ if (!db->getCrypt()->checkPassword(oldPass))
{
SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Wrong old password entered!"));
return false;
diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h
index 5b02d707b1..9fb06f84d8 100755
--- a/plugins/Dbx_sqlite/src/dbintf.h
+++ b/plugins/Dbx_sqlite/src/dbintf.h
@@ -34,9 +34,8 @@ private:
sqlite3_stmt* cursor;
};
-struct CDbxSQLite : public MDatabaseCommon, public MZeroedObject
+class CDbxSQLite : public MDatabaseCommon, public MZeroedObject
{
-private:
sqlite3 *m_db;
sqlite3_stmt *evt_cur_fwd = nullptr, *evt_cur_backwd = nullptr;
@@ -92,8 +91,7 @@ public:
STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) override;
- STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv, int isStatic) override;
- STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws) override;
+ STDMETHODIMP_(BOOL) WriteContactSettingWorker(MCONTACT contactID, DBCONTACTWRITESETTING &dbcws) override;
STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting) override;
STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param) override;
diff --git a/plugins/Dbx_sqlite/src/dbsettings.cpp b/plugins/Dbx_sqlite/src/dbsettings.cpp
index b4531c46e0..aab8f5f30c 100755
--- a/plugins/Dbx_sqlite/src/dbsettings.cpp
+++ b/plugins/Dbx_sqlite/src/dbsettings.cpp
@@ -24,6 +24,61 @@ void CDbxSQLite::InitSettings()
for (auto &it : settings_stmts)
sqlite3_prepare_v3(m_db, it.szQuery, -1, SQLITE_PREPARE_PERSISTENT, &it.pQuery, nullptr);
+ sqlite3_stmt *stmt = nullptr;
+ sqlite3_prepare_v2(m_db, "SELECT type, value, contact_id, module, setting FROM settings;", -1, &stmt, nullptr);
+ while (sqlite3_step(stmt) == SQLITE_ROW) {
+ MCONTACT hContact = sqlite3_column_int64(stmt, 2);
+ auto *szModule = (const char *)sqlite3_column_text(stmt, 3);
+ auto *szSetting = (const char *)sqlite3_column_text(stmt, 4);
+
+ size_t settingNameLen = strlen(szSetting);
+ size_t moduleNameLen = strlen(szModule);
+
+ char *szCachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, moduleNameLen, settingNameLen);
+
+ DBVARIANT *dbv = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 1);
+ if (dbv == nullptr) // garbage! a setting for removed/non-existent contact
+ continue;
+
+ dbv->type = (int)sqlite3_column_int(stmt, 0);
+ switch (dbv->type) {
+ case DBVT_BYTE:
+ dbv->bVal = sqlite3_column_int(stmt, 1);
+ break;
+
+ case DBVT_WORD:
+ dbv->wVal = sqlite3_column_int(stmt, 1);
+ break;
+
+ case DBVT_DWORD:
+ dbv->dVal = sqlite3_column_int64(stmt, 1);
+ break;
+
+ case DBVT_ASCIIZ:
+ case DBVT_UTF8:
+ dbv->cchVal = sqlite3_column_bytes(stmt, 1);
+ {
+ const char *value = (const char *)sqlite3_column_text(stmt, 1);
+ dbv->pszVal = (char *)mir_alloc(dbv->cchVal + 1);
+ memcpy(dbv->pszVal, value, dbv->cchVal);
+ dbv->pszVal[dbv->cchVal] = 0;
+ }
+ break;
+
+ case DBVT_ENCRYPTED:
+ case DBVT_BLOB:
+ dbv->cpbVal = sqlite3_column_bytes(stmt, 1);
+ {
+ const char *data = (const char *)sqlite3_column_blob(stmt, 1);
+ dbv->pbVal = (BYTE *)mir_alloc(dbv->cpbVal + 1);
+ memcpy(dbv->pbVal, data, dbv->cpbVal);
+ dbv->pbVal[dbv->cpbVal] = 0;
+ }
+ break;
+ }
+ }
+ sqlite3_finalize(stmt);
+
FillContactSettings();
}
@@ -33,6 +88,8 @@ void CDbxSQLite::UninitSettings()
sqlite3_finalize(it.pQuery);
}
+/////////////////////////////////////////////////////////////////////////////////////////
+
BOOL CDbxSQLite::EnumModuleNames(DBMODULEENUMPROC pFunc, void *param)
{
LIST<char> modules(100);
@@ -55,223 +112,32 @@ BOOL CDbxSQLite::EnumModuleNames(DBMODULEENUMPROC pFunc, void *param)
return result;
}
-static bool ValidLookupName(LPCSTR szModule, LPCSTR szSetting)
-{
- if (!strcmp(szModule, META_PROTO))
- return strcmp(szSetting, "IsSubcontact") && strcmp(szSetting, "ParentMetaID");
-
- if (!strcmp(szModule, "Ignore"))
- return false;
-
- return true;
-}
+/////////////////////////////////////////////////////////////////////////////////////////
-BOOL CDbxSQLite::GetContactSettingWorker(MCONTACT hContact, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv, int isStatic)
+BOOL CDbxSQLite::WriteContactSettingWorker(MCONTACT hContact, DBCONTACTWRITESETTING &dbcws)
{
- if (szSetting == nullptr || szModule == nullptr)
- return 1;
-
- DBCachedContact *cc = nullptr;
- if (hContact) {
- cc = m_cache->GetCachedContact(hContact);
- if (cc == nullptr)
- return 1;
- }
-
- mir_cslock lock(m_csDbAccess);
-
-LBL_Seek:
- char *cachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, mir_strlen(szModule), mir_strlen(szSetting));
- DBVARIANT *pCachedValue = m_cache->GetCachedValuePtr(hContact, cachedSettingName, 0);
- if (pCachedValue != nullptr) {
- if (pCachedValue->type == DBVT_UTF8) {
- int cbOrigLen = dbv->cchVal;
- char *cbOrigPtr = dbv->pszVal;
- memcpy(dbv, pCachedValue, sizeof(DBVARIANT));
- if (isStatic) {
- int cbLen = 0;
- if (pCachedValue->pszVal != nullptr)
- cbLen = (int)mir_strlen(pCachedValue->pszVal);
-
- cbOrigLen--;
- dbv->pszVal = cbOrigPtr;
- if (cbLen < cbOrigLen)
- cbOrigLen = cbLen;
- memcpy(dbv->pszVal, pCachedValue->pszVal, cbOrigLen);
- dbv->pszVal[cbOrigLen] = 0;
- dbv->cchVal = cbLen;
- }
- else {
- dbv->pszVal = (char *)mir_alloc(mir_strlen(pCachedValue->pszVal) + 1);
- mir_strcpy(dbv->pszVal, pCachedValue->pszVal);
- }
- }
- else memcpy(dbv, pCachedValue, sizeof(DBVARIANT));
-
- return (pCachedValue->type == DBVT_DELETED) ? 1 : 0;
- }
-
- // never look db for the resident variable
- if (cachedSettingName[-1] != 0)
- return 1;
-
- sqlite3_stmt *stmt = settings_stmts[SQL_SET_STMT_GET].pQuery;
- sqlite3_bind_int64(stmt, 1, hContact);
- sqlite3_bind_text(stmt, 2, szModule, (int)mir_strlen(szModule), nullptr);
- sqlite3_bind_text(stmt, 3, szSetting, (int)mir_strlen(szSetting), nullptr);
- int rc = sqlite3_step(stmt);
- assert(rc == SQLITE_ROW || rc == SQLITE_DONE);
- if (rc != SQLITE_ROW) {
- sqlite3_reset(stmt);
- if (rc == SQLITE_DONE && cc && cc->IsMeta() && ValidLookupName(szModule, szSetting)) {
- if (hContact = db_mc_getDefault(hContact)) {
- if (szModule = Proto_GetBaseAccountName(hContact))
- goto LBL_Seek;
- }
- }
- return 1;
- }
- dbv->type = (int)sqlite3_column_int(stmt, 0);
- switch (dbv->type) {
- case DBVT_DELETED:
- dbv->type = DBVT_DELETED;
- sqlite3_reset(stmt);
- return 2;
- case DBVT_BYTE:
- dbv->bVal = sqlite3_column_int(stmt, 1);
- break;
- case DBVT_WORD:
- dbv->wVal = sqlite3_column_int(stmt, 1);
- break;
- case DBVT_DWORD:
- dbv->dVal = sqlite3_column_int64(stmt, 1);
- break;
- case DBVT_UTF8:
- dbv->cchVal = sqlite3_column_bytes(stmt, 1);
- {
- const char *value = (const char *)sqlite3_column_text(stmt, 1);
- if (!isStatic)
- dbv->pszVal = (char *)mir_alloc(dbv->cchVal + 1);
- memcpy(dbv->pszVal, value, dbv->cchVal);
- dbv->pszVal[dbv->cchVal] = 0;
- }
- break;
- case DBVT_BLOB:
- dbv->cpbVal = sqlite3_column_bytes(stmt, 1);
- {
- const char *data = (const char *)sqlite3_column_blob(stmt, 1);
- if (!isStatic)
- dbv->pbVal = (BYTE *)mir_alloc(dbv->cpbVal + 1);
- memcpy(dbv->pbVal, data, dbv->cpbVal);
- }
- break;
- }
- sqlite3_reset(stmt);
-
- // add to cache
- if (dbv->type != DBVT_BLOB) {
- pCachedValue = m_cache->GetCachedValuePtr(hContact, cachedSettingName, 1);
- if (pCachedValue != nullptr)
- m_cache->SetCachedVariant(dbv, pCachedValue);
- }
-
- return 0;
-}
-
-BOOL CDbxSQLite::WriteContactSetting(MCONTACT hContact, DBCONTACTWRITESETTING *dbcws)
-{
- if (dbcws == nullptr || dbcws->szSetting == nullptr || dbcws->szModule == nullptr)
- return 1;
-
- if (hContact) {
- DBCachedContact *cc = m_cache->GetCachedContact(hContact);
- if (cc == nullptr)
- return 1;
- }
-
- DBCONTACTWRITESETTING dbcwNotif = *dbcws;
- // we work only with utf-8 inside
- switch (dbcwNotif.value.type) {
- case DBVT_UTF8:
- dbcwNotif.value.pszVal = mir_strdup(dbcws->value.pszVal);
- break;
- case DBVT_ASCIIZ:
- {
- ptrA value(mir_utf8encode(dbcws->value.pszVal));
- dbcwNotif.value.pszVal = NEWSTR_ALLOCA(value);
- dbcwNotif.value.type = DBVT_UTF8;
- break;
- }
- case DBVT_WCHAR:
- {
- T2Utf value(dbcwNotif.value.pwszVal);
- dbcwNotif.value.pszVal = NEWSTR_ALLOCA(value);
- dbcwNotif.value.type = DBVT_UTF8;
- break;
- }
- }
- DBCONTACTWRITESETTING dbcwWork = dbcwNotif;
- if (dbcwWork.value.type == DBVT_UTF8)
- dbcwWork.value.cchVal = (WORD)strlen(dbcwWork.value.pszVal);
-
- mir_cslockfull lock(m_csDbAccess);
-
- char *cachedSettingName = m_cache->GetCachedSetting(dbcwWork.szModule, dbcwWork.szSetting, mir_strlen(dbcwWork.szModule), mir_strlen(dbcwWork.szSetting));
- bool isResident = cachedSettingName[-1] != 0;
-
- // we don't cache blobs
- if (dbcwWork.value.type != DBVT_BLOB) {
- DBVARIANT *cachedValue = m_cache->GetCachedValuePtr(hContact, cachedSettingName, 1);
- if (cachedValue != nullptr) {
- bool isIdentical = false;
- if (cachedValue->type == dbcwWork.value.type) {
- switch (dbcwWork.value.type) {
- case DBVT_BYTE:
- isIdentical = cachedValue->bVal == dbcwWork.value.bVal;
- break;
- case DBVT_WORD:
- isIdentical = cachedValue->wVal == dbcwWork.value.wVal;
- break;
- case DBVT_DWORD:
- isIdentical = cachedValue->dVal == dbcwWork.value.dVal;
- break;
- case DBVT_UTF8:
- isIdentical = mir_strcmp(cachedValue->pszVal, dbcwWork.value.pszVal) == 0;
- break;
- }
- if (isIdentical)
- return 0;
- }
- m_cache->SetCachedVariant(&dbcwWork.value, cachedValue);
- }
- if (isResident) {
- lock.unlock();
- NotifyEventHooks(g_hevSettingChanged, hContact, (LPARAM)&dbcwWork);
- return 0;
- }
- }
- else m_cache->GetCachedValuePtr(hContact, cachedSettingName, -1);
-
sqlite3_stmt *stmt = settings_stmts[SQL_SET_STMT_REPLACE].pQuery;
sqlite3_bind_int64(stmt, 1, hContact);
- sqlite3_bind_text(stmt, 2, dbcwWork.szModule, (int)mir_strlen(dbcwWork.szModule), nullptr);
- sqlite3_bind_text(stmt, 3, dbcwWork.szSetting, (int)mir_strlen(dbcwWork.szSetting), nullptr);
- sqlite3_bind_int(stmt, 4, dbcwWork.value.type);
- switch (dbcwWork.value.type) {
+ sqlite3_bind_text(stmt, 2, dbcws.szModule, (int)mir_strlen(dbcws.szModule), nullptr);
+ sqlite3_bind_text(stmt, 3, dbcws.szSetting, (int)mir_strlen(dbcws.szSetting), nullptr);
+ sqlite3_bind_int(stmt, 4, dbcws.value.type);
+ switch (dbcws.value.type) {
case DBVT_BYTE:
- sqlite3_bind_int(stmt, 5, dbcwWork.value.bVal);
+ sqlite3_bind_int(stmt, 5, dbcws.value.bVal);
break;
case DBVT_WORD:
- sqlite3_bind_int(stmt, 5, dbcwWork.value.wVal);
+ sqlite3_bind_int(stmt, 5, dbcws.value.wVal);
break;
case DBVT_DWORD:
- sqlite3_bind_int64(stmt, 5, dbcwWork.value.dVal);
+ sqlite3_bind_int64(stmt, 5, dbcws.value.dVal);
break;
+ case DBVT_ASCIIZ:
case DBVT_UTF8:
- sqlite3_bind_text(stmt, 5, dbcwWork.value.pszVal, dbcwWork.value.cchVal, nullptr);
+ sqlite3_bind_text(stmt, 5, dbcws.value.pszVal, dbcws.value.cchVal, nullptr);
break;
+ case DBVT_ENCRYPTED:
case DBVT_BLOB:
- sqlite3_bind_blob(stmt, 5, dbcwWork.value.pbVal, dbcwWork.value.cpbVal, nullptr);
+ sqlite3_bind_blob(stmt, 5, dbcws.value.pbVal, dbcws.value.cpbVal, nullptr);
break;
}
@@ -281,13 +147,11 @@ BOOL CDbxSQLite::WriteContactSetting(MCONTACT hContact, DBCONTACTWRITESETTING *d
if (rc != SQLITE_DONE)
return 1;
- lock.unlock();
-
- NotifyEventHooks(g_hevSettingChanged, hContact, (LPARAM)&dbcwNotif);
-
return 0;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+
BOOL CDbxSQLite::DeleteContactSetting(MCONTACT hContact, LPCSTR szModule, LPCSTR szSetting)
{
if (szSetting == nullptr || szModule == nullptr)
@@ -329,6 +193,8 @@ BOOL CDbxSQLite::DeleteContactSetting(MCONTACT hContact, LPCSTR szModule, LPCSTR
return 0;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+
BOOL CDbxSQLite::EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param)
{
if (szModule == nullptr)
diff --git a/plugins/Import/src/dbrw/dbintf.h b/plugins/Import/src/dbrw/dbintf.h
index e6a171f87d..4749e8146d 100644
--- a/plugins/Import/src/dbrw/dbintf.h
+++ b/plugins/Import/src/dbrw/dbintf.h
@@ -148,7 +148,7 @@ public:
STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) override;
STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv, int isStatic) override;
- STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws) override;
+ STDMETHODIMP_(BOOL) WriteContactSettingWorker(MCONTACT contactID, DBCONTACTWRITESETTING &dbcws) override;
STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting) override;
STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param) override;
diff --git a/plugins/Import/src/dbrw/dbsettings.cpp b/plugins/Import/src/dbrw/dbsettings.cpp
index 1b233e601f..b09f1675b6 100644
--- a/plugins/Import/src/dbrw/dbsettings.cpp
+++ b/plugins/Import/src/dbrw/dbsettings.cpp
@@ -148,14 +148,14 @@ STDMETHODIMP_(BOOL) CDbxSQLite::GetContactSettingWorker(MCONTACT contactID, LPCS
return 0;
}
-STDMETHODIMP_(BOOL) CDbxSQLite::WriteContactSetting(MCONTACT, DBCONTACTWRITESETTING*)
+STDMETHODIMP_(BOOL) CDbxSQLite::WriteContactSettingWorker(MCONTACT, DBCONTACTWRITESETTING&)
{
- return FALSE;
+ return 1;
}
STDMETHODIMP_(BOOL) CDbxSQLite::DeleteContactSetting(MCONTACT, LPCSTR, LPCSTR)
{
- return FALSE;
+ return 1;
}
STDMETHODIMP_(BOOL) CDbxSQLite::EnumContactSettings(MCONTACT hContact, DBSETTINGENUMPROC pfnEnumProc, const char *szModule, void *param)