summaryrefslogtreecommitdiff
path: root/plugins/DbChecker/src/worker.cpp
diff options
context:
space:
mode:
authordartraiden <wowemuh@gmail.com>2023-01-14 01:30:59 +0300
committerdartraiden <wowemuh@gmail.com>2023-01-14 01:30:59 +0300
commitde40f3be3f08487937525c2ef096dad665dda61d (patch)
treeeb1205f8dca7c30b561a2776f9527072bd92eaf1 /plugins/DbChecker/src/worker.cpp
parentdd743899a769120ba2321230afddd6e4f1271872 (diff)
Convert sources to CR+LF
Diffstat (limited to 'plugins/DbChecker/src/worker.cpp')
-rw-r--r--plugins/DbChecker/src/worker.cpp346
1 files changed, 173 insertions, 173 deletions
diff --git a/plugins/DbChecker/src/worker.cpp b/plugins/DbChecker/src/worker.cpp
index 6be8262b5f..e5590bb127 100644
--- a/plugins/DbChecker/src/worker.cpp
+++ b/plugins/DbChecker/src/worker.cpp
@@ -1,173 +1,173 @@
-/*
-Miranda Database Tool
-Copyright (C) 2001-2005 Richard Hughes
-
-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 "stdafx.h"
-
-void ProcessingDone(void);
-
-static bool ConvertOldEvent(DBEVENTINFO &dbei)
-{
- if (dbei.flags & DBEF_UTF)
- return false;
-
- if (dbei.flags == 1) {
- dbei.flags = DBEF_UTF;
- return true;
- }
-
- int msglen = (int)mir_strlen((char *)dbei.pBlob) + 1, msglenW = 0;
- if (msglen != (int)dbei.cbBlob) {
- int count = ((dbei.cbBlob - msglen) / sizeof(wchar_t));
- wchar_t *p = (wchar_t *)&dbei.pBlob[msglen];
- for (int i = 0; i < count; i++) {
- if (p[i] == 0) {
- msglenW = i;
- break;
- }
- }
- }
-
- char *utf8str;
- if (msglenW > 0 && msglenW <= msglen)
- utf8str = mir_utf8encodeW((wchar_t *)&dbei.pBlob[msglen]);
- else
- utf8str = mir_utf8encode((char *)dbei.pBlob);
-
- if (utf8str == nullptr)
- return false;
-
- mir_free(dbei.pBlob);
-
- dbei.flags |= DBEF_UTF;
- dbei.cbBlob = (uint32_t)mir_strlen(utf8str);
- dbei.pBlob = (uint8_t*)utf8str;
- return true;
-}
-
-static bool CompareContents(const DBEVENTINFO &ev1, const DBEVENTINFO &ev2)
-{
- if (ev1.cbBlob == 0 && ev2.cbBlob == 0)
- return true;
-
- if (ev1.cbBlob == 0 && ev2.cbBlob != 0 || ev1.cbBlob != 0 && ev2.cbBlob == 0)
- return false;
-
- // both blobs should be compared
- if (ev1.pBlob == 0 && ev2.pBlob == 0)
- return false;
-
- return !memcmp(ev1.pBlob, ev2.pBlob, ev1.cbBlob);
-}
-
-void __cdecl WorkerThread(DbToolOptions *opts)
-{
- time_t ts = time(nullptr);
-
- AddToStatus(STATUS_MESSAGE, TranslateT("Database worker thread activated"));
-
- uint32_t sp = 0;
-
- if (opts->bMarkRead || opts->bCheckUtf || opts->bCheckDups) {
- int nCount = 0, nUtfCount = 0, nDups = 0;
-
- for (auto &cc : Contacts()) {
- DB::ECPTR pCursor(DB::Events(cc));
- DBEVENTINFO dboldev = {};
- while (MEVENT hEvent = pCursor.FetchNext()) {
- DB::EventInfo dbei;
- if (opts->bCheckUtf || opts->bCheckDups) // read also event's body
- dbei.cbBlob = -1;
- if (db_event_get(hEvent, &dbei))
- continue;
-
- if (opts->bMarkRead && !dbei.markedRead()) {
- db_event_markRead(cc, hEvent);
- nCount++;
- }
-
- if (opts->bCheckUtf && dbei.eventType == EVENTTYPE_MESSAGE) {
- if (ConvertOldEvent(dbei)) {
- db_event_edit(cc, hEvent, &dbei);
- nUtfCount++;
- }
- }
-
- if (opts->bCheckDups) {
- if (dbei == dboldev && CompareContents(dbei, dboldev)) {
- pCursor.DeleteEvent();
- nDups++;
- }
- else {
- mir_free(dboldev.pBlob);
- dboldev = dbei;
- if (dboldev.cbBlob) {
- dboldev.pBlob = (uint8_t *)mir_alloc(dboldev.cbBlob);
- memcpy(dboldev.pBlob, dbei.pBlob, dboldev.cbBlob);
- }
- else dboldev.pBlob = nullptr;
- }
- }
- }
- mir_free(dboldev.pBlob);
- }
-
- if (nCount)
- AddToStatus(STATUS_MESSAGE, TranslateT("%d events marked as read"), nCount);
-
- if (nUtfCount)
- AddToStatus(STATUS_MESSAGE, TranslateT("UTF-8 encoding fixed in %d events"), nUtfCount);
-
- if (nDups)
- AddToStatus(STATUS_MESSAGE, TranslateT("%d duplicate events removed"), nDups);
- }
-
- DBCHeckCallback callback;
- callback.pfnAddLogMessage = AddToStatus;
- opts->dbChecker->Start(&callback);
-
- for (int task = 0;; task++) {
- if (callback.spaceProcessed / (callback.spaceUsed / 1000 + 1) > sp) {
- sp = callback.spaceProcessed / (callback.spaceUsed / 1000 + 1);
- SetProgressBar(sp);
- }
- WaitForSingleObject(opts->hEventRun, INFINITE);
- if (WaitForSingleObject(opts->hEventAbort, 0) == WAIT_OBJECT_0) {
- AddToStatus(STATUS_FATAL, TranslateT("Processing aborted by user"));
- break;
- }
-
- int ret = opts->dbChecker->CheckDb(task);
- if (ret == ERROR_OUT_OF_PAPER) {
- opts->dbChecker->Destroy();
- opts->dbChecker = nullptr;
-
- AddToStatus(STATUS_MESSAGE, TranslateT("Elapsed time: %d sec"), time(nullptr) - ts);
- if (errorCount)
- AddToStatus(STATUS_SUCCESS, TranslateT("All tasks completed but with errors (%d)"), errorCount);
- else
- AddToStatus(STATUS_SUCCESS, TranslateT("All tasks completed successfully"));
- break;
- }
- else if (ret != ERROR_SUCCESS)
- break;
- }
-
- opts->bFinished = true;
- ProcessingDone();
-}
+/*
+Miranda Database Tool
+Copyright (C) 2001-2005 Richard Hughes
+
+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 "stdafx.h"
+
+void ProcessingDone(void);
+
+static bool ConvertOldEvent(DBEVENTINFO &dbei)
+{
+ if (dbei.flags & DBEF_UTF)
+ return false;
+
+ if (dbei.flags == 1) {
+ dbei.flags = DBEF_UTF;
+ return true;
+ }
+
+ int msglen = (int)mir_strlen((char *)dbei.pBlob) + 1, msglenW = 0;
+ if (msglen != (int)dbei.cbBlob) {
+ int count = ((dbei.cbBlob - msglen) / sizeof(wchar_t));
+ wchar_t *p = (wchar_t *)&dbei.pBlob[msglen];
+ for (int i = 0; i < count; i++) {
+ if (p[i] == 0) {
+ msglenW = i;
+ break;
+ }
+ }
+ }
+
+ char *utf8str;
+ if (msglenW > 0 && msglenW <= msglen)
+ utf8str = mir_utf8encodeW((wchar_t *)&dbei.pBlob[msglen]);
+ else
+ utf8str = mir_utf8encode((char *)dbei.pBlob);
+
+ if (utf8str == nullptr)
+ return false;
+
+ mir_free(dbei.pBlob);
+
+ dbei.flags |= DBEF_UTF;
+ dbei.cbBlob = (uint32_t)mir_strlen(utf8str);
+ dbei.pBlob = (uint8_t*)utf8str;
+ return true;
+}
+
+static bool CompareContents(const DBEVENTINFO &ev1, const DBEVENTINFO &ev2)
+{
+ if (ev1.cbBlob == 0 && ev2.cbBlob == 0)
+ return true;
+
+ if (ev1.cbBlob == 0 && ev2.cbBlob != 0 || ev1.cbBlob != 0 && ev2.cbBlob == 0)
+ return false;
+
+ // both blobs should be compared
+ if (ev1.pBlob == 0 && ev2.pBlob == 0)
+ return false;
+
+ return !memcmp(ev1.pBlob, ev2.pBlob, ev1.cbBlob);
+}
+
+void __cdecl WorkerThread(DbToolOptions *opts)
+{
+ time_t ts = time(nullptr);
+
+ AddToStatus(STATUS_MESSAGE, TranslateT("Database worker thread activated"));
+
+ uint32_t sp = 0;
+
+ if (opts->bMarkRead || opts->bCheckUtf || opts->bCheckDups) {
+ int nCount = 0, nUtfCount = 0, nDups = 0;
+
+ for (auto &cc : Contacts()) {
+ DB::ECPTR pCursor(DB::Events(cc));
+ DBEVENTINFO dboldev = {};
+ while (MEVENT hEvent = pCursor.FetchNext()) {
+ DB::EventInfo dbei;
+ if (opts->bCheckUtf || opts->bCheckDups) // read also event's body
+ dbei.cbBlob = -1;
+ if (db_event_get(hEvent, &dbei))
+ continue;
+
+ if (opts->bMarkRead && !dbei.markedRead()) {
+ db_event_markRead(cc, hEvent);
+ nCount++;
+ }
+
+ if (opts->bCheckUtf && dbei.eventType == EVENTTYPE_MESSAGE) {
+ if (ConvertOldEvent(dbei)) {
+ db_event_edit(cc, hEvent, &dbei);
+ nUtfCount++;
+ }
+ }
+
+ if (opts->bCheckDups) {
+ if (dbei == dboldev && CompareContents(dbei, dboldev)) {
+ pCursor.DeleteEvent();
+ nDups++;
+ }
+ else {
+ mir_free(dboldev.pBlob);
+ dboldev = dbei;
+ if (dboldev.cbBlob) {
+ dboldev.pBlob = (uint8_t *)mir_alloc(dboldev.cbBlob);
+ memcpy(dboldev.pBlob, dbei.pBlob, dboldev.cbBlob);
+ }
+ else dboldev.pBlob = nullptr;
+ }
+ }
+ }
+ mir_free(dboldev.pBlob);
+ }
+
+ if (nCount)
+ AddToStatus(STATUS_MESSAGE, TranslateT("%d events marked as read"), nCount);
+
+ if (nUtfCount)
+ AddToStatus(STATUS_MESSAGE, TranslateT("UTF-8 encoding fixed in %d events"), nUtfCount);
+
+ if (nDups)
+ AddToStatus(STATUS_MESSAGE, TranslateT("%d duplicate events removed"), nDups);
+ }
+
+ DBCHeckCallback callback;
+ callback.pfnAddLogMessage = AddToStatus;
+ opts->dbChecker->Start(&callback);
+
+ for (int task = 0;; task++) {
+ if (callback.spaceProcessed / (callback.spaceUsed / 1000 + 1) > sp) {
+ sp = callback.spaceProcessed / (callback.spaceUsed / 1000 + 1);
+ SetProgressBar(sp);
+ }
+ WaitForSingleObject(opts->hEventRun, INFINITE);
+ if (WaitForSingleObject(opts->hEventAbort, 0) == WAIT_OBJECT_0) {
+ AddToStatus(STATUS_FATAL, TranslateT("Processing aborted by user"));
+ break;
+ }
+
+ int ret = opts->dbChecker->CheckDb(task);
+ if (ret == ERROR_OUT_OF_PAPER) {
+ opts->dbChecker->Destroy();
+ opts->dbChecker = nullptr;
+
+ AddToStatus(STATUS_MESSAGE, TranslateT("Elapsed time: %d sec"), time(nullptr) - ts);
+ if (errorCount)
+ AddToStatus(STATUS_SUCCESS, TranslateT("All tasks completed but with errors (%d)"), errorCount);
+ else
+ AddToStatus(STATUS_SUCCESS, TranslateT("All tasks completed successfully"));
+ break;
+ }
+ else if (ret != ERROR_SUCCESS)
+ break;
+ }
+
+ opts->bFinished = true;
+ ProcessingDone();
+}