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