From 15f653fcae068fc5c4ee963d45f1f82dd2ffc7e2 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Fri, 10 Mar 2006 00:06:09 +0000
Subject: [PATCH] =?UTF-8?q?un=20safehtml=20inutile=20dans=20les=20forums?=
 =?UTF-8?q?=20+=20un=20code=20d'optimisation=20de=20la=20base=20de=20donn?=
 =?UTF-8?q?=C3=A9es=20qui=20semble=20marcher=20(=C3=A0=20v=C3=A9rifier=20s?=
 =?UTF-8?q?ur=20des=20bases=20de=20test=20!)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/base/optimiser.php | 371 ++++++++++++++++++++++++--------------
 ecrire/inc/filtres.php    |   2 +-
 2 files changed, 232 insertions(+), 141 deletions(-)

diff --git a/ecrire/base/optimiser.php b/ecrire/base/optimiser.php
index 56ee74f9ed..4b7dd38c77 100644
--- a/ecrire/base/optimiser.php
+++ b/ecrire/base/optimiser.php
@@ -12,7 +12,6 @@
 
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
-include_spip('inc/indexation');
 
 function optimiser_base() {
 	spip_log ("optimisation de la base");
@@ -23,25 +22,53 @@ function optimiser_base() {
 	// Rubriques
 	//
 
-	$query = "SELECT id_rubrique FROM spip_rubriques";
-	$result = spip_query($query);
-	$rubriques = '0';
-	while ($row = spip_fetch_array($result)) $rubriques .= ','.$row['id_rubrique'];
+	# les articles qui sont dans une id_rubrique inexistante
+	$query = "DELETE spip_articles FROM spip_articles AS articles
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON articles.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL
+		         AND articles.maj < $mydate";
+	spip_query($query);
 
-	if ($rubriques) {
-		$query = "DELETE FROM spip_articles WHERE id_rubrique NOT IN ($rubriques) AND maj < $mydate";
-		spip_query($query);
-		$query = "DELETE FROM spip_breves WHERE id_rubrique NOT IN ($rubriques) AND maj < $mydate";
-		spip_query($query);
-		$query = "DELETE FROM spip_forum WHERE id_rubrique NOT IN (0,$rubriques)";
-		spip_query($query);
-		$query = "DELETE FROM spip_auteurs_rubriques WHERE id_rubrique NOT IN ($rubriques)";
-		spip_query($query);
-		$query = "DELETE FROM spip_documents_rubriques WHERE id_rubrique NOT IN ($rubriques)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_rubriques WHERE id_rubrique NOT IN ($rubriques)";
-		spip_query($query);
-	}
+	# les breves qui sont dans une id_rubrique inexistante
+	$query = "DELETE spip_breves FROM spip_breves AS breves
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON breves.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL
+		         AND breves.maj < $mydate";
+	spip_query($query);
+
+	# les forums lies a une id_rubrique inexistante
+	$query = "DELETE spip_forum FROM spip_forum AS forum
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON forum.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL
+		         AND forum.id_rubrique>0";
+	spip_query($query);
+
+	# les droits d'auteurs sur une id_rubrique inexistante
+	$query = "DELETE spip_auteurs_rubriques
+		      FROM spip_auteurs_rubriques AS auteurs_rubriques
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL";
+	spip_query($query);
+
+	# les liens des documents qui sont dans une id_rubrique inexistante
+	$query = "DELETE spip_documents_rubriques
+		      FROM spip_documents_rubriques AS documents_rubriques
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON documents_rubriques.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL";
+	spip_query($query);
+
+	# les liens des mots affectes a une id_rubrique inexistante
+	$query = "DELETE spip_mots_rubriques
+		      FROM spip_mots_rubriques AS mots_rubriques
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON mots_rubriques.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL";
+	spip_query($query);
 
 
 	//
@@ -50,21 +77,37 @@ function optimiser_base() {
 
 	$query = "DELETE FROM spip_articles WHERE statut='poubelle' AND maj < $mydate";
 	spip_query($query);
-	$query = "SELECT id_article FROM spip_articles";
-	$result = spip_query($query);
-	$articles = '0';
-	while ($row = spip_fetch_array($result)) $articles .= ','.$row['id_article'];
 
-	if ($articles) {
-		$query = "DELETE FROM spip_auteurs_articles WHERE id_article NOT IN ($articles)";
-		spip_query($query);
-		$query = "DELETE FROM spip_documents_articles WHERE id_article NOT IN ($articles)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_articles WHERE id_article NOT IN ($articles)";
-		spip_query($query);
-		$query = "DELETE FROM spip_forum WHERE id_article NOT IN (0,$articles)";
-		spip_query($query);
-	}
+	# les liens d'auteurs d'articles effaces
+	$query = "DELETE spip_auteurs_articles
+		      FROM spip_auteurs_articles AS auteurs_articles
+		        LEFT JOIN spip_articles AS articles
+		          ON auteurs_articles.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL";
+	spip_query($query);
+
+	# les liens de documents d'articles effaces
+	$query = "DELETE spip_documents_articles
+		      FROM spip_documents_articles AS documents_articles
+		        LEFT JOIN spip_articles AS articles
+		          ON documents_articles.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL";
+	spip_query($query);
+
+	# les liens de mots affectes a des articles effaces
+	$query = "DELETE spip_mots_articles FROM spip_mots_articles AS mots_articles
+		        LEFT JOIN spip_articles AS articles
+		          ON mots_articles.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL";
+	spip_query($query);
+
+	# les forums lies a des articles effaces
+	$query = "DELETE spip_forum FROM spip_forum AS forum
+		        LEFT JOIN spip_articles AS articles
+		          ON forum.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL
+		         AND forum.id_article>0";
+	spip_query($query);
 
 
 	//
@@ -73,19 +116,29 @@ function optimiser_base() {
 
 	$query = "DELETE FROM spip_breves WHERE statut='refuse' AND maj < $mydate";
 	spip_query($query);
-	$breves = '0';
-	$query = "SELECT id_breve FROM spip_breves";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $breves .= ','.$row['id_breve'];
 
-	if ($breves) {
-		$query = "DELETE FROM spip_documents_breves WHERE id_breve NOT IN ($breves)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_breves WHERE id_breve NOT IN ($breves)";
-		spip_query($query);
-		$query = "DELETE FROM spip_forum WHERE id_breve NOT IN (0,$breves)";
-		spip_query($query);
-	}
+	# les liens de documents sur des breves effacees
+	$query = "DELETE spip_documents_breves
+		      FROM spip_documents_breves AS documents_breves
+		        LEFT JOIN spip_breves AS breves
+		          ON documents_breves.id_breve=breves.id_breve
+		       WHERE breves.id_breve IS NULL";
+	spip_query($query);
+
+	# les liens de mots affectes a des breves effacees
+	$query = "DELETE spip_mots_breves FROM spip_mots_breves AS mots_breves
+		        LEFT JOIN spip_breves AS breves
+		          ON mots_breves.id_breve=breves.id_breve
+		       WHERE breves.id_breve IS NULL";
+	spip_query($query);
+
+	# les forums lies a des breves effacees
+	$query = "DELETE spip_forum FROM spip_forum AS forum
+		        LEFT JOIN spip_breves AS breves
+		          ON forum.id_breve=breves.id_breve
+		       WHERE breves.id_breve IS NULL
+		         AND forum.id_breve>0";
+	spip_query($query);
 
 
 	//
@@ -95,78 +148,79 @@ function optimiser_base() {
 	$query = "DELETE FROM spip_syndic WHERE maj < $mydate AND statut = 'refuse'";
 	spip_query($query);
 
-	$syndic = '0';
-	$query = "SELECT id_syndic FROM spip_syndic";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $syndic .= ','.$row['id_syndic'];
+	# les articles syndiques appartenant a des sites effaces
+	$query = "DELETE spip_syndic_articles
+		      FROM spip_syndic_articles AS syndic_articles
+		        LEFT JOIN spip_syndic AS syndic
+		          ON syndic_articles.id_syndic=syndic.id_syndic
+		       WHERE syndic.id_syndic IS NULL";
+	spip_query($query);
 
-	if ($syndic) {
-		$query = "DELETE FROM spip_syndic_articles WHERE id_syndic NOT IN (0,$syndic)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_syndic WHERE id_syndic NOT IN ($syndic)";
-		spip_query($query);
-		$query = "DELETE FROM spip_forum WHERE id_syndic NOT IN (0,$syndic)";
-		spip_query($query);
-	}
+	# les liens de mots affectes a des sites effaces
+	$query = "DELETE spip_mots_syndic FROM spip_mots_syndic AS mots_syndic
+		        LEFT JOIN spip_syndic AS syndic
+		          ON mots_syndic.id_syndic=syndic.id_syndic
+		       WHERE syndic.id_syndic IS NULL";
+	spip_query($query);
+
+	# les forums lies a des sites effaces
+	$query = "DELETE spip_forum FROM spip_forum AS forum
+		        LEFT JOIN spip_syndic AS syndic
+		          ON forum.id_syndic=syndic.id_syndic
+		       WHERE syndic.id_syndic IS NULL
+		         AND forum.id_syndic>0";
+	spip_query($query);
 
 
 	//
 	// Auteurs
 	//
 
-	$auteurs = '0';
-	$query = "SELECT id_auteur FROM spip_auteurs";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $auteurs .= ','.$row['id_auteur'];
+	# les liens d'articles sur des auteurs effaces
+	$query = "DELETE spip_auteurs_articles
+		      FROM spip_auteurs_articles AS auteurs_articles
+		        LEFT JOIN spip_auteurs AS auteurs
+		          ON auteurs_articles.id_auteur=auteurs.id_auteur
+		       WHERE auteurs.id_auteur IS NULL";
+	spip_query($query);
 
-	if ($auteurs) {
-		$query = "DELETE FROM spip_auteurs_articles WHERE id_auteur NOT IN ($auteurs)";
-		spip_query($query);
-		$query = "DELETE FROM spip_auteurs_messages WHERE id_auteur NOT IN ($auteurs)";
-		spip_query($query);
-		$query = "DELETE FROM spip_auteurs_rubriques WHERE id_auteur NOT IN ($auteurs)";
-		spip_query($query);
-	}
+	# les liens de messages sur des auteurs effaces
+	$query = "DELETE spip_auteurs_messages
+		      FROM spip_auteurs_messages AS auteurs_messages
+		        LEFT JOIN spip_auteurs AS auteurs
+		          ON auteurs_messages.id_auteur=auteurs.id_auteur
+		       WHERE auteurs.id_auteur IS NULL";
+	spip_query($query);
 
-	$query = "SELECT id_auteur,nom,email FROM spip_auteurs WHERE statut='5poubelle' AND maj < $mydate";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) {
-		$id_auteur = $row['id_auteur'];
-		$nom = $row['nom'];
-		$email = $row['email'];
-
-		$query2 = "SELECT * FROM spip_auteurs_articles WHERE id_auteur=$id_auteur";
-		$result2 = spip_query($query2);
-		if (!spip_num_rows($result2)) {
-			$query3 = "DELETE FROM spip_auteurs WHERE id_auteur=$id_auteur";
-			$result3 = spip_query($query3);
-			spip_log ("suppression auteur $id_auteur ($nom, $email)");
-		}
-	}
+	# les liens d'articles sur des auteurs effaces
+	$query = "DELETE spip_auteurs_rubriques
+		      FROM spip_auteurs_rubriques AS auteurs_rubriques
+		        LEFT JOIN spip_rubriques AS rubriques
+		          ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
+		       WHERE rubriques.id_rubrique IS NULL";
+	spip_query($query);
+
+	# effacer les auteurs poubelle qui ne sont lies a aucun article
+	$query = "DELETE spip_auteurs
+		      FROM spip_auteurs AS auteurs
+		        LEFT JOIN spip_auteurs_articles AS auteurs_articles
+		          ON auteurs_articles.id_auteur=auteurs.id_auteur
+		       WHERE auteurs_articles.id_auteur IS NULL
+		       AND auteurs.statut='5poubelle' AND auteurs.maj < $mydate";
+	spip_query($query);
 
 
 	//
 	// Messages prives
 	//
 
-	$query = "SELECT m.id_message FROM spip_messages AS m, spip_auteurs_messages AS lien ".
-		"WHERE m.id_message = lien.id_message GROUP BY m.id_message";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $messages[] = $row['id_message'];
-
-	$query = "SELECT id_message FROM spip_messages ".
-		"WHERE type ='affich'";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $messages[] = $row['id_message'];
-
-	if ($messages) {
-		$messages = join(",", $messages);
-
-		$query = "DELETE FROM spip_messages WHERE id_message NOT IN ($messages)";
-		spip_query($query);
-		$query = "DELETE FROM spip_forum WHERE id_message NOT IN (0,$messages)";
-		spip_query($query);
-	}
+	# supprimer les messages lies a un auteur disparu
+	$query = "DELETE spip_messages
+		      FROM spip_messages AS messages
+		        LEFT JOIN spip_auteurs AS auteurs
+		          ON auteurs.id_auteur=messages.id_auteur
+		       WHERE auteurs.id_auteur IS NULL";
+	spip_query($query);
 
 
 	//
@@ -176,23 +230,41 @@ function optimiser_base() {
 	$query = "DELETE FROM spip_mots WHERE titre='' AND maj < $mydate";
 	$result = spip_query($query);
 
-	$mots = '0';
-	$query = "SELECT id_mot FROM spip_mots";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $mots .= ','.$row['id_mot'];
+	# les liens mots-articles sur des mots effaces
+	$query = "DELETE spip_mots_articles FROM spip_mots_articles AS mots_articles
+		        LEFT JOIN spip_mots AS mots
+		          ON mots_articles.id_mot=mots.id_mot
+		       WHERE mots.id_mot IS NULL";
+	spip_query($query);
 
-	if ($mots) {
-		$query = "DELETE FROM spip_mots_articles WHERE id_mot NOT IN ($mots)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_breves WHERE id_mot NOT IN ($mots)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_forum WHERE id_mot NOT IN ($mots)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_rubriques WHERE id_mot NOT IN ($mots)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_syndic WHERE id_mot NOT IN ($mots)";
-		spip_query($query);
-	}
+	# les liens mots-breves sur des mots effaces
+	$query = "DELETE spip_mots_breves FROM spip_mots_breves AS mots_breves
+		        LEFT JOIN spip_mots AS mots
+		          ON mots_breves.id_mot=mots.id_mot
+		       WHERE mots.id_mot IS NULL";
+	spip_query($query);
+
+	# les liens mots-forum sur des mots effaces
+	$query = "DELETE spip_mots_forum FROM spip_mots_forum AS mots_forum
+		        LEFT JOIN spip_mots AS mots
+		          ON mots_forum.id_mot=mots.id_mot
+		       WHERE mots.id_mot IS NULL";
+	spip_query($query);
+
+	# les liens mots-rubriques sur des mots effaces
+	$query = "DELETE spip_mots_rubriques
+		      FROM spip_mots_rubriques AS mots_rubriques
+		        LEFT JOIN spip_mots AS mots
+		          ON mots_rubriques.id_mot=mots.id_mot
+		       WHERE mots.id_mot IS NULL";
+	spip_query($query);
+
+	# les liens mots-syndic sur des mots effaces
+	$query = "DELETE spip_mots_syndic FROM spip_mots_syndic AS mots_syndic
+		        LEFT JOIN spip_mots AS mots
+		          ON mots_syndic.id_mot=mots.id_mot
+		       WHERE mots.id_mot IS NULL";
+	spip_query($query);
 
 
 	//
@@ -202,17 +274,40 @@ function optimiser_base() {
 	$query = "DELETE FROM spip_forum WHERE statut='redac' AND maj < $mydate";
 	spip_query($query);
 
-	$forums = '0';
-	$query = "SELECT id_forum FROM spip_forum";
-	$result = spip_query($query);
-	while ($row = spip_fetch_array($result)) $forums .= ','.$row[0];
+######### Ce code reste a verifier ; mais il semble marcher
+/*
+	# les reponses a des forums effaces
+	$query = "DELETE spip_forum FROM spip_forum AS sf1
+		        LEFT JOIN spip_forum AS sf2
+		          ON sf1.id_parent=sf2.id_forum
+		       WHERE sf2.id_forum IS NULL
+		         AND sf1.id_parent>0";
+	spip_query($query);
+
+
+*/
+#########
+
+	# ALTERNATIVEMENT (semblerait logique, mais horriblement lent....)
+/*
+	$query = "CREATE TEMPORARY TABLE temp SELECT id_forum FROM spip_forum";
+	spip_query($query);
+	$query = "DELETE spip_forum FROM spip_forum AS sf1
+	            LEFT JOIN temp
+	              ON sf1.id_parent = temp.id_forum
+	           WHERE temp.id_forum IS NULL
+	             AND sf1.id_parent > 0";
+	spip_query($query);
+	#	spip_query("DROP TABLE temp");
+*/
+
+	# les liens mots-forum sur des forums effaces
+	$query = "DELETE spip_mots_forum FROM spip_mots_forum AS mots_forum
+		        LEFT JOIN spip_forum AS forum
+		          ON mots_forum.id_forum=forum.id_forum
+		       WHERE forum.id_forum IS NULL";
+	spip_query($query);
 
-	if ($forums) {
-		$query = "DELETE FROM spip_forum WHERE id_parent NOT IN (0,$forums)";
-		spip_query($query);
-		$query = "DELETE FROM spip_mots_forum WHERE id_forum NOT IN ($forums)";
-		spip_query($query);
-	}
 
 
 	//
@@ -220,26 +315,27 @@ function optimiser_base() {
 	//
 
 	// les objets inutiles
+	include_spip('inc/indexation');
 	$liste_tables = liste_index_tables();
-	//$types = array('article','auteur','breve','mot','rubrique','forum','signature','syndic');
-	while (list($id_table,$table_objet) = each($liste_tables)) {
-		$table_index = 'spip_index';
+	foreach ($liste_tables as $id_table => $table_objet) {
 		$col_id = primary_index_table($table_objet);
 		$critere = critere_optimisation($table_objet);
 		if (strlen($critere)>0)
-		  $critere = "AND $critere";
+			$critere = "AND $critere";
 
 		spip_query("UPDATE $table_objet SET idx='' WHERE idx<>'non' $critere");
 
 		$suppr = '';
-		$s = spip_query("SELECT $col_id FROM $table_objet WHERE idx='' $critere");
+		$s = spip_query("SELECT $col_id FROM $table_objet
+			WHERE idx='' $critere");
 		while ($t = spip_fetch_array($s))
 			$suppr .= ','.$t[0];
 		$s = spip_query("SELECT $col_id FROM $table_objet WHERE idx='non'");
 		while ($t = spip_fetch_array($s))
 			$suppr .= ','.$t[0];
 		if ($suppr)
-			spip_query("DELETE FROM $table_index WHERE id_objet IN (0$suppr) AND id_table=$id_table");
+			spip_query("DELETE FROM spip_index
+				WHERE id_objet IN (0$suppr) AND id_table=$id_table");
 	}
 
 	//
@@ -258,12 +354,7 @@ function optimiser_base() {
 		spip_query($query);
 	}
 
-	spip_log("optimisation ok");
+	spip_log("optimisation terminee");
 }
 
-	## debug
-	if ($GLOBALS['auteur_session']['statut'] == '0minirezo'
-	AND $_GET['optimiser'] == 'oui')
-		optimiser_base();
-
 ?>
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index e999d6e1c5..1bac6fc394 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2485,7 +2485,7 @@ function barre_textarea($texte, $rows, $cols) {
 	static $num_textarea = 0;
 	include_spip('inc/layer');
 
-	$texte = safehtml(entites_html($texte));
+	$texte = entites_html($texte);
 	if (!$GLOBALS['browser_barre'])
 		return "<textarea name='texte' rows='$rows' class='forml' cols='$cols'>$texte</textarea>";
 
-- 
GitLab