From 436e303e24e5046d6cc52ac3da51a0b51adbef36 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 15 Jun 2020 18:35:21 +0300 Subject: simpler way of applying server ids to messages --- plugins/Dbx_mdbx/src/dbevents.cpp | 75 +++++++++++++++++++++++++-------------- plugins/Dbx_mdbx/src/dbintf.h | 3 +- 2 files changed, 50 insertions(+), 28 deletions(-) (limited to 'plugins/Dbx_mdbx') diff --git a/plugins/Dbx_mdbx/src/dbevents.cpp b/plugins/Dbx_mdbx/src/dbevents.cpp index f065989221..724c5e4542 100644 --- a/plugins/Dbx_mdbx/src/dbevents.cpp +++ b/plugins/Dbx_mdbx/src/dbevents.cpp @@ -52,6 +52,7 @@ BOOL CDbxMDBX::DeleteEvent(MEVENT hDbEvent) { DBCachedContact *cc, *cc2; DBEvent dbe; + char *szId = nullptr; { txn_ptr_ro txn(m_txn_ro); MDBX_val key = { &hDbEvent, sizeof(MEVENT) }, data; @@ -59,6 +60,11 @@ BOOL CDbxMDBX::DeleteEvent(MEVENT hDbEvent) return 1; dbe = *(DBEvent*)data.iov_base; + if (dbe.flags & DBEF_HAS_ID) { + char *src = (char *)data.iov_base + sizeof(dbe) + dbe.cbBlob + 1; + szId = NEWSTR_ALLOCA(src); + } + cc = (dbe.dwContactID != 0) ? m_cache->GetCachedContact(dbe.dwContactID) : &m_ccDummy; if (cc == nullptr || cc->dbc.dwEventCount == 0) return 1; @@ -111,6 +117,15 @@ BOOL CDbxMDBX::DeleteEvent(MEVENT hDbEvent) return 1; } + if (szId) { + DBEventIdKey keyId; + keyId.iModuleId = dbe.iModuleId; + strncpy_s(keyId.szEventId, szId, _TRUNCATE); + + MDBX_val keyid = { &keyId, sizeof(MEVENT) + strlen(keyId.szEventId) + 1 }; + mdbx_del(trnlck, m_dbEventIds, &keyid, nullptr); + } + // remove an event key.iov_len = sizeof(MEVENT); key.iov_base = &hDbEvent; if (mdbx_del(trnlck, m_dbEvents, &key, nullptr) != MDBX_SUCCESS) @@ -194,14 +209,25 @@ bool CDbxMDBX::EditEvent(MCONTACT contactID, MEVENT hDbEvent, const DBEVENTINFO } } - { - BYTE *recBuf = (BYTE*)_alloca(sizeof(DBEvent) + dbe.cbBlob); - DBEvent *pNewEvent = (DBEvent*)recBuf; - *pNewEvent = dbe; - memcpy(pNewEvent + 1, pBlob, dbe.cbBlob); + size_t cbSrvId = mir_strlen(dbei->szId); + if (cbSrvId > 0) { + cbSrvId++; + dbe.flags |= DBEF_HAS_ID; + } + BYTE *recBuf = (BYTE*)_alloca(sizeof(DBEvent) + dbe.cbBlob + cbSrvId + 1), *p = recBuf; + memcpy(p, &dbe, sizeof(dbe)); p += sizeof(dbe); + memcpy(p, pBlob, dbe.cbBlob); p += dbe.cbBlob; + if (*p != 0) + *p++ = 0; + if (cbSrvId) { + memcpy(p, dbei->szId, cbSrvId); + p += cbSrvId; + } + + { txn_ptr trnlck(StartTran()); - MDBX_val key = { &hDbEvent, sizeof(MEVENT) }, data = { recBuf, sizeof(DBEvent) + dbe.cbBlob }; + MDBX_val key = { &hDbEvent, sizeof(MEVENT) }, data = { recBuf, int(p - recBuf) }; if (mdbx_put(trnlck, m_dbEvents, &key, &data, 0) != MDBX_SUCCESS) return false; @@ -238,6 +264,16 @@ bool CDbxMDBX::EditEvent(MCONTACT contactID, MEVENT hDbEvent, const DBEVENTINFO return false; } + if (dbei->szId) { + DBEventIdKey keyId; + keyId.iModuleId = dbe.iModuleId; + strncpy_s(keyId.szEventId, dbei->szId, _TRUNCATE); + + MDBX_val keyid = { &keyId, sizeof(MEVENT) + strlen(keyId.szEventId) + 1 }, dataid = { &hDbEvent, sizeof(hDbEvent) }; + if (mdbx_put(trnlck, m_dbEventIds, &keyid, &dataid, 0) != MDBX_SUCCESS) + return false; + } + if (trnlck.commit() != MDBX_SUCCESS) return false; } @@ -273,6 +309,7 @@ BOOL CDbxMDBX::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) return 1; } + size_t cbBlob; const DBEvent *dbe; { txn_ptr_ro txn(m_txn_ro); @@ -282,13 +319,14 @@ BOOL CDbxMDBX::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) return 1; dbe = (const DBEvent*)data.iov_base; + cbBlob = data.iov_len - sizeof(DBEvent); } dbei->szModule = GetModuleName(dbe->iModuleId); dbei->timestamp = dbe->timestamp; dbei->flags = dbe->flags; dbei->eventType = dbe->wEventType; - size_t bytesToCopy = min(dbei->cbBlob, dbe->cbBlob); + size_t bytesToCopy = min(dbei->cbBlob, cbBlob); dbei->cbBlob = dbe->cbBlob; if (bytesToCopy && dbei->pBlob) { BYTE *pSrc = (BYTE*)dbe + sizeof(DBEvent); @@ -302,9 +340,13 @@ BOOL CDbxMDBX::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) memcpy(dbei->pBlob, pBlob, bytesToCopy); if (bytesToCopy > len) memset(dbei->pBlob + len, 0, bytesToCopy - len); + mir_free(pBlob); } else memcpy(dbei->pBlob, pSrc, bytesToCopy); + + if (dbei->flags & DBEF_HAS_ID) + dbei->szId = (char *)pSrc + dbei->cbBlob + 1; } return 0; } @@ -439,25 +481,6 @@ MEVENT CDbxMDBX::GetEventById(LPCSTR szModule, LPCSTR szId) return hDbEvent; } -BOOL CDbxMDBX::SetEventId(LPCSTR szModule, MEVENT hDbEvent, LPCSTR szId) -{ - if (szModule == nullptr || szId == nullptr || !hDbEvent) - return 1; - - DBEventIdKey keyId; - keyId.iModuleId = GetModuleID(szModule); - strncpy_s(keyId.szEventId, szId, _TRUNCATE); - - txn_ptr trnlck(StartTran()); - MDBX_val key = { &keyId, sizeof(MEVENT) + strlen(keyId.szEventId) + 1 }, data = { &hDbEvent, sizeof(hDbEvent) }; - if (mdbx_put(trnlck, m_dbEventIds, &key, &data, 0) != MDBX_SUCCESS) - return 1; - if (trnlck.commit() != MDBX_SUCCESS) - return 1; - - return 0; -} - ///////////////////////////////////////////////////////////////////////////////////////// MCONTACT CDbxMDBX::GetEventContact(MEVENT hDbEvent) diff --git a/plugins/Dbx_mdbx/src/dbintf.h b/plugins/Dbx_mdbx/src/dbintf.h index 06602c8632..0a29c30a78 100644 --- a/plugins/Dbx_mdbx/src/dbintf.h +++ b/plugins/Dbx_mdbx/src/dbintf.h @@ -296,8 +296,7 @@ public: STDMETHODIMP_(BOOL) Backup(const wchar_t*); STDMETHODIMP_(MEVENT) GetEventById(LPCSTR szModule, LPCSTR szId) override; - STDMETHODIMP_(BOOL) SetEventId(LPCSTR szModule, MEVENT, LPCSTR szId) override; - + STDMETHODIMP_(DB::EventCursor *) EventCursor(MCONTACT hContact, MEVENT hDbEvent) override; STDMETHODIMP_(DB::EventCursor *) EventCursorRev(MCONTACT hContact, MEVENT hDbEvent) override; -- cgit v1.2.3