diff options
author | George Hazan <george.hazan@gmail.com> | 2012-10-03 18:27:17 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2012-10-03 18:27:17 +0000 |
commit | 8cb2a99e08a3f8fadc3b39f00228efa7d2b20050 (patch) | |
tree | 65576462073546d462936d7ad8a2aa3e4e6147d8 /plugins/Db3x_mmap/src/dbsettings.cpp | |
parent | d2da1f079fc61195437007882296184714d2fe54 (diff) |
database cache migration, phase 1
git-svn-id: http://svn.miranda-ng.org/main/trunk@1772 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Db3x_mmap/src/dbsettings.cpp')
-rw-r--r-- | plugins/Db3x_mmap/src/dbsettings.cpp | 189 |
1 files changed, 16 insertions, 173 deletions
diff --git a/plugins/Db3x_mmap/src/dbsettings.cpp b/plugins/Db3x_mmap/src/dbsettings.cpp index fedc5f60d2..872d482e27 100644 --- a/plugins/Db3x_mmap/src/dbsettings.cpp +++ b/plugins/Db3x_mmap/src/dbsettings.cpp @@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "commonheaders.h"
DWORD GetModuleNameOfs(const char *szName);
-DBCachedContactValueList* AddToCachedContactList(HANDLE hContact, int index);
+DBCachedContact* AddToCachedContactList(HANDLE hContact, int index);
int DBPreset_QuerySetting(const char *szModule, const char *szSetting, DBVARIANT *dbv, BOOL isStatic);
@@ -35,154 +35,6 @@ DWORD __forceinline GetSettingValueLength(PBYTE pSetting) return pSetting[0];
}
-char* CDb3Base::InsertCachedSetting(const char* szName, size_t cbNameLen)
-{
- char* newValue = (char*)HeapAlloc(m_hCacheHeap, 0, cbNameLen);
- *newValue = 0;
- strcpy(newValue+1, szName+1);
- m_lSettings.insert(newValue);
- return newValue;
-}
-
-char* CDb3Base::GetCachedSetting(const char *szModuleName,const char *szSettingName, int moduleNameLen, int settingNameLen)
-{
- char szFullName[512];
- strcpy(szFullName+1,szModuleName);
- szFullName[moduleNameLen+1] = '/';
- strcpy(szFullName+moduleNameLen+2,szSettingName);
-
- if (m_lastSetting && strcmp(szFullName+1, m_lastSetting) == 0)
- return m_lastSetting;
-
- int index = m_lSettings.getIndex(szFullName);
- if (index != -1)
- m_lastSetting = m_lSettings[index]+1;
- else
- m_lastSetting = InsertCachedSetting( szFullName, settingNameLen+moduleNameLen+3)+1;
-
- return m_lastSetting;
-}
-
-void CDb3Base::SetCachedVariant( DBVARIANT* s /* new */, DBVARIANT* d /* cached */ )
-{
- char* szSave = ( d->type == DBVT_UTF8 || d->type == DBVT_ASCIIZ ) ? d->pszVal : NULL;
-
- memcpy( d, s, sizeof( DBVARIANT ));
- if (( s->type == DBVT_UTF8 || s->type == DBVT_ASCIIZ ) && s->pszVal != NULL ) {
- if ( szSave != NULL )
- d->pszVal = (char*)HeapReAlloc(m_hCacheHeap,0,szSave,strlen(s->pszVal)+1);
- else
- d->pszVal = (char*)HeapAlloc(m_hCacheHeap,0,strlen(s->pszVal)+1);
- strcpy(d->pszVal,s->pszVal);
- }
- else if ( szSave != NULL )
- HeapFree(m_hCacheHeap,0,szSave);
-
-#ifdef DBLOGGING
- switch( d->type ) {
- case DBVT_BYTE: log1( "set cached byte: %d", d->bVal ); break;
- case DBVT_WORD: log1( "set cached word: %d", d->wVal ); break;
- case DBVT_DWORD: log1( "set cached dword: %d", d->dVal ); break;
- case DBVT_UTF8:
- case DBVT_ASCIIZ: log1( "set cached string: '%s'", d->pszVal ); break;
- default: log1( "set cached crap: %d", d->type ); break;
- }
-#endif
-}
-
-void CDb3Base::FreeCachedVariant( DBVARIANT* V )
-{
- if (( V->type == DBVT_ASCIIZ || V->type == DBVT_UTF8 ) && V->pszVal != NULL )
- HeapFree(m_hCacheHeap,0,V->pszVal);
-}
-
-DBVARIANT* CDb3Base::GetCachedValuePtr( HANDLE hContact, char* szSetting, int bAllocate )
-{
- if ( hContact == 0 ) {
- DBCachedGlobalValue Vtemp, *V;
- Vtemp.name = szSetting;
- int index = m_lGlobalSettings.getIndex(&Vtemp);
- if (index != -1) {
- V = m_lGlobalSettings[index];
- if ( bAllocate == -1 ) {
- FreeCachedVariant( &V->value );
- m_lGlobalSettings.remove(index);
- HeapFree(m_hCacheHeap,0,V);
- return NULL;
- }
- }
- else {
- if ( bAllocate != 1 )
- return NULL;
-
- V = (DBCachedGlobalValue*)HeapAlloc(m_hCacheHeap,HEAP_ZERO_MEMORY,sizeof(DBCachedGlobalValue));
- V->name = szSetting;
- m_lGlobalSettings.insert(V);
- }
-
- return &V->value;
- }
- else {
- DBCachedContactValue *V, *V1;
- DBCachedContactValueList VLtemp,*VL;
-
- if (m_hLastCachedContact == hContact && m_lastVL)
- VL = m_lastVL;
- else {
- VLtemp.hContact = hContact;
-
- int index = m_lContacts.getIndex(&VLtemp);
- if (index == -1) {
- if ( bAllocate != 1 )
- return NULL;
-
- VL = AddToCachedContactList(hContact, index);
- }
- else VL = m_lContacts[index];
-
- m_lastVL = VL;
- m_hLastCachedContact = hContact;
- }
-
- for ( V = VL->first; V != NULL; V = V->next)
- if (V->name == szSetting)
- break;
-
- if ( V == NULL ) {
- if ( bAllocate != 1 )
- return NULL;
-
- V = (DBCachedContactValue *)HeapAlloc(m_hCacheHeap, HEAP_ZERO_MEMORY, sizeof(DBCachedContactValue));
- if (VL->last)
- VL->last->next = V;
- else
- VL->first = V;
- VL->last = V;
- V->name = szSetting;
- }
- else if ( bAllocate == -1 ) {
- m_lastVL = NULL;
- FreeCachedVariant(&V->value);
- if ( VL->first == V ) {
- VL->first = V->next;
- if (VL->last == V)
- VL->last = V->next; // NULL
- }
- else
- for ( V1 = VL->first; V1 != NULL; V1 = V1->next )
- if ( V1->next == V ) {
- V1->next = V->next;
- if (VL->last == V)
- VL->last = V1;
- break;
- }
- HeapFree(m_hCacheHeap,0,V);
- return NULL;
- }
-
- return &V->value;
-} }
-
#define NeedBytes(n) if (bytesRemaining<(n)) pBlob = (PBYTE)DBRead(ofsBlobPtr,(n),&bytesRemaining)
#define MoveAlong(n) {int x = n; pBlob += (x); ofsBlobPtr += (x); bytesRemaining -= (x);}
#define VLT(n) ((n == DBVT_UTF8)?DBVT_ASCIIZ:n)
@@ -219,9 +71,9 @@ int CDb3Base::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs log3("get [%08p] %s/%s",hContact,dbcgs->szModule,dbcgs->szSetting);
- szCachedSettingName = GetCachedSetting(dbcgs->szModule,dbcgs->szSetting,moduleNameLen,settingNameLen);
+ szCachedSettingName = m_cache->GetCachedSetting(dbcgs->szModule,dbcgs->szSetting,moduleNameLen,settingNameLen);
{
- DBVARIANT* pCachedValue = GetCachedValuePtr( hContact, szCachedSettingName, 0 );
+ DBVARIANT* pCachedValue = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 0);
if ( pCachedValue != NULL ) {
if ( pCachedValue->type == DBVT_ASCIIZ || pCachedValue->type == DBVT_UTF8 ) {
int cbOrigLen = dbcgs->pValue->cchVal;
@@ -320,9 +172,9 @@ int CDb3Base::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs /**** add to cache **********************/
if ( dbcgs->pValue->type != DBVT_BLOB ) {
- DBVARIANT* pCachedValue = GetCachedValuePtr( hContact, szCachedSettingName, 1 );
+ DBVARIANT* pCachedValue = m_cache->GetCachedValuePtr( hContact, szCachedSettingName, 1 );
if ( pCachedValue != NULL )
- SetCachedVariant(dbcgs->pValue,pCachedValue);
+ m_cache->SetCachedVariant(dbcgs->pValue, pCachedValue);
}
logg();
@@ -351,7 +203,7 @@ int CDb3Base::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs /**** add missing setting to cache **********************/
if ( dbcgs->pValue->type != DBVT_BLOB )
{
- DBVARIANT* pCachedValue = GetCachedValuePtr( hContact, szCachedSettingName, 1 );
+ DBVARIANT* pCachedValue = m_cache->GetCachedValuePtr( hContact, szCachedSettingName, 1 );
if ( pCachedValue != NULL )
pCachedValue->type = DBVT_DELETED;
}
@@ -479,22 +331,13 @@ STDMETHODIMP_(BOOL) CDb3Base::FreeVariant(DBVARIANT *dbv) STDMETHODIMP_(BOOL) CDb3Base::SetSettingResident(BOOL bIsResident, const char *pszSettingName)
{
- size_t cbSettingNameLen = strlen(pszSettingName) + 2;
+ int cbSettingNameLen = (int)strlen(pszSettingName) + 2;
if (cbSettingNameLen < 512) {
- char* szSetting;
- char szTemp[512];
- strcpy( szTemp+1, pszSettingName);
-
- mir_cslock lck(m_csDbAccess);
- int idx = m_lSettings.getIndex(szTemp);
- if (idx == -1)
- szSetting = InsertCachedSetting( szTemp, cbSettingNameLen);
- else
- szSetting = m_lSettings[idx];
-
+ char *szSetting = m_cache->InsertCachedSetting(pszSettingName, cbSettingNameLen);
*szSetting = (char)bIsResident;
- idx = m_lResidentSettings.getIndex(szSetting+1);
+ mir_cslock lck(m_csDbAccess);
+ int idx = m_lResidentSettings.getIndex(szSetting+1);
if (idx == -1) {
if (bIsResident)
m_lResidentSettings.insert(szSetting+1);
@@ -574,9 +417,9 @@ STDMETHODIMP_(BOOL) CDb3Base::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT mir_cslockfull lck(m_csDbAccess);
- char* szCachedSettingName = GetCachedSetting(tmp.szModule, tmp.szSetting, moduleNameLen, settingNameLen);
+ char* szCachedSettingName = m_cache->GetCachedSetting(tmp.szModule, tmp.szSetting, moduleNameLen, settingNameLen);
if ( tmp.value.type != DBVT_BLOB ) {
- DBVARIANT* pCachedValue = GetCachedValuePtr(hContact, szCachedSettingName, 1);
+ DBVARIANT* pCachedValue = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 1);
if ( pCachedValue != NULL ) {
BOOL bIsIdentical = FALSE;
if ( pCachedValue->type == tmp.value.type ) {
@@ -590,7 +433,7 @@ STDMETHODIMP_(BOOL) CDb3Base::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT if ( bIsIdentical )
return 0;
}
- SetCachedVariant(&tmp.value, pCachedValue);
+ m_cache->SetCachedVariant(&tmp.value, pCachedValue);
}
if ( szCachedSettingName[-1] != 0 ) {
lck.unlock();
@@ -598,7 +441,7 @@ STDMETHODIMP_(BOOL) CDb3Base::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT return 0;
}
}
- else GetCachedValuePtr(hContact, szCachedSettingName, -1);
+ else m_cache->GetCachedValuePtr(hContact, szCachedSettingName, -1);
ofsModuleName = GetModuleNameOfs(tmp.szModule);
if (hContact == 0) ofsContact = m_dbHeader.ofsUser;
@@ -851,8 +694,8 @@ STDMETHODIMP_(BOOL) CDb3Base::DeleteContactSetting(HANDLE hContact, DBCONTACTGET }
DBMoveChunk(ofsSettingToCut,ofsSettingToCut+nameLen+valLen,ofsBlobPtr+1-ofsSettingToCut);
- szCachedSettingName = GetCachedSetting(dbcgs->szModule,dbcgs->szSetting,moduleNameLen,settingNameLen);
- GetCachedValuePtr((HANDLE)saveWparam, szCachedSettingName, -1 );
+ szCachedSettingName = m_cache->GetCachedSetting(dbcgs->szModule,dbcgs->szSetting,moduleNameLen,settingNameLen);
+ m_cache->GetCachedValuePtr((HANDLE)saveWparam, szCachedSettingName, -1 );
//quit
DBFlush(1);
|