diff options
author | George Hazan <george.hazan@gmail.com> | 2015-01-13 21:33:15 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2015-01-13 21:33:15 +0000 |
commit | c842fa175cdda0331567ea6f06e7084ceb51d260 (patch) | |
tree | 81457f2b09a80659cbd907e7ee74995a8bd0df85 /plugins | |
parent | 5952466c42cf02a659f5b110c77eca76a5476391 (diff) |
well, everything works but events
git-svn-id: http://svn.miranda-ng.org/main/trunk@11850 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Dbx_mdb/src/commonheaders.h | 12 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbcontacts.cpp | 20 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbintf.cpp | 38 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbintf.h | 3 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbmodulechain.cpp | 11 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbsettings.cpp | 74 |
6 files changed, 88 insertions, 70 deletions
diff --git a/plugins/Dbx_mdb/src/commonheaders.h b/plugins/Dbx_mdb/src/commonheaders.h index ecc4347629..7b0c0bc0ad 100644 --- a/plugins/Dbx_mdb/src/commonheaders.h +++ b/plugins/Dbx_mdb/src/commonheaders.h @@ -59,10 +59,13 @@ extern LIST<CDbxMdb> g_Dbs; class txn_lock
{
MDB_txn *txn;
+ MDB_env *env;
public:
- __forceinline txn_lock(MDB_env *pEnv)
- { mdb_txn_begin(pEnv, NULL, 0, &txn); + __forceinline txn_lock(MDB_env *pEnv) :
+ env(pEnv)
+ { + mdb_txn_begin(pEnv, NULL, 0, &txn); }
__forceinline ~txn_lock()
@@ -73,10 +76,11 @@ public: __forceinline operator MDB_txn*() const { return txn; }
- __forceinline void commit()
+ __forceinline bool commit()
{
- mdb_txn_commit(txn);
+ bool bRes = (mdb_txn_commit(txn) != MDB_MAP_FULL);
txn = NULL;
+ return bRes;
}
__forceinline void abort()
diff --git a/plugins/Dbx_mdb/src/dbcontacts.cpp b/plugins/Dbx_mdb/src/dbcontacts.cpp index b02c4cb596..0a6e6859f1 100644 --- a/plugins/Dbx_mdb/src/dbcontacts.cpp +++ b/plugins/Dbx_mdb/src/dbcontacts.cpp @@ -89,10 +89,12 @@ STDMETHODIMP_(LONG) CDbxMdb::DeleteContact(MCONTACT contactID) MDB_val key = { sizeof(DWORD), &contactID }; - txn_lock trnlck(m_pMdbEnv); - mdb_open(trnlck, "contacts", MDB_INTEGERKEY, &m_dbContacts); - mdb_del(trnlck, m_dbContacts, &key, NULL); - trnlck.commit(); + for (;; Remap()) {
+ txn_lock trnlck(m_pMdbEnv); + mdb_del(trnlck, m_dbContacts, &key, NULL); + if (trnlck.commit()) + break; + } return 0;
}
@@ -110,10 +112,12 @@ STDMETHODIMP_(MCONTACT) CDbxMdb::AddContact() MDB_val key = { sizeof(DWORD), &dwContactId }; MDB_val data = { sizeof(DBContact), &dbc }; - txn_lock trnlck(m_pMdbEnv); - mdb_open(trnlck, "contacts", MDB_INTEGERKEY, &m_dbContacts); - mdb_put(trnlck, m_dbContacts, &key, &data, 0); - trnlck.commit(); + for (;; Remap()) {
+ txn_lock trnlck(m_pMdbEnv); + mdb_put(trnlck, m_dbContacts, &key, &data, 0); + if (trnlck.commit()) + break; + } DBCachedContact *cc = m_cache->AddContactToCache(dwContactId);
cc->dwDriverData = 0;
diff --git a/plugins/Dbx_mdb/src/dbintf.cpp b/plugins/Dbx_mdb/src/dbintf.cpp index 52e5083e75..b889ea8f5b 100644 --- a/plugins/Dbx_mdb/src/dbintf.cpp +++ b/plugins/Dbx_mdb/src/dbintf.cpp @@ -51,7 +51,6 @@ CDbxMdb::CDbxMdb(const TCHAR *tszFileName, int iMode) : InitDbInstance(this);
mdb_env_create(&m_pMdbEnv);
- mdb_env_set_mapsize(m_pMdbEnv, 65536);
mdb_env_set_maxdbs(m_pMdbEnv, 10);
m_codePage = CallService(MS_LANGPACK_GETCODEPAGE, 0, 0);
@@ -86,13 +85,7 @@ CDbxMdb::~CDbxMdb() int CDbxMdb::Load(bool bSkipInit)
{
- int mode = MDB_NOSYNC | MDB_NOSUBDIR;
- if (m_bReadOnly)
- mode += MDB_RDONLY;
- else
- mode += MDB_WRITEMAP;
-
- if (mdb_env_open(m_pMdbEnv, _T2A(m_tszProfileName), mode, 0664) != 0)
+ if (!Remap())
return EGROKPRF_CANTREAD;
if (!bSkipInit) {
@@ -129,16 +122,8 @@ int CDbxMdb::Load(bool bSkipInit) int CDbxMdb::Create(void)
{
- int mode = MDB_NOSYNC | MDB_NOSUBDIR;
- if (m_bReadOnly)
- mode += MDB_RDONLY;
- else
- mode += MDB_WRITEMAP;
-
- if (mdb_env_open(m_pMdbEnv, _T2A(m_tszProfileName), mode, 0664) != 0)
- return EGROKPRF_CANTREAD;
-
- return 0;
+ m_dwFileSize = 0;
+ return (Remap()) ? 0 : EGROKPRF_CANTREAD;
}
int CDbxMdb::Check(void)
@@ -147,6 +132,10 @@ int CDbxMdb::Check(void) if (hFile == INVALID_HANDLE_VALUE)
return EGROKPRF_CANTREAD;
+ LARGE_INTEGER iFileSize;
+ GetFileSizeEx(hFile, &iFileSize);
+ m_dwFileSize = (iFileSize.LowPart & 0xFFFFF000);
+
DWORD dummy = 0;
char buf[32];
if (!ReadFile(hFile, buf, sizeof(buf), &dummy, NULL)) {
@@ -170,6 +159,19 @@ STDMETHODIMP_(void) CDbxMdb::SetCacheSafetyMode(BOOL bIsSet) m_safetyMode = bIsSet != 0;
}
+bool CDbxMdb::Remap()
+{
+ m_dwFileSize += 0x100000;
+ mdb_env_set_mapsize(m_pMdbEnv, m_dwFileSize);
+
+ int mode = MDB_NOSYNC | MDB_NOSUBDIR;
+ if (m_bReadOnly)
+ mode += MDB_RDONLY;
+ else
+ mode += MDB_WRITEMAP;
+ return mdb_env_open(m_pMdbEnv, _T2A(m_tszProfileName), mode, 0664) == MDB_SUCCESS;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
static DWORD DatabaseCorrupted = 0;
diff --git a/plugins/Dbx_mdb/src/dbintf.h b/plugins/Dbx_mdb/src/dbintf.h index 78507969df..e83f559634 100644 --- a/plugins/Dbx_mdb/src/dbintf.h +++ b/plugins/Dbx_mdb/src/dbintf.h @@ -197,7 +197,7 @@ protected: void FillContacts(void);
- void Map();
+ bool Remap();
public: // Check functions
int WorkInitialChecks(int);
@@ -218,6 +218,7 @@ public: protected:
MDB_env *m_pMdbEnv;
+ DWORD m_dwFileSize;
HANDLE hSettingChangeEvent, hContactDeletedEvent, hContactAddedEvent, hEventMarkedRead;
diff --git a/plugins/Dbx_mdb/src/dbmodulechain.cpp b/plugins/Dbx_mdb/src/dbmodulechain.cpp index 4643a2d295..a54d7ab2f9 100644 --- a/plugins/Dbx_mdb/src/dbmodulechain.cpp +++ b/plugins/Dbx_mdb/src/dbmodulechain.cpp @@ -103,10 +103,13 @@ DWORD CDbxMdb::GetModuleNameOfs(const char *szName) MDB_val key = { sizeof(int), &newIdx }, data = { sizeof(DBModuleName) + nameLen, pmod }; - txn_lock trnlck(m_pMdbEnv); - mdb_open(trnlck, "modules", MDB_INTEGERKEY, &m_dbModules); - mdb_put(trnlck, m_dbModules, &key, &data, 0);
- trnlck.commit();
+ for (;; Remap()) {
+ txn_lock trnlck(m_pMdbEnv); + mdb_open(trnlck, "modules", MDB_INTEGERKEY, &m_dbModules); + mdb_put(trnlck, m_dbModules, &key, &data, 0);
+ if (trnlck.commit())
+ break;
+ }
// add to cache
char *mod = (char*)HeapAlloc(m_hModHeap, 0, nameLen + 1);
diff --git a/plugins/Dbx_mdb/src/dbsettings.cpp b/plugins/Dbx_mdb/src/dbsettings.cpp index c4eaaad098..c345c42174 100644 --- a/plugins/Dbx_mdb/src/dbsettings.cpp +++ b/plugins/Dbx_mdb/src/dbsettings.cpp @@ -473,9 +473,6 @@ STDMETHODIMP_(BOOL) CDbxMdb::WriteContactSetting(MCONTACT contactID, DBCONTACTWR }
else m_cache->GetCachedValuePtr(contactID, szCachedSettingName, -1);
- txn_lock trnlck(m_pMdbEnv); - //mdb_open(trnlck, "settings", 0, &m_dbSettings); -
DBSettingKey keySearch;
keySearch.dwContactID = contactID;
keySearch.dwOfsModule = GetModuleNameOfs(dbcws->szModule);
@@ -497,31 +494,35 @@ STDMETHODIMP_(BOOL) CDbxMdb::WriteContactSetting(MCONTACT contactID, DBCONTACTWR data.mv_size = 3 + dbcwWork.value.cpbVal; break;
}
- if (mdb_put(trnlck, m_dbSettings, &key, &data, MDB_RESERVE) != 0)
- return 1;
-
- BYTE *pBlob = (BYTE*)data.mv_data;
- *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;
+ for (;; Remap()) {
+ txn_lock trnlck(m_pMdbEnv); + if (mdb_put(trnlck, m_dbSettings, &key, &data, MDB_RESERVE) != 0)
+ return 1;
- case DBVT_ASCIIZ:
- case DBVT_UTF8:
- data.mv_size = *(WORD*)pBlob = dbcwWork.value.cchVal;
- pBlob += 2;
- memcpy(pBlob, dbcwWork.value.pszVal, dbcwWork.value.cchVal);
- break;
+ BYTE *pBlob = (BYTE*)data.mv_data;
+ *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;
+
+ case DBVT_ASCIIZ:
+ case DBVT_UTF8:
+ data.mv_size = *(WORD*)pBlob = dbcwWork.value.cchVal;
+ pBlob += 2;
+ memcpy(pBlob, dbcwWork.value.pszVal, dbcwWork.value.cchVal);
+ break;
+
+ case DBVT_BLOB:
+ case DBVT_ENCRYPTED:
+ data.mv_size = *(WORD*)pBlob = dbcwWork.value.cpbVal;
+ pBlob += 2;
+ memcpy(pBlob, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
+ }
- case DBVT_BLOB:
- case DBVT_ENCRYPTED:
- data.mv_size = *(WORD*)pBlob = dbcwWork.value.cpbVal;
- pBlob += 2;
- memcpy(pBlob, dbcwWork.value.pbVal, dbcwWork.value.cpbVal);
+ if (trnlck.commit())
+ break;
}
-
- trnlck.commit();
lck.unlock();
// notify
@@ -555,19 +556,21 @@ STDMETHODIMP_(BOOL) CDbxMdb::DeleteContactSetting(MCONTACT contactID, LPCSTR szM mir_cslock lck(m_csDbAccess);
char *szCachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, moduleNameLen, settingNameLen);
if (szCachedSettingName[-1] == 0) { // it's not a resident variable
- txn_lock trnlck(m_pMdbEnv); - //mdb_open(trnlck, "settings", 0, &m_dbSettings); -
DBSettingKey keySearch;
keySearch.dwContactID = contactID;
keySearch.dwOfsModule = GetModuleNameOfs(szModule);
strncpy_s(keySearch.szSettingName, szSetting, _TRUNCATE);
MDB_val key = { 2 * sizeof(DWORD) + settingNameLen, &keySearch }, data;
- if (mdb_del(trnlck, m_dbSettings, &key, &data))
- return 1; - trnlck.commit();
+ for (;; Remap()) {
+ txn_lock trnlck(m_pMdbEnv); + if (mdb_del(trnlck, m_dbSettings, &key, &data))
+ return 1; +
+ if (trnlck.commit())
+ break;
+ }
}
m_cache->GetCachedValuePtr(saveContact, szCachedSettingName, -1);
@@ -593,7 +596,7 @@ STDMETHODIMP_(BOOL) CDbxMdb::EnumContactSettings(MCONTACT contactID, DBCONTACTEN DBSettingKey keySearch;
keySearch.dwContactID = contactID;
keySearch.dwOfsModule = GetModuleNameOfs(dbces->szModule);
- keySearch.szSettingName[0] = 0;
+ memset(keySearch.szSettingName, 0, SIZEOF(keySearch.szSettingName));
LIST<char> arSettings(50);
@@ -601,9 +604,9 @@ STDMETHODIMP_(BOOL) CDbxMdb::EnumContactSettings(MCONTACT contactID, DBCONTACTEN MDB_cursor *cursor; mdb_cursor_open(trnlck, m_dbSettings, &cursor); - MDB_val key = { 2 * sizeof(DWORD), &keySearch }, data; - mdb_cursor_get(cursor, &key, &data, MDB_SET_KEY); - while (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == 0) { + MDB_val key = { sizeof(keySearch), &keySearch }, data; + mdb_cursor_get(cursor, &key, &data, MDB_SET_RANGE); + do { DBSettingKey *pKey = (DBSettingKey*)key.mv_data; if (pKey->dwContactID != contactID || pKey->dwOfsModule != keySearch.dwOfsModule) break; @@ -612,6 +615,7 @@ STDMETHODIMP_(BOOL) CDbxMdb::EnumContactSettings(MCONTACT contactID, DBCONTACTEN strncpy_s(szSetting, pKey->szSettingName, key.mv_size - sizeof(DWORD)*2);
arSettings.insert(mir_strdup(szSetting));
} + while (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == 0); mdb_cursor_close(cursor); for (int i = 0; i < arSettings.getCount(); i++) { |