diff options
-rw-r--r-- | include/m_db_int.h | 29 | ||||
-rw-r--r-- | libs/win32/mir_app.lib | bin | 185102 -> 186012 bytes | |||
-rw-r--r-- | libs/win64/mir_app.lib | bin | 180340 -> 181270 bytes | |||
-rw-r--r-- | plugins/Dbx_mdbx/src/dbcontacts.cpp | 84 | ||||
-rw-r--r-- | plugins/Dbx_mdbx/src/dbintf.h | 4 | ||||
-rw-r--r-- | src/mir_app/src/MDatabaseCommon.cpp | 5 | ||||
-rw-r--r-- | src/mir_app/src/MDatabaseReadonly.cpp | 5 | ||||
-rw-r--r-- | src/mir_app/src/meta_menu.cpp | 10 | ||||
-rw-r--r-- | src/mir_app/src/meta_services.cpp | 2 | ||||
-rw-r--r-- | src/mir_app/src/metacontacts.h | 2 | ||||
-rw-r--r-- | src/mir_app/src/mir_app.def | 2 | ||||
-rw-r--r-- | src/mir_app/src/mir_app64.def | 2 |
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 Binary files differindex a107d733cc..5e12104d7c 100644 --- a/libs/win32/mir_app.lib +++ b/libs/win32/mir_app.lib diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib Binary files differindex d256af4b1d..0488a494e4 100644 --- a/libs/win64/mir_app.lib +++ b/libs/win64/mir_app.lib 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
|