From 6320879fe1ac2605c82a11c5911e9a3728bdc72a Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 10 Jul 2020 17:56:42 +0200 Subject: [PATCH] :sparkles: Add a cleanup file to the database integrity report. Use it for fast database cleanup (removal of all broken entries) when you don't want to try recovering inconsistent records. Note that you may need multiple report to eliminate all the inconsistencies. --- .../db_analyzer.class.inc.php | 21 +++++++++++++++---- datamodels/2.x/combodo-db-tools/dbtools.php | 14 +++++++++++++ .../de.dict.combodo-db-tools.php | 2 +- .../en.dict.combodo-db-tools.php | 2 +- .../es_cr.dict.combodo-db-tools.php | 2 +- .../fr.dict.combodo-db-tools.php | 2 +- .../nl.dict.combodo-db-tools.php | 2 +- .../ru.dict.combodo-db-tools.php | 2 +- .../zh_cn.dict.combodo-db-tools.php | 2 +- 9 files changed, 38 insertions(+), 11 deletions(-) diff --git a/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php b/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php index d59ee7e7d5..29772994ea 100644 --- a/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php +++ b/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php @@ -57,6 +57,7 @@ class DatabaseAnalyzer if (!empty($sFixItRequest)) { $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = array($sFixItRequest); + $aErrorsAndFixes[$sClass][$sErrorDesc]['cleanup'] = array($sFixItRequest); } } else @@ -376,8 +377,18 @@ SQL; { $aFixIt = array(); $aFixIt[] = "-- Remove inconsistant entries:"; - $sIds = implode(', ', array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values'])); - $aFixIt[] = "DELETE `$sTable` FROM `$sTable` WHERE `$sTable`.`$sExtKeyField` IN ($sIds)"; + $iOffset = 0; + $iStep = 100; + do + { + $aIds = array_slice(array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']), $iOffset, $iStep); + $sIds = implode(', ', $aIds); + $sDelete = "DELETE `$sTable` FROM `$sTable` WHERE `$sTable`.`$sExtKeyField` IN ($sIds)"; + $aFixIt[] = $sDelete; + $aErrorsAndFixes[$sClass][$sErrorDesc]['cleanup'][] = $sDelete; + $iOffset += $iStep; + } + while (count($aIds) == $iStep); $aFixIt[] = ""; $aFixIt[] = "-- Or fix inconsistant values: Replace XXX with the appropriate value"; foreach (array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']) as $sKey) @@ -483,13 +494,15 @@ SQL; */ private function CheckUsers(&$aErrorsAndFixes) { - $sUserTable = MetaModel::DBGetTable('User'); + $sClass = 'User'; + $sUserTable = MetaModel::DBGetTable($sClass); $sLinkTable = MetaModel::DBGetTable('URP_UserProfile'); $sSelect = "SELECT DISTINCT u.id AS id, u.`login` AS value"; $sFilter = "FROM `$sUserTable` AS u LEFT JOIN `$sLinkTable` AS l ON l.userid = u.id WHERE l.id IS NULL"; $sSelWrongRecs = "$sSelect $sFilter"; $sFixit = "-- Remove the corresponding user(s)"; - $this->ExecQuery($sSelWrongRecs, $sFixit, Dict::S('DBAnalyzer-Integrity-UsersWithoutProfile'), 'User', $aErrorsAndFixes); + $sErrorDesc = Dict::S('DBAnalyzer-Integrity-UsersWithoutProfile'); + $this->ExecQuery($sSelWrongRecs, $sFixit, $sErrorDesc, $sClass, $aErrorsAndFixes); } diff --git a/datamodels/2.x/combodo-db-tools/dbtools.php b/datamodels/2.x/combodo-db-tools/dbtools.php index 72eaad23e8..9a80d2f555 100644 --- a/datamodels/2.x/combodo-db-tools/dbtools.php +++ b/datamodels/2.x/combodo-db-tools/dbtools.php @@ -201,8 +201,10 @@ function DisplayInconsistenciesReport($aResults) { $sDBToolsFolder = str_replace("\\", '/', APPROOT.'log/'); $sReportFile = 'dbtools-report-'.date('Y-m-d-H-i-s'); + $sCleanupFile = 'dbtools-cleanup-'.date('Y-m-d-H-i-s'); $fReport = fopen($sDBToolsFolder.$sReportFile.'.txt', 'w'); + $fCleanUp = fopen($sDBToolsFolder.$sCleanupFile.'.txt', 'w'); fwrite($fReport, 'Database Maintenance tools: '.date('Y-m-d H:i:s')."\r\n"); foreach($aResults as $sClass => $aErrorList) { @@ -228,6 +230,15 @@ function DisplayInconsistenciesReport($aResults) fwrite($fReport, "\r\n"); } + if (isset($aError['cleanup'])) + { + $aQueries = $aError['cleanup']; + foreach($aQueries as $sQuery) + { + fwrite($fCleanUp, "$sQuery;\r\n"); + } + } + $sQueryResult = ''; $aIdList = array(); foreach($aError['res'] as $aRes) @@ -249,12 +260,15 @@ function DisplayInconsistenciesReport($aResults) } } fclose($fReport); + fclose($fCleanUp); $oArchive = new ZipArchive(); $oArchive->open($sDBToolsFolder.$sReportFile.'.zip', ZipArchive::CREATE); $oArchive->addFile($sDBToolsFolder.$sReportFile.'.txt', $sReportFile.'.txt'); + $oArchive->addFile($sDBToolsFolder.$sCleanupFile.'.txt', $sCleanupFile.'.txt'); $oArchive->close(); unlink($sDBToolsFolder.$sReportFile.'.txt'); + unlink($sDBToolsFolder.$sCleanupFile.'.txt'); $sReportFile = $sDBToolsFolder.$sReportFile.'.zip'; diff --git a/datamodels/2.x/combodo-db-tools/de.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/de.dict.combodo-db-tools.php index e1f466b74b..08ccfcdc60 100644 --- a/datamodels/2.x/combodo-db-tools/de.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/de.dict.combodo-db-tools.php @@ -22,7 +22,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'DB Tools', 'DBTools:Class' => 'Klasse', - 'DBTools:Title' => 'Datenbank-Pflege-Tools', + 'DBTools:Title' => 'Datenbank-Pflege-Tools~~', 'DBTools:ErrorsFound' => 'Fehler gefunden', 'DBTools:Error' => 'Fehler', 'DBTools:Count' => 'Anzahl', diff --git a/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php index 4ea35ab197..84add3c256 100644 --- a/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php @@ -26,7 +26,7 @@ Dict::Add('EN US', 'English', 'English', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'Database integrity', 'DBTools:Class' => 'Class', - 'DBTools:Title' => 'Database Maintenance Tools', + 'DBTools:Title' => 'Database integrity check', 'DBTools:ErrorsFound' => 'Errors Found', 'DBTools:Error' => 'Error', 'DBTools:Count' => 'Count', diff --git a/datamodels/2.x/combodo-db-tools/es_cr.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/es_cr.dict.combodo-db-tools.php index 50c5977de1..46be627242 100644 --- a/datamodels/2.x/combodo-db-tools/es_cr.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/es_cr.dict.combodo-db-tools.php @@ -25,7 +25,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'Herramientas de bases de datos', 'DBTools:Class' => 'Clase', - 'DBTools:Title' => 'Herramientas de mantenimiento de base de datos', + 'DBTools:Title' => 'Herramientas de mantenimiento de base de datos~~', 'DBTools:ErrorsFound' => 'Errores encontrados', 'DBTools:Error' => 'Error', 'DBTools:Count' => 'Cantidad', diff --git a/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php index bc683642cd..5f3c31859d 100644 --- a/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php @@ -21,7 +21,7 @@ Dict::Add('FR FR', 'French', 'Français', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'Intégrité base de données', 'DBTools:Class' => 'Classe', - 'DBTools:Title' => 'Outils maintenance base de données', + 'DBTools:Title' => 'Contrôle de l\'intégrité de la base de données', 'DBTools:ErrorsFound' => 'Erreurs trouvées', 'DBTools:Error' => 'Erreur', 'DBTools:Count' => 'Nombre', diff --git a/datamodels/2.x/combodo-db-tools/nl.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/nl.dict.combodo-db-tools.php index d2b8e36045..6dda4a00d9 100644 --- a/datamodels/2.x/combodo-db-tools/nl.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/nl.dict.combodo-db-tools.php @@ -27,7 +27,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'Databasetools', 'DBTools:Class' => 'Klasse', - 'DBTools:Title' => 'Onderhoudstools voor de database', + 'DBTools:Title' => 'Onderhoudstools voor de database~~', 'DBTools:ErrorsFound' => 'Fouten gevonden', 'DBTools:Error' => 'Fout', 'DBTools:Count' => 'Aantal', diff --git a/datamodels/2.x/combodo-db-tools/ru.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/ru.dict.combodo-db-tools.php index fc92a62cf5..0ad4ac74f5 100644 --- a/datamodels/2.x/combodo-db-tools/ru.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/ru.dict.combodo-db-tools.php @@ -12,7 +12,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'Инструменты БД', 'DBTools:Class' => 'Класс', - 'DBTools:Title' => 'Инструменты обслуживания базы данных', + 'DBTools:Title' => 'Инструменты обслуживания базы данных~~', 'DBTools:ErrorsFound' => 'Найденные ошибки', 'DBTools:Error' => 'Ошибка', 'DBTools:Count' => 'Количество', diff --git a/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php index 0fab185204..6eecf149a3 100644 --- a/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php @@ -25,7 +25,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dictionary entries go here 'Menu:DBToolsMenu' => 'DB 工具', 'DBTools:Class' => 'Class~~', - 'DBTools:Title' => '数据库维护工具', + 'DBTools:Title' => '数据库维护工具~~', 'DBTools:ErrorsFound' => '发现错误', 'DBTools:Error' => '错误', 'DBTools:Count' => '个数',