summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_db_int.h29
-rw-r--r--libs/win32/mir_app.libbin185102 -> 186012 bytes
-rw-r--r--libs/win64/mir_app.libbin180340 -> 181270 bytes
-rw-r--r--plugins/Dbx_mdbx/src/dbcontacts.cpp84
-rw-r--r--plugins/Dbx_mdbx/src/dbintf.h4
-rw-r--r--src/mir_app/src/MDatabaseCommon.cpp5
-rw-r--r--src/mir_app/src/MDatabaseReadonly.cpp5
-rw-r--r--src/mir_app/src/meta_menu.cpp10
-rw-r--r--src/mir_app/src/meta_services.cpp2
-rw-r--r--src/mir_app/src/metacontacts.h2
-rw-r--r--src/mir_app/src/mir_app.def2
-rw-r--r--src/mir_app/src/mir_app64.def2
12 files changed, 102 insertions, 43 deletions
diff --git a/include/m_db_int.h b/include/m_db_int.h
index 867999d3ef..2dc87d0a3f 100644
--- a/include/m_db_int.h
+++ b/include/m_db_int.h
@@ -126,6 +126,7 @@ interface MIR_APP_EXPORT MIDatabase
STDMETHOD_(BOOL, MetaSetDefault)(DBCachedContact*) PURE;
STDMETHOD_(BOOL, MetaMergeHistory)(DBCachedContact *ccMeta, DBCachedContact *ccSub) PURE;
STDMETHOD_(BOOL, MetaSplitHistory)(DBCachedContact *ccMeta, DBCachedContact *ccSub) PURE;
+ STDMETHOD_(BOOL, MetaRemoveSubHistory)(DBCachedContact *ccSub) PURE;
STDMETHOD_(BOOL, Compact)(void) PURE;
STDMETHOD_(BOOL, Backup)(LPCWSTR) PURE;
@@ -163,25 +164,26 @@ public:
__forceinline MIDatabaseCache* getCache() const { return m_cache; }
- STDMETHODIMP_(BOOL) DeleteModule(MCONTACT contactID, LPCSTR szModule);
+ STDMETHODIMP_(BOOL) DeleteModule(MCONTACT contactID, LPCSTR szModule) override;
- STDMETHODIMP_(MCONTACT) FindFirstContact(const char *szProto = nullptr);
- STDMETHODIMP_(MCONTACT) FindNextContact(MCONTACT contactID, const char *szProto = nullptr);
+ STDMETHODIMP_(MCONTACT) FindFirstContact(const char *szProto = nullptr) override;
+ STDMETHODIMP_(MCONTACT) FindNextContact(MCONTACT contactID, const char *szProto = nullptr) override;
- STDMETHODIMP_(BOOL) MetaDetouchSub(DBCachedContact *cc, int nSub);
- STDMETHODIMP_(BOOL) MetaSetDefault(DBCachedContact *cc);
+ STDMETHODIMP_(BOOL) MetaDetouchSub(DBCachedContact *cc, int nSub) override;
+ STDMETHODIMP_(BOOL) MetaSetDefault(DBCachedContact *cc) override;
+ STDMETHODIMP_(BOOL) MetaRemoveSubHistory(DBCachedContact *ccSub) override;
- STDMETHODIMP_(BOOL) IsSettingEncrypted(LPCSTR szModule, LPCSTR szSetting);
- STDMETHODIMP_(BOOL) GetContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv);
- STDMETHODIMP_(BOOL) GetContactSettingStr(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv);
- STDMETHODIMP_(BOOL) GetContactSettingStatic(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv);
+ STDMETHODIMP_(BOOL) IsSettingEncrypted(LPCSTR szModule, LPCSTR szSetting) override;
+ STDMETHODIMP_(BOOL) GetContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv) override;
+ STDMETHODIMP_(BOOL) GetContactSettingStr(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv) override;
+ STDMETHODIMP_(BOOL) GetContactSettingStatic(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv) override;
STDMETHODIMP_(BOOL) FreeVariant(DBVARIANT *dbv);
- STDMETHODIMP_(BOOL) EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam);
- STDMETHODIMP_(BOOL) SetSettingResident(BOOL bIsResident, const char *pszSettingName);
+ STDMETHODIMP_(BOOL) EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam) override;
+ STDMETHODIMP_(BOOL) SetSettingResident(BOOL bIsResident, const char *pszSettingName) override;
- STDMETHODIMP_(BOOL) Compact(void);
- STDMETHODIMP_(BOOL) Backup(LPCWSTR);
+ STDMETHODIMP_(BOOL) Compact(void) override;
+ STDMETHODIMP_(BOOL) Backup(LPCWSTR) override;
};
#pragma warning(pop)
@@ -224,6 +226,7 @@ public:
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(BOOL) MetaMergeHistory(DBCachedContact*, DBCachedContact*) override;
STDMETHODIMP_(BOOL) MetaSplitHistory(DBCachedContact*, DBCachedContact*) override;
+ STDMETHODIMP_(BOOL) MetaRemoveSubHistory(DBCachedContact*) override;
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(MEVENT) GetEventById(LPCSTR szModule, LPCSTR szId) override;
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib
index a107d733cc..5e12104d7c 100644
--- a/libs/win32/mir_app.lib
+++ b/libs/win32/mir_app.lib
Binary files differ
diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib
index d256af4b1d..0488a494e4 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
diff --git a/plugins/Dbx_mdbx/src/dbcontacts.cpp b/plugins/Dbx_mdbx/src/dbcontacts.cpp
index 6c6fd8a8ba..eb0c6d4258 100644
--- a/plugins/Dbx_mdbx/src/dbcontacts.cpp
+++ b/plugins/Dbx_mdbx/src/dbcontacts.cpp
@@ -42,6 +42,8 @@ LONG CDbxMDBX::DeleteContact(MCONTACT contactID)
return 1;
NotifyEventHooks(g_hevContactDeleted, contactID, 0);
+
+ // remove events owned by contact
{
OBJLIST<EventItem> events(50);
GatherContactHistory(contactID, events);
@@ -50,6 +52,8 @@ LONG CDbxMDBX::DeleteContact(MCONTACT contactID)
events.remove(0);
}
}
+
+ // remove all contact's settings
{
MDBX_val key, data;
DBSettingKey keyS = { contactID, 0, 0 };
@@ -66,9 +70,11 @@ LONG CDbxMDBX::DeleteContact(MCONTACT contactID)
mdbx_cursor_del(cursor, 0);
}
- trnlck.commit();
+ if (trnlck.commit() != MDBX_SUCCESS)
+ return 1;
}
+ // finally remove the contact itself
MDBX_val key = { &contactID, sizeof(MCONTACT) };
{
txn_ptr trnlck(StartTran());
@@ -114,7 +120,7 @@ STDMETHODIMP_(BOOL) CDbxMDBX::IsDbContact(MCONTACT contactID)
/////////////////////////////////////////////////////////////////////////////////////////
-void CDbxMDBX::GatherContactHistory(MCONTACT hContact, LIST<EventItem> &list)
+void CDbxMDBX::GatherContactHistory(MCONTACT hContact, OBJLIST<EventItem> &list)
{
DBEventSortingKey keyVal = { hContact, 0, 0 };
MDBX_val key = { &keyVal, sizeof(keyVal) }, data;
@@ -133,23 +139,21 @@ void CDbxMDBX::GatherContactHistory(MCONTACT hContact, LIST<EventItem> &list)
BOOL CDbxMDBX::MetaMergeHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
{
- LIST<EventItem> list(1000);
+ OBJLIST<EventItem> list(1000);
GatherContactHistory(ccSub->contactID, list);
for (auto &EI : list) {
- {
- txn_ptr trnlck(StartTran());
+ txn_ptr trnlck(StartTran());
- DBEventSortingKey insVal = { ccMeta->contactID, EI->eventId, EI->ts };
- MDBX_val key = { &insVal, sizeof(insVal) }, data = { (void*)"", 1 };
- if (mdbx_put(trnlck, m_dbEventsSort, &key, &data, 0) != MDBX_SUCCESS)
- return 1;
+ DBEventSortingKey insVal = { ccMeta->contactID, EI->eventId, EI->ts };
+ MDBX_val key = { &insVal, sizeof(insVal) }, data = { (void*)"", 1 };
+ if (mdbx_put(trnlck, m_dbEventsSort, &key, &data, 0) != MDBX_SUCCESS)
+ return 1;
+
+ if (trnlck.commit() != MDBX_SUCCESS)
+ return 1;
- if (trnlck.commit() != MDBX_SUCCESS)
- return 1;
- }
ccMeta->dbc.dwEventCount++;
- delete EI;
}
MDBX_val keyc = { &ccMeta->contactID, sizeof(MCONTACT) }, datac = { &ccMeta->dbc, sizeof(ccMeta->dbc) };
@@ -167,21 +171,19 @@ BOOL CDbxMDBX::MetaMergeHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
BOOL CDbxMDBX::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
{
- LIST<EventItem> list(1000);
+ OBJLIST<EventItem> list(1000);
GatherContactHistory(ccSub->contactID, list);
for (auto &EI : list) {
- {
- txn_ptr trnlck(StartTran());
- DBEventSortingKey insVal = { ccMeta->contactID, EI->eventId, EI->ts };
- MDBX_val key = { &insVal, sizeof(insVal) };
- if (mdbx_del(trnlck, m_dbEventsSort, &key, nullptr) != MDBX_SUCCESS)
- return 1;
- if (trnlck.commit() != MDBX_SUCCESS)
- return 1;
- }
+ txn_ptr trnlck(StartTran());
+ DBEventSortingKey insVal = { ccMeta->contactID, EI->eventId, EI->ts };
+ MDBX_val key = { &insVal, sizeof(insVal) };
+ if (mdbx_del(trnlck, m_dbEventsSort, &key, nullptr) != MDBX_SUCCESS)
+ return 1;
+ if (trnlck.commit() != MDBX_SUCCESS)
+ return 1;
+
ccMeta->dbc.dwEventCount--;
- delete EI;
}
txn_ptr trnlck(StartTran());
@@ -197,6 +199,40 @@ BOOL CDbxMDBX::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
/////////////////////////////////////////////////////////////////////////////////////////
+BOOL CDbxMDBX::MetaRemoveSubHistory(DBCachedContact *ccSub)
+{
+ OBJLIST<EventItem> list(1000);
+ GatherContactHistory(ccSub->contactID, list);
+
+ for (auto &EI : list) {
+ txn_ptr trnlck(StartTran());
+ {
+ MDBX_val key = { &EI->eventId, sizeof(MEVENT) }, data;
+ if (mdbx_get(trnlck, m_dbEvents, &key, &data) == MDBX_SUCCESS) {
+ DBEvent *pEvent = (DBEvent*)data.iov_base;
+ pEvent->contactID = ccSub->parentID;
+ if (mdbx_put(trnlck, m_dbEvents, &key, &data, 0) != MDBX_SUCCESS)
+ return 1;
+ }
+ }
+
+ DBEventSortingKey sortKey = { ccSub->contactID, EI->eventId, EI->ts };
+ {
+ MDBX_val key = { &sortKey, sizeof(sortKey) };
+ if (mdbx_del(trnlck, m_dbEventsSort, &key, nullptr) != MDBX_SUCCESS)
+ return 1;
+ }
+
+ if (trnlck.commit() != MDBX_SUCCESS)
+ return 1;
+ }
+
+ DBFlush();
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
void DBCachedContact::Advance(MEVENT id, DBEvent &dbe)
{
dbc.dwEventCount++;
diff --git a/plugins/Dbx_mdbx/src/dbintf.h b/plugins/Dbx_mdbx/src/dbintf.h
index 2098412a68..f35da2a3bc 100644
--- a/plugins/Dbx_mdbx/src/dbintf.h
+++ b/plugins/Dbx_mdbx/src/dbintf.h
@@ -187,7 +187,7 @@ class CDbxMDBX : public MDatabaseCommon, public MZeroedObject
MCONTACT m_maxContactId;
- void GatherContactHistory(MCONTACT hContact, LIST<EventItem> &items);
+ void GatherContactHistory(MCONTACT hContact, OBJLIST<EventItem> &items);
////////////////////////////////////////////////////////////////////////////
// events
@@ -271,6 +271,8 @@ public:
STDMETHODIMP_(BOOL) MetaMergeHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub) override;
STDMETHODIMP_(BOOL) MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub) override;
+ STDMETHODIMP_(BOOL) MetaRemoveSubHistory(DBCachedContact *ccSub) override;
+
STDMETHODIMP_(BOOL) Compact();
STDMETHODIMP_(BOOL) Backup(const wchar_t*);
diff --git a/src/mir_app/src/MDatabaseCommon.cpp b/src/mir_app/src/MDatabaseCommon.cpp
index bbe5f27877..123c1e27b4 100644
--- a/src/mir_app/src/MDatabaseCommon.cpp
+++ b/src/mir_app/src/MDatabaseCommon.cpp
@@ -195,6 +195,11 @@ BOOL MDatabaseCommon::MetaSetDefault(DBCachedContact *cc)
return WriteContactSetting(cc->contactID, &cws);
}
+BOOL MDatabaseCommon::MetaRemoveSubHistory(DBCachedContact*)
+{
+ return 1;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// Getting settings
diff --git a/src/mir_app/src/MDatabaseReadonly.cpp b/src/mir_app/src/MDatabaseReadonly.cpp
index 96226aa709..9d487d18f2 100644
--- a/src/mir_app/src/MDatabaseReadonly.cpp
+++ b/src/mir_app/src/MDatabaseReadonly.cpp
@@ -135,6 +135,11 @@ BOOL MDatabaseReadonly::MetaSplitHistory(DBCachedContact*, DBCachedContact*)
return 1;
}
+BOOL MDatabaseReadonly::MetaRemoveSubHistory(DBCachedContact*)
+{
+ return 1;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
MEVENT MDatabaseReadonly::GetEventById(LPCSTR, LPCSTR)
diff --git a/src/mir_app/src/meta_menu.cpp b/src/mir_app/src/meta_menu.cpp
index 46fdc97adc..a98397b627 100644
--- a/src/mir_app/src/meta_menu.cpp
+++ b/src/mir_app/src/meta_menu.cpp
@@ -87,7 +87,7 @@ INT_PTR Meta_Convert(WPARAM wParam, LPARAM)
/////////////////////////////////////////////////////////////////////////////////////////
// Removes a sub from a metacontact
-void Meta_RemoveContactNumber(DBCachedContact *ccMeta, int number, bool bUpdateInfo)
+void Meta_RemoveContactNumber(DBCachedContact *ccMeta, int number, bool bUpdateInfo, bool bDeleteSub)
{
if (ccMeta == nullptr)
return;
@@ -134,10 +134,14 @@ void Meta_RemoveContactNumber(DBCachedContact *ccMeta, int number, bool bUpdateI
db_unset(ccMeta->contactID, META_PROTO, buffer);
if (ccSub != nullptr) {
- ccSub->parentID = 0;
currDb->MetaDetouchSub(ccMeta, ccMeta->nSubs - 1);
- currDb->MetaSplitHistory(ccMeta, ccSub);
+ if (bDeleteSub)
+ currDb->MetaRemoveSubHistory(ccSub);
+ else {
+ currDb->MetaSplitHistory(ccMeta, ccSub);
+ ccSub->parentID = 0;
+ }
}
// if the default contact was equal to or greater than 'number', decrement it (and deal with ends)
diff --git a/src/mir_app/src/meta_services.cpp b/src/mir_app/src/meta_services.cpp
index 8e00dc8fe8..c57b4600b4 100644
--- a/src/mir_app/src/meta_services.cpp
+++ b/src/mir_app/src/meta_services.cpp
@@ -457,7 +457,7 @@ int Meta_ContactDeleted(WPARAM hContact, LPARAM)
if (cc->IsSub()) {
DBCachedContact *ccMeta = CheckMeta(cc->parentID);
if (ccMeta) {
- Meta_RemoveContactNumber(ccMeta, Meta_GetContactNumber(ccMeta, hContact), true);
+ Meta_RemoveContactNumber(ccMeta, Meta_GetContactNumber(ccMeta, hContact), true, true);
NotifyEventHooks(hSubcontactsChanged, ccMeta->contactID, 0);
// no more subs? remove the meta itself
diff --git a/src/mir_app/src/metacontacts.h b/src/mir_app/src/metacontacts.h
index 5c82f6cfcd..d73044cec1 100644
--- a/src/mir_app/src/metacontacts.h
+++ b/src/mir_app/src/metacontacts.h
@@ -46,7 +46,7 @@ INT_PTR Meta_Default(WPARAM wParam,LPARAM lParam);
INT_PTR Meta_OnOff(WPARAM wParam, LPARAM lParam);
int Meta_ModifyMenu(WPARAM wParam,LPARAM lParam);
BOOL Meta_Assign(MCONTACT src, MCONTACT dest, BOOL set_as_default);
-void Meta_RemoveContactNumber(DBCachedContact *cc, int number, bool bUpdateInfo);
+void Meta_RemoveContactNumber(DBCachedContact *cc, int number, bool bUpdateInfo, bool bDeleteSub = false);
int Meta_SetNick(char *proto);
int Meta_HideLinkedContacts(void);
int Meta_GetContactNumber(DBCachedContact *cc, MCONTACT hContact);
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index 7bbe2c533e..cef5d03f20 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -667,3 +667,5 @@ g_hevSettingChanged @696 NONAME
??1GCSessionInfoBase@@QAE@XZ @700 NONAME
?getUserList@GCSessionInfoBase@@QAEAAU?$OBJLIST@UUSERINFO@@@@XZ @701 NONAME
?getMe@GCSessionInfoBase@@QBEPAUUSERINFO@@XZ @702 NONAME
+?MetaRemoveSubHistory@MDatabaseCommon@@UAGHPAUDBCachedContact@@@Z @703 NONAME
+?MetaRemoveSubHistory@MDatabaseReadonly@@UAGHPAUDBCachedContact@@@Z @704 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index c7260c9440..b91d38854b 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -667,3 +667,5 @@ g_hevSettingChanged @696 NONAME
??1GCSessionInfoBase@@QEAA@XZ @700 NONAME
?getUserList@GCSessionInfoBase@@QEAAAEAU?$OBJLIST@UUSERINFO@@@@XZ @701 NONAME
?getMe@GCSessionInfoBase@@QEBAPEAUUSERINFO@@XZ @702 NONAME
+?MetaRemoveSubHistory@MDatabaseCommon@@UEAAHPEAUDBCachedContact@@@Z @703 NONAME
+?MetaRemoveSubHistory@MDatabaseReadonly@@UEAAHPEAUDBCachedContact@@@Z @704 NONAME