From 3d3527d46665cdd5d35754b85a7e8ddce05f2169 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 5 Sep 2024 11:49:33 +0200 Subject: [PATCH] Fix repair to convert charset utf8 utf8mb4 --- htdocs/install/fileconf.php | 2 +- htdocs/install/inc.php | 6 +- htdocs/install/repair.php | 151 +++++++++++++++++++++++++++++++++--- htdocs/install/step1.php | 2 +- htdocs/install/step2.php | 2 +- htdocs/install/step4.php | 2 +- htdocs/install/step5.php | 2 +- 7 files changed, 149 insertions(+), 18 deletions(-) diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index 09aa559393f..17c054182ed 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -97,7 +97,7 @@ if (@file_exists($forcedfile)) { session_start(); // To be able to keep info into session (used for not losing pass during navigation. pass must not transit through parameters) -pHeader($langs->trans("ConfigurationFile"), "step1", "set", "", (empty($force_dolibarr_js_JQUERY) ? '' : $force_dolibarr_js_JQUERY.'/'), 'main-inside-bis'); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("ConfigurationFile"), "step1", "set", "", (empty($force_dolibarr_js_JQUERY) ? '' : $force_dolibarr_js_JQUERY.'/'), 'main-inside-bis'); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php index 46111f46912..bc8ffafb9d2 100644 --- a/htdocs/install/inc.php +++ b/htdocs/install/inc.php @@ -592,9 +592,11 @@ function pHeader($subtitle, $next, $action = 'set', $param = '', $forcejqueryurl print DOL_VERSION; print '
'; - print ''.$langs->trans("DolibarrSetup"); + print ''; if ($subtitle) { - print ' - '.$subtitle; + print $subtitle; + } else { + print $langs->trans("DolibarrSetup"); } print ''."\n"; diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php index 845127210ca..16079946b6a 100644 --- a/htdocs/install/repair.php +++ b/htdocs/install/repair.php @@ -73,13 +73,11 @@ if (!is_object($conf)) { * View */ -pHeader('', "upgrade2", GETPOST('action', 'aZ09')); +pHeader($langs->trans("Repair"), "upgrade2", GETPOST('action', 'aZ09')); // Action to launch the repair script $actiondone = 1; -print '

'.$langs->trans("Repair").'

'; - print '
'; print $langs->trans("SetAtLeastOneOptionAsUrlParameter"); print '
'; @@ -1298,16 +1296,54 @@ if ($ok && GETPOST('force_utf8_on_tables', 'alpha')) { if ($force_utf8_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=0'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } + $foreignkeystorestore = array(); + + // First loop to delete foreign keys + foreach ($listoftables as $table) { + // do not convert llx_const if mysql encrypt/decrypt is used + if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { + continue; + } + if ($table[1] == 'VIEW') { + print ''.$table[0].' is a '.$table[1].' (Skipped)'; + continue; + } + + // Special case of tables with foreign key on varchar fields + $arrayofforeignkey = array( + 'llx_accounting_account' => 'fk_accounting_account_fk_pcg_version', + 'llx_accounting_system' => 'fk_accounting_account_fk_pcg_version', + 'llx_c_type_contact' => 'fk_societe_commerciaux_fk_c_type_contact_code', + 'llx_societe_commerciaux' => 'fk_societe_commerciaux_fk_c_type_contact_code' + ); + + foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) { + if ($table[0] == $tmptable) { + print ''; + $sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname; + print $sqltmp; + if ($force_utf8_on_tables == 'confirmed') { + $resqltmp = $db->query($sqltmp); + } else { + print ' - Disabled'; + } + print ''; + $foreignkeystorestore[$tmptable] = $foreignkeyname; + } + } + } + foreach ($listoftables as $table) { // do not convert llx_const if mysql encrypt/decrypt is used if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { continue; } if ($table[1] == 'VIEW') { - print ''.$table[0].' is a '.$table[1].' (Skipped)'; + print ''.$table[0].' is a '.$table[1].' (Skipped)'; continue; } @@ -1324,17 +1360,45 @@ if ($ok && GETPOST('force_utf8_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; + flush(); + ob_flush(); + } + + // Restore dropped foreign keys + foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) { + $stringtofindinline = 'ALTER TABLE .* ADD CONSTRAINT '.$foreignkeyname; + $fileforkeys = DOL_DOCUMENT_ROOT.'/install/mysql/tables/'.$tmptable.'.key.sql'; + //print 'Search in '.$fileforkeys.' to get '.$stringtofindinline."
\n"; + + $handle = fopen($fileforkeys, 'r'); + if ($handle) { + while (($line = fgets($handle)) !== false) { + // Process the line read. + if (preg_match('/^'.$stringtofindinline.'/i', $line)) { + $resqltmp = $db->query($line); + print ''; + print $line; + print ' - Done '.($resqltmp ? '(OK)' : '(KO)'); + print ''; + break; + } + } + fclose($handle); + } + flush(); + ob_flush(); } // Enable foreign key checking if ($force_utf8_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=1'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } } else { @@ -1349,22 +1413,61 @@ if ($ok && GETPOST('force_utf8mb4_on_tables', 'alpha')) { if ($db->type == "mysql" || $db->type == "mysqli") { $force_utf8mb4_on_tables = GETPOST('force_utf8mb4_on_tables', 'alpha'); + $listoftables = $db->DDLListTablesFull($db->database_name); // Disable foreign key checking for avoid errors if ($force_utf8mb4_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=0'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } + $foreignkeystorestore = array(); + + // First loop to delete foreign keys + foreach ($listoftables as $table) { + // do not convert llx_const if mysql encrypt/decrypt is used + if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { + continue; + } + if ($table[1] == 'VIEW') { + print ''.$table[0].' is a '.$table[1].' (Skipped)'; + continue; + } + + // Special case of tables with foreign key on varchar fields + $arrayofforeignkey = array( + 'llx_accounting_account' => 'fk_accounting_account_fk_pcg_version', + 'llx_accounting_system' => 'fk_accounting_account_fk_pcg_version', + 'llx_c_type_contact' => 'fk_societe_commerciaux_fk_c_type_contact_code', + 'llx_societe_commerciaux' => 'fk_societe_commerciaux_fk_c_type_contact_code' + ); + + foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) { + if ($table[0] == $tmptable) { + print ''; + $sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname; + print $sqltmp; + if ($force_utf8mb4_on_tables == 'confirmed') { + $resqltmp = $db->query($sqltmp); + } else { + print ' - Disabled'; + } + print ''; + $foreignkeystorestore[$tmptable] = $foreignkeyname; + } + } + } + foreach ($listoftables as $table) { // do not convert llx_const if mysql encrypt/decrypt is used if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { continue; } if ($table[1] == 'VIEW') { - print ''.$table[0].' is a '.$table[1].' (Skipped)'; + print ''.$table[0].' is a '.$table[1].' (Skipped)'; continue; } @@ -1381,19 +1484,45 @@ if ($ok && GETPOST('force_utf8mb4_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; flush(); ob_flush(); } + // Restore dropped foreign keys + foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) { + $stringtofindinline = 'ALTER TABLE .* ADD CONSTRAINT '.$foreignkeyname; + $fileforkeys = DOL_DOCUMENT_ROOT.'/install/mysql/tables/'.$tmptable.'.key.sql'; + //print 'Search in '.$fileforkeys.' to get '.$stringtofindinline."
\n"; + + $handle = fopen($fileforkeys, 'r'); + if ($handle) { + while (($line = fgets($handle)) !== false) { + // Process the line read. + if (preg_match('/^'.$stringtofindinline.'/i', $line)) { + $resqltmp = $db->query($line); + print ''; + print $line; + print ' - Done '.($resqltmp ? '(OK)' : '(KO)'); + print ''; + break; + } + } + fclose($handle); + } + flush(); + ob_flush(); + } + // Enable foreign key checking if ($force_utf8mb4_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=1'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } } else { @@ -1439,9 +1568,9 @@ if ($ok && GETPOST('force_collation_from_conf_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; } diff --git a/htdocs/install/step1.php b/htdocs/install/step1.php index 50d807803e5..615cd9cd142 100644 --- a/htdocs/install/step1.php +++ b/htdocs/install/step1.php @@ -162,7 +162,7 @@ $error = 0; dolibarr_install_syslog("--- step1: entering step1.php page"); -pHeader($langs->trans("ConfigurationFile"), "step2"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("ConfigurationFile"), "step2"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step2.php b/htdocs/install/step2.php index 76fccc5a621..78704659a3a 100644 --- a/htdocs/install/step2.php +++ b/htdocs/install/step2.php @@ -98,7 +98,7 @@ dolibarr_install_syslog("--- step2: entering step2.php page"); * View */ -pHeader($langs->trans("CreateDatabaseObjects"), "step4"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("CreateDatabaseObjects"), "step4"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step4.php b/htdocs/install/step4.php index c93f4c815e1..dee25c701c9 100644 --- a/htdocs/install/step4.php +++ b/htdocs/install/step4.php @@ -59,7 +59,7 @@ $ok = 0; * View */ -pHeader($langs->trans("AdminAccountCreation"), "step5"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("AdminAccountCreation"), "step5"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php index 29166c03f5d..4d1764cc3cf 100644 --- a/htdocs/install/step5.php +++ b/htdocs/install/step5.php @@ -126,7 +126,7 @@ if ($action == "set") { $morehtml = ''; -pHeader($langs->trans("SetupEnd"), "step5", 'set', '', '', 'main-inside main-inside-borderbottom'); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("SetupEnd"), "step5", 'set', '', '', 'main-inside main-inside-borderbottom'); print '
'; // Test if we can run a first install process