From b35b89591595a55d3b4813844f6dbf1ab9396d57 Mon Sep 17 00:00:00 2001
From: b_b <bruno@eliaz.fr>
Date: Fri, 6 May 2022 14:45:13 +0200
Subject: [PATCH] =?UTF-8?q?fix=20#4277=20Permettre=20de=20sp=C3=A9cifier?=
 =?UTF-8?q?=20l'engine=20mysql=20=C3=A0=20utiliser=20+=20adaptation=20de?=
 =?UTF-8?q?=20spip=5Fmysql=5Frepair()=20=C3=A0=20innodb?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 CHANGELOG.md           |  2 ++
 ecrire/base/repair.php |  2 +-
 ecrire/req/mysql.php   | 18 ++++++++++++++++--
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8da2ffd88a..0b45cfe750 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,8 @@
 
 ### Fixed
 
+- #4277 Adaptation de `spip_mysql_repair()` à innodb
+- #4277 Permettre de spécifier l'engine mysql à utiliser
 - #5095 Ne pas casser une meta sérialisée quand un utilisateur saisit un emoji dans un formulaire de configuration
 - #5152 Éviter des warning si `spip_log()` est appelé avant l’initialisation (dans mes_options)
 - #5162 Erreur d’exécution sur `vider_date()` qui doit renvoyer une chaine
diff --git a/ecrire/base/repair.php b/ecrire/base/repair.php
index 5962c4b351..bd416bb41a 100644
--- a/ecrire/base/repair.php
+++ b/ecrire/base/repair.php
@@ -63,7 +63,7 @@ function base_repair_dist($titre = '', $reprise = '') {
  **/
 function admin_repair_tables() {
 
-	$repair = sql_repair('repair', null, 'continue');
+	$repair = sql_serveur('repair', '', true);
 
 	// recreer les tables manquantes eventuelles
 	include_spip('base/create');
diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php
index 335c4dc789..07f2b34fa7 100644
--- a/ecrire/req/mysql.php
+++ b/ecrire/req/mysql.php
@@ -27,6 +27,10 @@ if (!defined('_MYSQL_NOPLANES')) {
 	define('_MYSQL_NOPLANES', true);
 }
 
+if (!defined('_MYSQL_ENGINE')) {
+	define('_MYSQL_ENGINE', 'MyISAM');
+}
+
 /**
  * Crée la première connexion à un serveur MySQL via MySQLi
  *
@@ -728,7 +732,7 @@ function spip_mysql_create(
 	}
 	$temporary = $temporary ? 'TEMPORARY' : '';
 	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
-		. ' ENGINE=MyISAM'
+		. ' ENGINE=' . _MYSQL_ENGINE
 		. ($character_set ? " DEFAULT $character_set" : '')
 		. "\n";
 
@@ -881,7 +885,17 @@ function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
  *     - true si la requête a réussie, false sinon
  */
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
-	return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
+	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
+	$engine = $table_status['Engine'];
+	if ($engine == 'InnoDB') {
+		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
+			return [' OK '];
+		}
+	} elseif ($engine == 'MyISAM') {
+		return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
+	} else {
+		spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
+	}
 }
 
 /**
-- 
GitLab