summaryrefslogtreecommitdiff
path: root/plugins/Db3x_mmap
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Db3x_mmap')
-rw-r--r--plugins/Db3x_mmap/dbcache.cpp174
-rw-r--r--plugins/Db3x_mmap/dbintf.h311
-rw-r--r--plugins/Db3x_mmap/src/dbintfm.cpp42
3 files changed, 42 insertions, 485 deletions
diff --git a/plugins/Db3x_mmap/dbcache.cpp b/plugins/Db3x_mmap/dbcache.cpp
deleted file mode 100644
index 4092940c97..0000000000
--- a/plugins/Db3x_mmap/dbcache.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright 2012 Miranda NG project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "commonheaders.h"
-
-void CDdxMmap::Map()
-{
- m_hMap = CreateFileMapping(m_hDbFile, NULL, PAGE_READWRITE, 0, m_dwFileSize, NULL);
-
- if (m_hMap)
- {
- m_pDbCache = (PBYTE)MapViewOfFile(m_hMap, FILE_MAP_ALL_ACCESS/*FILE_MAP_WRITE*/, 0, 0 ,0);
- if (!m_pDbCache)
- DatabaseCorruption( _T("%s (MapViewOfFile failed. Code: %d)"));
- }
- else
- DatabaseCorruption( _T("%s (CreateFileMapping failed. Code: %d)"));
-}
-
-void CDdxMmap::ReMap(DWORD needed)
-{
- KillTimer(NULL,m_flushBuffersTimerId);
-
- log3("remapping %d + %d (file end: %d)",m_dwFileSize,needed,m_dbHeader.ofsFileEnd);
-
- if (needed > m_ChunkSize)
- {
- if (needed + m_dwFileSize > m_dbHeader.ofsFileEnd + m_ChunkSize)
- DatabaseCorruption( _T("%s (Too large increment)"));
- else
- {
- DWORD x = m_dbHeader.ofsFileEnd/m_ChunkSize;
- m_dwFileSize = (x+1)*m_ChunkSize;
- }
- }
- else
- m_dwFileSize += m_ChunkSize;
-
-// FlushViewOfFile(m_pDbCache, 0);
- UnmapViewOfFile(m_pDbCache);
- m_pDbCache = NULL;
- CloseHandle(m_hMap);
-
- Map();
-}
-
-void CDdxMmap::DBMoveChunk(DWORD ofsDest,DWORD ofsSource,int bytes)
-{
- int x = 0;
- log3("move %d %08x->%08x",bytes,ofsSource,ofsDest);
- if (ofsDest+bytes > m_dwFileSize) ReMap(ofsDest+bytes-m_dwFileSize);
- if (ofsSource+bytes > m_dwFileSize) {
- x = ofsSource+bytes-m_dwFileSize;
- log0("buggy move!");
- }
- if (x > 0)
- ZeroMemory(m_pDbCache+ofsDest+bytes-x, x);
- if (ofsSource < m_dwFileSize)
- MoveMemory(m_pDbCache+ofsDest,m_pDbCache+ofsSource, bytes-x);
-
- logg();
-}
-
-//we are assumed to be in a mutex here
-PBYTE CDdxMmap::DBRead(DWORD ofs,int bytesRequired,int *bytesAvail)
-{
- // buggy read
- if (ofs>= m_dwFileSize) {
- log2("read from outside %d@%08x",bytesRequired,ofs);
- if (bytesAvail != NULL) *bytesAvail = m_ChunkSize;
- return m_pNull;
- }
- log3((ofs+bytesRequired > m_dwFileSize)?"read %d@%08x, only %d avaliable":"read %d@%08x",bytesRequired,ofs,m_dwFileSize-ofs);
- if (bytesAvail != NULL) *bytesAvail = m_dwFileSize - ofs;
- return m_pDbCache+ofs;
-}
-
-//we are assumed to be in a mutex here
-void CDdxMmap::DBWrite(DWORD ofs,PVOID pData,int bytes)
-{
- log2("write %d@%08x",bytes,ofs);
- if (ofs+bytes > m_dwFileSize) ReMap(ofs+bytes-m_dwFileSize);
- MoveMemory(m_pDbCache+ofs,pData,bytes);
- logg();
-}
-
-//we are assumed to be in a mutex here
-void CDdxMmap::DBFill(DWORD ofs,int bytes)
-{
- log2("zerofill %d@%08x",bytes,ofs);
- if (ofs+bytes <= m_dwFileSize)
- ZeroMemory(m_pDbCache+ofs,bytes);
- logg();
-}
-
-static VOID CALLBACK DoBufferFlushTimerProc(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime)
-{
- for (int i=0; i < g_Dbs.getCount(); i++) {
- CDdxMmap* db = g_Dbs[i];
- if (db->m_flushBuffersTimerId != idEvent)
- continue;
-
- if (!db->m_pDbCache)
- return;
-
- KillTimer(NULL, db->m_flushBuffersTimerId);
- log0("tflush1");
- if (FlushViewOfFile(db->m_pDbCache, 0) == 0) {
- if (db->m_flushFailTick == 0)
- db->m_flushFailTick = GetTickCount();
- else if (GetTickCount() - db->m_flushFailTick > 5000)
- db->DatabaseCorruption(NULL);
- }
- else db->m_flushFailTick = 0;
- log0("tflush2");
- }
-}
-
-void CDdxMmap::DBFlush(int setting)
-{
- if (!setting) {
- log0("nflush1");
- if (m_safetyMode && m_pDbCache) {
- if (FlushViewOfFile(m_pDbCache, 0) == 0) {
- if (m_flushFailTick == 0)
- m_flushFailTick = GetTickCount();
- else if (GetTickCount() - m_flushFailTick > 5000)
- DatabaseCorruption(NULL);
- }
- else
- m_flushFailTick = 0;
- }
- log0("nflush2");
- return;
- }
- KillTimer(NULL, m_flushBuffersTimerId);
- m_flushBuffersTimerId = SetTimer(NULL, m_flushBuffersTimerId, 50, DoBufferFlushTimerProc);
-}
-
-int CDdxMmap::InitCache(void)
-{
- m_dwFileSize = GetFileSize(m_hDbFile, NULL);
-
- // Align to chunk
- DWORD x = m_dwFileSize % m_ChunkSize;
- if (x)
- m_dwFileSize += m_ChunkSize - x;
-
- Map();
-
- // zero region for reads outside the file
- m_pNull = (PBYTE)calloc(m_ChunkSize, 1);
- return 0;
-}
diff --git a/plugins/Db3x_mmap/dbintf.h b/plugins/Db3x_mmap/dbintf.h
deleted file mode 100644
index c3a14c0c01..0000000000
--- a/plugins/Db3x_mmap/dbintf.h
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright 2012 Miranda NG project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <m_db_int.h>
-
-/* tree diagram
-
-DBHeader
- |-->end of file (plain offset)
- |-->first contact (DBContact)
- | |-->next contact (DBContact)
- | | \--> ...
- | |-->first settings (DBContactSettings)
- | | |-->next settings (DBContactSettings)
- | | | \--> ...
- | | \-->module name (DBModuleName)
- | \-->first/last/firstunread event
- |-->user contact (DBContact)
- | |-->next contact = NULL
- | |-->first settings as above
- | \-->first/last/firstunread event as above
- \-->first module name (DBModuleName)
- \-->next module name (DBModuleName)
- \--> ...
-*/
-
-#define DB_THIS_VERSION 0x00000700u
-#define DB_SETTINGS_RESIZE_GRANULARITY 128
-
-struct DBSignature {
- char name[15];
- BYTE eof;
-};
-
-struct ModuleName
-{
- char *name;
- DWORD ofs;
-};
-
-#include <pshpack1.h>
-struct DBHeader {
- BYTE signature[16]; // 'Miranda ICQ DB',0,26
- DWORD version; //as 4 bytes, ie 1.2.3.10 = 0x0102030a
- //this version is 0x00000700
- DWORD ofsFileEnd; //offset of the end of the database - place to write
- //new structures
- DWORD slackSpace; //a counter of the number of bytes that have been
- //wasted so far due to deleting structures and/or
- //re-making them at the end. We should compact when
- //this gets above a threshold
- DWORD contactCount; //number of contacts in the chain,excluding the user
- DWORD ofsFirstContact; //offset to first DBContact in the chain
- DWORD ofsUser; //offset to DBContact representing the user
- DWORD ofsFirstModuleName; //offset to first struct DBModuleName in the chain
-};
-
-#define DBCONTACT_SIGNATURE 0x43DECADEu
-
-struct DBContact
-{
- DWORD signature;
- DWORD ofsNext; //offset to the next contact in the chain. zero if
- //this is the 'user' contact or the last contact
- //in the chain
- DWORD ofsFirstSettings; //offset to the first DBContactSettings in the
- //chain for this contact.
- DWORD eventCount; //number of events in the chain for this contact
- DWORD ofsFirstEvent,ofsLastEvent; //offsets to the first and last DBEvent in
- //the chain for this contact
- DWORD ofsFirstUnreadEvent; //offset to the first (chronological) unread event
- //in the chain, 0 if all are read
- DWORD timestampFirstUnread; //timestamp of the event at ofsFirstUnreadEvent
-};
-
-#define DBMODULENAME_SIGNATURE 0x4DDECADEu
-struct DBModuleName
-{
- DWORD signature;
- DWORD ofsNext; //offset to the next module name in the chain
- BYTE cbName; //number of characters in this module name
- char name[1]; //name, no nul terminator
-};
-
-#define DBCONTACTSETTINGS_SIGNATURE 0x53DECADEu
-struct DBContactSettings
-{
- DWORD signature;
- DWORD ofsNext; //offset to the next contactsettings in the chain
- DWORD ofsModuleName; //offset to the DBModuleName of the owner of these
- //settings
- DWORD cbBlob; //size of the blob in bytes. May be larger than the
- //actual size for reducing the number of moves
- //required using granularity in resizing
- BYTE blob[1]; //the blob. a back-to-back sequence of DBSetting
- //structs, the last has cbName = 0
-};
-
-#define DBEVENT_SIGNATURE 0x45DECADEu
-struct DBEvent
-{
- DWORD signature;
- DWORD ofsPrev,ofsNext; //offset to the previous and next events in the
- //chain. Chain is sorted chronologically
- DWORD ofsModuleName; //offset to a DBModuleName struct of the name of
- //the owner of this event
- DWORD timestamp; //seconds since 00:00:00 01/01/1970
- DWORD flags; //see m_database.h, db/event/add
- WORD eventType; //module-defined event type
- DWORD cbBlob; //number of bytes in the blob
- BYTE blob[1]; //the blob. module-defined formatting
-};
-
-#include <poppack.h>
-
-struct DBCachedGlobalValue
-{
- char* name;
- DBVARIANT value;
-};
-
-struct DBCachedContactValue
-{
- char* name;
- DBVARIANT value;
- DBCachedContactValue* next;
-};
-
-struct DBCachedContactValueList
-{
- HANDLE hContact;
- HANDLE hNext;
- DBCachedContactValue* first;
- DBCachedContactValue* last;
-};
-
-#define MAXCACHEDREADSIZE 65536
-
-struct CDb3Base : public MIDatabase, public MZeroedObject
-{
- CDb3Base(const TCHAR* tszFileName);
- ~CDb3Base();
-
- int Load(bool bSkipInit);
- int Create(void);
- int CreateDbHeaders();
- int CheckDbHeaders();
- void DatabaseCorruption(TCHAR *text);
-
- __forceinline HANDLE getFile() const { return m_hDbFile; }
-
-protected:
- STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
-
- STDMETHODIMP_(LONG) GetContactCount(void);
- STDMETHODIMP_(HANDLE) FindFirstContact(const char* szProto = NULL);
- STDMETHODIMP_(HANDLE) FindNextContact(HANDLE hContact, const char* szProto = NULL);
- STDMETHODIMP_(LONG) DeleteContact(HANDLE hContact);
- STDMETHODIMP_(HANDLE) AddContact(void);
- STDMETHODIMP_(BOOL) IsDbContact(HANDLE hContact);
-
- STDMETHODIMP_(LONG) GetEventCount(HANDLE hContact);
- STDMETHODIMP_(HANDLE) AddEvent(HANDLE hContact, DBEVENTINFO *dbe);
- STDMETHODIMP_(BOOL) DeleteEvent(HANDLE hContact, HANDLE hDbEvent);
- STDMETHODIMP_(LONG) GetBlobSize(HANDLE hDbEvent);
- STDMETHODIMP_(BOOL) GetEvent(HANDLE hDbEvent, DBEVENTINFO *dbe);
- STDMETHODIMP_(BOOL) MarkEventRead(HANDLE hContact, HANDLE hDbEvent);
- STDMETHODIMP_(HANDLE) GetEventContact(HANDLE hDbEvent);
- STDMETHODIMP_(HANDLE) FindFirstEvent(HANDLE hContact);
- STDMETHODIMP_(HANDLE) FindFirstUnreadEvent(HANDLE hContact);
- STDMETHODIMP_(HANDLE) FindLastEvent(HANDLE hContact);
- STDMETHODIMP_(HANDLE) FindNextEvent(HANDLE hDbEvent);
- STDMETHODIMP_(HANDLE) FindPrevEvent(HANDLE hDbEvent);
-
- STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam);
-
- STDMETHODIMP_(BOOL) GetContactSetting(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
- STDMETHODIMP_(BOOL) GetContactSettingStr(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
- STDMETHODIMP_(BOOL) GetContactSettingStatic(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
- STDMETHODIMP_(BOOL) FreeVariant(DBVARIANT *dbv);
- STDMETHODIMP_(BOOL) WriteContactSetting(HANDLE hContact, DBCONTACTWRITESETTING *dbcws);
- STDMETHODIMP_(BOOL) DeleteContactSetting(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
- STDMETHODIMP_(BOOL) EnumContactSettings(HANDLE hContact, DBCONTACTENUMSETTINGS* dbces);
- STDMETHODIMP_(BOOL) SetSettingResident(BOOL bIsResident, const char *pszSettingName);
- STDMETHODIMP_(BOOL) EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam);
-
-protected:
- virtual void DBMoveChunk(DWORD ofsDest, DWORD ofsSource, int bytes) = 0;
- virtual PBYTE DBRead(DWORD ofs, int bytesRequired, int *bytesAvail) = 0;
- virtual void DBWrite(DWORD ofs, PVOID pData, int bytes) = 0;
- virtual void DBFill(DWORD ofs, int bytes) = 0;
- virtual void DBFlush(int setting) = 0;
- virtual int InitCache(void) = 0;
-
-protected:
- virtual void EncodeCopyMemory(void *dst, void *src, size_t size);
- virtual void DecodeCopyMemory(void *dst, void *src, size_t size);
- virtual void EncodeDBWrite(DWORD ofs, void *src, int size);
- virtual void DecodeDBWrite(DWORD ofs, void *src, int size);
-
-protected:
- TCHAR* m_tszProfileName;
- HANDLE m_hDbFile;
- DBHeader m_dbHeader;
- DWORD m_ChunkSize;
- BOOL m_safetyMode;
-
- ////////////////////////////////////////////////////////////////////////////
- // database stuff
-public:
- UINT_PTR m_flushBuffersTimerId;
- DWORD m_flushFailTick;
- PBYTE m_pDbCache;
-
-protected:
- DWORD m_dwFileSize;
-
- CRITICAL_SECTION m_csDbAccess;
-
- int CheckProto(HANDLE hContact, const char *proto);
- DWORD CreateNewSpace(int bytes);
- void DeleteSpace(DWORD ofs, int bytes);
- DWORD ReallocSpace(DWORD ofs, int oldSize, int newSize);
-
- __forceinline PBYTE DBRead(HANDLE hContact, int bytesRequired, int *bytesAvail)
- { return DBRead((DWORD)hContact, bytesRequired, bytesAvail);
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // settings
-
- int m_codePage;
-
- HANDLE m_hCacheHeap;
- HANDLE m_hLastCachedContact;
- char* m_lastSetting;
- DBCachedContactValueList *m_lastVL;
-
- LIST<DBCachedContactValueList> m_lContacts;
- LIST<DBCachedGlobalValue> m_lGlobalSettings;
- LIST<char> m_lSettings, m_lResidentSettings;
- HANDLE hSettingChangeEvent, hContactDeletedEvent, hContactAddedEvent;
-
- DWORD GetSettingsGroupOfsByModuleNameOfs(DBContact *dbc,DWORD ofsModuleName);
- char* InsertCachedSetting(const char* szName, size_t cbNameLen);
- char* GetCachedSetting(const char *szModuleName,const char *szSettingName, int moduleNameLen, int settingNameLen);
- void SetCachedVariant(DBVARIANT* s, DBVARIANT* d);
- void FreeCachedVariant(DBVARIANT* V);
- DBVARIANT* GetCachedValuePtr(HANDLE hContact, char* szSetting, int bAllocate);
- int GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs,int isStatic);
-
- ////////////////////////////////////////////////////////////////////////////
- // contacts
-
- DBCachedContactValueList* AddToCachedContactList(HANDLE hContact, int index);
-
- ////////////////////////////////////////////////////////////////////////////
- // modules
-
- HANDLE m_hModHeap;
- LIST<ModuleName> m_lMods, m_lOfs;
- HANDLE hEventAddedEvent, hEventDeletedEvent, hEventFilterAddedEvent;
- ModuleName *m_lastmn;
-
- void AddToList(char *name, DWORD len, DWORD ofs);
- DWORD FindExistingModuleNameOfs(const char *szName);
- int InitModuleNames(void);
- DWORD GetModuleNameOfs(const char *szName);
- char *GetModuleNameByOfs(DWORD ofs);
-};
-
-struct CDb3Mmap : public CDb3Base
-{
- CDb3Mmap(const TCHAR* ptszFileName);
- ~CDb3Mmap();
-
-protected:
- virtual void DBMoveChunk(DWORD ofsDest, DWORD ofsSource, int bytes);
- virtual PBYTE DBRead(DWORD ofs, int bytesRequired, int *bytesAvail);
- virtual void DBWrite(DWORD ofs, PVOID pData, int bytes);
- virtual void DBFill(DWORD ofs, int bytes);
- virtual void DBFlush(int setting);
- virtual int InitCache(void);
-
-protected:
- PBYTE m_pNull;
- HANDLE m_hMap;
-
- void Map();
- void ReMap(DWORD needed);
-};
diff --git a/plugins/Db3x_mmap/src/dbintfm.cpp b/plugins/Db3x_mmap/src/dbintfm.cpp
new file mode 100644
index 0000000000..654165e924
--- /dev/null
+++ b/plugins/Db3x_mmap/src/dbintfm.cpp
@@ -0,0 +1,42 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright 2012 Miranda NG project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "commonheaders.h"
+
+CDb3Mmap::CDb3Mmap(const TCHAR* tszFileName) :
+ CDb3Base(tszFileName),
+ m_hMap(NULL),
+ m_pNull(NULL)
+{
+ SYSTEM_INFO sinf;
+ GetSystemInfo(&sinf);
+ m_ChunkSize = sinf.dwAllocationGranularity;
+}
+
+CDb3Mmap::~CDb3Mmap()
+{
+ if (m_hMap)
+ CloseHandle(m_hMap);
+ if (m_pNull)
+ free(m_pNull);
+}