From 00a8ec3be1ebc0367e6725f93833bd53323ffae5 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 21 Mar 2014 17:47:28 +0000 Subject: fix for running dbchecker over the locked profile git-svn-id: http://svn.miranda-ng.org/main/trunk@8673 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Db3x_mmap/src/dbintf.cpp | 24 +++++++++++++++--------- plugins/Db3x_mmap/src/dbintf.h | 7 +++++-- plugins/Db3x_mmap/src/init.cpp | 10 +++++----- plugins/Db3x_mmap/src/version.h | 2 +- plugins/DbChecker/src/selectdb.cpp | 25 +++++++++++++++++++++---- plugins/DbChecker/src/version.h | 16 ++++++++-------- 6 files changed, 55 insertions(+), 29 deletions(-) diff --git a/plugins/Db3x_mmap/src/dbintf.cpp b/plugins/Db3x_mmap/src/dbintf.cpp index 888d47e1d3..0e2187e993 100644 --- a/plugins/Db3x_mmap/src/dbintf.cpp +++ b/plugins/Db3x_mmap/src/dbintf.cpp @@ -43,10 +43,11 @@ static int stringCompare2(const char *p1, const char *p2) return strcmp(p1, p2); } -CDb3Mmap::CDb3Mmap(const TCHAR *tszFileName, bool bReadOnly) : +CDb3Mmap::CDb3Mmap(const TCHAR *tszFileName, int iMode) : m_hDbFile(INVALID_HANDLE_VALUE), m_safetyMode(true), - m_bReadOnly(bReadOnly), + m_bReadOnly((iMode & DBMODE_READONLY) != 0), + m_bShared((iMode & DBMODE_SHARED) != 0), m_dwMaxContactId(1), m_lMods(50, ModCompare), m_lOfs(50, OfsCompare), @@ -79,7 +80,7 @@ CDb3Mmap::~CDb3Mmap() } DestroyServiceFunction(hService); - UnhookEvent(hHook); + UnhookEvent(hHook); if (m_crypto) m_crypto->destroy(); @@ -93,7 +94,9 @@ CDb3Mmap::~CDb3Mmap() SetFilePointer(m_hDbFile, 0, NULL, FILE_BEGIN); WriteFile(m_hDbFile, &dbSignatureIM, 1, &bytesWritten, NULL); } - CloseHandle(m_hDbFile); + + if (m_hDbFile != INVALID_HANDLE_VALUE) + CloseHandle(m_hDbFile); DestroyHookableEvent(hContactDeletedEvent); DestroyHookableEvent(hContactAddedEvent); @@ -118,13 +121,16 @@ static TCHAR szMsgConvert[] = int CDb3Mmap::Load(bool bSkipInit) { log0("DB logging running"); - - DWORD dummy = 0; + + DWORD dummy = 0, dwMode = FILE_SHARE_READ; + if (m_bShared) + dwMode |= FILE_SHARE_WRITE; if (m_bReadOnly) - m_hDbFile = CreateFile(m_tszProfileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + m_hDbFile = CreateFile(m_tszProfileName, GENERIC_READ, dwMode, NULL, OPEN_EXISTING, 0, NULL); else - m_hDbFile = CreateFile(m_tszProfileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); - if ( m_hDbFile == INVALID_HANDLE_VALUE ) + m_hDbFile = CreateFile(m_tszProfileName, GENERIC_READ | GENERIC_WRITE, dwMode, NULL, OPEN_ALWAYS, 0, NULL); + + if (m_hDbFile == INVALID_HANDLE_VALUE) return EGROKPRF_CANTREAD; if (!ReadFile(m_hDbFile, &m_dbHeader, sizeof(m_dbHeader), &dummy, NULL)) { diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h index bc9bd220da..9582c928bb 100644 --- a/plugins/Db3x_mmap/src/dbintf.h +++ b/plugins/Db3x_mmap/src/dbintf.h @@ -44,6 +44,9 @@ DBHeader \--> ... */ +#define DBMODE_SHARED 0x0001 +#define DBMODE_READONLY 0x0002 + #define DB_OLD_VERSION 0x00000700u #define DB_094_VERSION 0x00000701u #define DB_095_VERSION 0x00000800u @@ -174,7 +177,7 @@ struct ConvertedContact struct CDb3Mmap : public MIDatabase, public MIDatabaseChecker, public MZeroedObject { - CDb3Mmap(const TCHAR *tszFileName, bool bReadOnly); + CDb3Mmap(const TCHAR *tszFileName, int mode); ~CDb3Mmap(); int Load(bool bSkipInit); @@ -275,7 +278,7 @@ protected: HANDLE m_hDbFile; DBHeader m_dbHeader; DWORD m_ChunkSize; - bool m_safetyMode, m_bReadOnly, m_bEncrypted, m_bUsesPassword; + bool m_safetyMode, m_bReadOnly, m_bShared, m_bEncrypted, m_bUsesPassword; //////////////////////////////////////////////////////////////////////////// // database stuff diff --git a/plugins/Db3x_mmap/src/init.cpp b/plugins/Db3x_mmap/src/init.cpp index d283f944cb..928ec0739f 100644 --- a/plugins/Db3x_mmap/src/init.cpp +++ b/plugins/Db3x_mmap/src/init.cpp @@ -49,7 +49,7 @@ LIST g_Dbs(1, HandleKeySortT); // returns 0 if the profile is created, EMKPRF* static int makeDatabase(const TCHAR *profile) { - std::auto_ptr db(new CDb3Mmap(profile, false)); + std::auto_ptr db(new CDb3Mmap(profile, 0)); if (db->Create() != ERROR_SUCCESS) return EMKPRF_CREATEFAILED; @@ -59,7 +59,7 @@ static int makeDatabase(const TCHAR *profile) // returns 0 if the given profile has a valid header static int grokHeader(const TCHAR *profile) { - std::auto_ptr db(new CDb3Mmap(profile, true)); + std::auto_ptr db(new CDb3Mmap(profile, DBMODE_SHARED | DBMODE_READONLY)); if (db->Load(true) != ERROR_SUCCESS) return EGROKPRF_CANTREAD; @@ -72,7 +72,7 @@ static MIDatabase* LoadDatabase(const TCHAR *profile, BOOL bReadOnly) // set the memory, lists & UTF8 manager mir_getLP(&pluginInfo); - std::auto_ptr db(new CDb3Mmap(profile, bReadOnly != 0)); + std::auto_ptr db(new CDb3Mmap(profile, (bReadOnly) ? DBMODE_READONLY : 0)); if (db->Load(false) != ERROR_SUCCESS) return NULL; @@ -89,9 +89,9 @@ static int UnloadDatabase(MIDatabase *db) MIDatabaseChecker* CheckDb(const TCHAR *profile, int *error) { - std::auto_ptr db(new CDb3Mmap(profile, true)); + std::auto_ptr db(new CDb3Mmap(profile, DBMODE_READONLY)); if (db->Load(true) != ERROR_SUCCESS) { - *error = EGROKPRF_CANTREAD; + *error = ERROR_ACCESS_DENIED; return NULL; } diff --git a/plugins/Db3x_mmap/src/version.h b/plugins/Db3x_mmap/src/version.h index 7e85a65adc..2f1eb214a5 100644 --- a/plugins/Db3x_mmap/src/version.h +++ b/plugins/Db3x_mmap/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 95 #define __RELEASE_NUM 0 -#define __BUILD_NUM 3 +#define __BUILD_NUM 4 #include diff --git a/plugins/DbChecker/src/selectdb.cpp b/plugins/DbChecker/src/selectdb.cpp index a92d72febc..32f2370077 100644 --- a/plugins/DbChecker/src/selectdb.cpp +++ b/plugins/DbChecker/src/selectdb.cpp @@ -18,6 +18,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "dbchecker.h" +static bool CheckBroken(const TCHAR *ptszFullPath) +{ + DATABASELINK *dblink = FindDatabasePlugin(ptszFullPath); + if (dblink == NULL || dblink->CheckDB == NULL) + return true; + + int error = 0; + MIDatabaseChecker *dbChecker = dblink->CheckDB(ptszFullPath, &error); + if (dbChecker == NULL) + return true; + + dbChecker->Destroy(); + return false; +} + void OpenDatabase(HWND hdlg, INT iNextPage) { TCHAR tszMsg[1024]; @@ -43,7 +58,8 @@ LBL_Error: int error = 0; opts.dbChecker = dblink->CheckDB(opts.filename, &error); if (opts.dbChecker == NULL) { - opts.error = error; + if ((opts.error = GetLastError()) == 0) + opts.error = error; PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_OPENERROR, (LPARAM)OpenErrorDlgProc); return; } @@ -86,10 +102,11 @@ static int AddDatabaseToList(HWND hwndList, const TCHAR* filename, TCHAR* dir) if ( _tstat(filename, &st) == -1) return -1; - int broken = 0; DWORD totalSize = st.st_size; DWORD wasted = 0; + bool isBroken = CheckBroken(filename); + const TCHAR *pName = _tcsrchr(filename, '\\'); if (pName == NULL) pName = (LPTSTR)filename; @@ -108,7 +125,7 @@ static int AddDatabaseToList(HWND hwndList, const TCHAR* filename, TCHAR* dir) lvi.iSubItem = 0; lvi.lParam = (LPARAM)_tcsdup(filename); lvi.pszText = szName; - if (broken) + if (isBroken) lvi.iImage = 3; else if (wasted < 1024*128) lvi.iImage = 0; @@ -121,7 +138,7 @@ static int AddDatabaseToList(HWND hwndList, const TCHAR* filename, TCHAR* dir) TCHAR szSize[20]; mir_sntprintf(szSize, SIZEOF(szSize), _T("%.2lf MB"), totalSize / 1048576.0); ListView_SetItemText(hwndList, iNewItem, 1, szSize); - if (!broken) { + if (!isBroken) { mir_sntprintf(szSize, SIZEOF(szSize), _T("%.2lf MB"), wasted / 1048576.0); ListView_SetItemText(hwndList, iNewItem, 2, szSize); } diff --git a/plugins/DbChecker/src/version.h b/plugins/DbChecker/src/version.h index 5282ad490a..911e6fc2fa 100644 --- a/plugins/DbChecker/src/version.h +++ b/plugins/DbChecker/src/version.h @@ -1,14 +1,14 @@ -#define __MAJOR_VERSION 0 -#define __MINOR_VERSION 11 -#define __RELEASE_NUM 0 -#define __BUILD_NUM 1 +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 95 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 2 #include #define __PLUGIN_NAME "Database checker" #define __FILENAME "DbChecker.dll" -#define __DESCRIPTION "Miranda NG Database Checker." -#define __AUTHOR "George Hazan" +#define __DESCRIPTION "Miranda NG Database Checker." +#define __AUTHOR "George Hazan" #define __AUTHOREMAIL "ghazan@miranda-ng.org" -#define __AUTHORWEB "http://miranda-ng.org/p/DbChecker/" -#define __COPYRIGHT "© 2012 George Hazan" +#define __AUTHORWEB "http://miranda-ng.org/p/DbChecker/" +#define __COPYRIGHT "© 2012-14 George Hazan" -- cgit v1.2.3