Fix repair to convert charset utf8 utf8mb4

This commit is contained in:
Laurent Destailleur 2024-09-05 11:49:33 +02:00
parent 9ea29c01a6
commit 3d3527d466
7 changed files with 149 additions and 18 deletions

View File

@ -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)) {

View File

@ -592,9 +592,11 @@ function pHeader($subtitle, $next, $action = 'set', $param = '', $forcejqueryurl
print DOL_VERSION;
print '</div><br>';
print '<span class="titre">'.$langs->trans("DolibarrSetup");
print '<span class="titre">';
if ($subtitle) {
print ' - '.$subtitle;
print $subtitle;
} else {
print $langs->trans("DolibarrSetup");
}
print '</span>'."\n";

View File

@ -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 '<h3>'.$langs->trans("Repair").'</h3>';
print '<div class="warning" style="padding-top: 10px">';
print $langs->trans("SetAtLeastOneOptionAsUrlParameter");
print '</div>';
@ -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 '<!-- '.$sql.' -->';
print '<tr><td colspan="2">'.$sql.'</td></tr>';
$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 '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' <span class="opacitymedium">(Skipped)</span></td></tr>';
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 '<tr><td colspan="2">';
$sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname;
print $sqltmp;
if ($force_utf8_on_tables == 'confirmed') {
$resqltmp = $db->query($sqltmp);
} else {
print ' - <span class="opacitymedium">Disabled</span>';
}
print '</td></tr>';
$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 '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' (Skipped)</td></tr>';
print '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' <span class="opacitymedium">(Skipped)</span></td></tr>';
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) ? '<span class="opacitymedium">(OK)</span>' : '<span class="error" title="'.dol_escape_htmltag($db->lasterror).'">(KO)</span>');
} else {
print ' - Disabled';
print ' - <span class="opacitymedium">Disabled</span>';
}
print '</td></tr>';
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."<br>\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 '<tr><td colspan="2">';
print $line;
print ' - Done '.($resqltmp ? '<span class="opacitymedium">(OK)</span>' : '<span class="error" title="'.dol_escape_htmltag($db->lasterror).'">(KO)</span>');
print '</td></tr>';
break;
}
}
fclose($handle);
}
flush();
ob_flush();
}
// Enable foreign key checking
if ($force_utf8_on_tables == 'confirmed') {
$sql = 'SET FOREIGN_KEY_CHECKS=1';
print '<!-- '.$sql.' -->';
print '<tr><td colspan="2">'.$sql.'</td></tr>';
$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 '<!-- '.$sql.' -->';
print '<tr><td colspan="2">'.$sql.'</td></tr>';
$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 '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' <span class="opacitymedium">(Skipped)</span></td></tr>';
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 '<tr><td colspan="2">';
$sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname;
print $sqltmp;
if ($force_utf8mb4_on_tables == 'confirmed') {
$resqltmp = $db->query($sqltmp);
} else {
print ' - <span class="opacitymedium">Disabled</span>';
}
print '</td></tr>';
$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 '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' (Skipped)</td></tr>';
print '<tr><td colspan="2">'.$table[0].' is a '.$table[1].' <span class="opacitymedium">(Skipped)</span></td></tr>';
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) ? '<span class="opacitymedium">(OK)</span>' : '<span class="error" title="'.dol_escape_htmltag($db->lasterror).'">(KO)</span>');
} else {
print ' - Disabled';
print ' - <span class="opacitymedium">Disabled</span>';
}
print '</td></tr>';
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."<br>\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 '<tr><td colspan="2">';
print $line;
print ' - Done '.($resqltmp ? '<span class="opacitymedium">(OK)</span>' : '<span class="error" title="'.dol_escape_htmltag($db->lasterror).'">(KO)</span>');
print '</td></tr>';
break;
}
}
fclose($handle);
}
flush();
ob_flush();
}
// Enable foreign key checking
if ($force_utf8mb4_on_tables == 'confirmed') {
$sql = 'SET FOREIGN_KEY_CHECKS=1';
print '<!-- '.$sql.' -->';
print '<tr><td colspan="2">'.$sql.'</td></tr>';
$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) ? '<span class="opacitymedium">(OK)</span>' : '<span class="error" title="'.dol_escape_htmltag($db->lasterror).'">(KO)</span>');
} else {
print ' - Disabled';
print ' - <span class="opacitymedium">Disabled</span>';
}
print '</td></tr>';
}

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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 '<br>';
// Test if we can run a first install process