diff options
author | George Hazan <george.hazan@gmail.com> | 2014-03-21 17:47:28 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2014-03-21 17:47:28 +0000 |
commit | 00a8ec3be1ebc0367e6725f93833bd53323ffae5 (patch) | |
tree | 1eebc55aaa1ae5374afe791a082056bfa999141f | |
parent | 099decfc4c419bb0b12a2b1c4c285c0ef1568430 (diff) |
fix for running dbchecker over the locked profile
git-svn-id: http://svn.miranda-ng.org/main/trunk@8673 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r-- | plugins/Db3x_mmap/src/dbintf.cpp | 24 | ||||
-rw-r--r-- | plugins/Db3x_mmap/src/dbintf.h | 7 | ||||
-rw-r--r-- | plugins/Db3x_mmap/src/init.cpp | 10 | ||||
-rw-r--r-- | plugins/Db3x_mmap/src/version.h | 2 | ||||
-rw-r--r-- | plugins/DbChecker/src/selectdb.cpp | 25 | ||||
-rw-r--r-- | 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<CDb3Mmap> g_Dbs(1, HandleKeySortT); // returns 0 if the profile is created, EMKPRF*
static int makeDatabase(const TCHAR *profile)
{
- std::auto_ptr<CDb3Mmap> db(new CDb3Mmap(profile, false));
+ std::auto_ptr<CDb3Mmap> 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<CDb3Mmap> db(new CDb3Mmap(profile, true));
+ std::auto_ptr<CDb3Mmap> 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<CDb3Mmap> db(new CDb3Mmap(profile, bReadOnly != 0));
+ std::auto_ptr<CDb3Mmap> 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<CDb3Mmap> db(new CDb3Mmap(profile, true));
+ std::auto_ptr<CDb3Mmap> 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 <stdver.h>
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 <stdver.h>
#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"
|