[SPIP Zone] r4083 - in /_plugins_/_email_/spip_listes/base: ./ optimiser.php

Author: booz@rezo.net
Date: Wed Jul 19 10:48:58 2006
New Revision: 4083

Log:
ne pas optimiser / effacer les listes

Added:
    _plugins_/_email_/spip_listes/base/
    _plugins_/_email_/spip_listes/base/optimiser.php

Added: _plugins_/_email_/spip_listes/base/optimiser.php

--- _plugins_/_email_/spip_listes/base/optimiser.php (added)
+++ _plugins_/_email_/spip_listes/base/optimiser.php Wed Jul 19 10:48:58 2006
@@ -0,0 +1,471 @@
+<?php
+
+/***************************************************************************\
+ * SPIP, Systeme de publication pour l'internet *
+ * *
+ * Copyright (c) 2001-2006 *
+ * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
+ * *
+ * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
+ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
+\***************************************************************************/
+
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// heure de reference pour le garbage collector = 24h auparavant
+function optimiser_base($attente = 86400) {
+ spip_log ("optimisation de la base");
+
+ # format = 20060610110141, si on veut forcer une optimisation tout de suite
+ $mydate = date("YmdHis", time() - $attente);
+
+
+ //
+ // MySQL
+ //
+ if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix']."_";
+ else $table_pref = "";
+
+ $result = spip_query("SHOW TABLES LIKE '$table_pref%'");
+
+ // on ne va OPTIMIZE qu'une seule des tables a chaque fois,
+ // pour ne pas vautrer le systeme
+ // lire http://dev.mysql.com/doc/refman/5.0/fr/optimize-table.html
+ while ($row = spip_fetch_array($result)) $tables[] = $row[0];
+
+ if ($tables) {
+ $table_op = intval($GLOBALS['meta']['optimiser_table']+1) % sizeof($tables);
+ ecrire_meta('optimiser_table', $table_op);
+ ecrire_metas();
+ $query = "OPTIMIZE TABLE ".$tables[$table_op];
+ spip_log($query);
+ spip_query($query);
+ spip_log("$query : ok");
+ }
+
+
+ // Les requetes DELETE multi table ne sont pas supportees par mysql<4.0
+ // et ont une syntaxe differente entre 4.0 et 4.1
+ // On passe donc par un SELECT puis DELETE unitaire dans une boucle while
+ // en pariant sur le fait que le nombre d'objets a supprimer est marginal
+
+ //
+ // Rubriques
+ //
+
+ # les articles qui sont dans une id_rubrique inexistante
+ //Attention ca efface les listes de spip-listes
+
+ /*
+ $res = spip_query("SELECT articles.id_article
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_articles
+ WHERE id_article=".$row['id_article']);
+ */
+ # les breves qui sont dans une id_rubrique inexistante
+ $res = spip_query("SELECT breves.id_breve
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_breves
+ WHERE id_breve=".$row['id_breve']);
+
+ # les forums lies a une id_rubrique inexistante
+ $res = spip_query("SELECT forum.id_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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_forum
+ WHERE id_forum=".$row['id_forum']);
+
+ # les droits d'auteurs sur une id_rubrique inexistante
+ $res = spip_query("SELECT auteurs_rubriques.id_rubrique,auteurs_rubriques.id_auteur
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_auteurs_rubriques
+ WHERE id_auteur=".$row['id_auteur']
+ ." AND id_rubrique=".$row['id_rubrique']);
+
+
+ # les liens des documents qui sont dans une id_rubrique inexistante
+ $res = spip_query("SELECT documents_rubriques.id_document,documents_rubriques.id_rubrique
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_documents_rubriques
+ WHERE id_document=".$row['id_document']
+ ." AND id_rubrique=".$row['id_rubrique']);
+
+ # les liens des mots affectes a une id_rubrique inexistante
+ $res = spip_query("SELECT mots_rubriques.id_mot,mots_rubriques.id_rubrique
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_mots_rubriques
+ WHERE id_mot=".$row['id_mot']
+ ." AND id_rubrique=".$row['id_rubrique']);
+
+
+ //
+ // Articles
+ //
+
+ spip_query("DELETE FROM spip_articles
+ WHERE statut='poubelle' AND maj < $mydate");
+
+
+ # les liens d'auteurs d'articles effaces
+ $res = spip_query("SELECT auteurs_articles.id_auteur,auteurs_articles.id_article
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_auteurs_articles
+ WHERE id_auteur=".$row['id_auteur']
+ ." AND id_article=".$row['id_article']);
+
+ # les liens de documents d'articles effaces
+ $res = spip_query("SELECT documents_articles.id_document,documents_articles.id_article
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_documents_articles
+ WHERE id_document=".$row['id_document']
+ ." AND id_article=".$row['id_article']);
+
+ # les liens de mots affectes a des articles effaces
+ $res = spip_query("SELECT mots_articles.id_mot,mots_articles.id_article
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_mots_articles
+ WHERE id_mot=".$row['id_mot']
+ ." AND id_article=".$row['id_article']);
+
+ # les forums lies a des articles effaces
+ $res = spip_query("SELECT forum.id_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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_forum
+ WHERE id_forum=".$row['id_forum']);
+
+
+ //
+ // Breves
+ //
+
+ spip_query("DELETE FROM spip_breves
+ WHERE statut='refuse' AND maj < $mydate");
+
+
+ # les liens de documents sur des breves effacees
+ $res = spip_query("SELECT documents_breves.id_document,documents_breves.id_breve
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_documents_breves
+ WHERE id_document=".$row['id_document']
+ ." AND id_breve=".$row['id_breve']);
+
+ # les liens de mots affectes a des breves effacees
+ $res = spip_query("SELECT mots_breves.id_mot,mots_breves.id_breve
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_mots_breves
+ WHERE id_mot=".$row['id_mot']
+ ." AND id_breve=".$row['id_breve']);
+
+ # les forums lies a des breves effacees
+ $res = spip_query("SELECT forum.id_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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_forum
+ WHERE id_forum=".$row['id_forum']);
+
+
+ //
+ // Sites
+ //
+
+ spip_query("DELETE FROM spip_syndic
+ WHERE maj < $mydate AND statut = 'refuse'");
+
+
+ # les articles syndiques appartenant a des sites effaces
+ $res = spip_query("SELECT syndic_articles.id_syndic_article,syndic_articles.id_syndic
+ 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");
+
+ while ($row = spip_fetch_array($res,SPIP_ASSOC))
+ spip_query("DELETE FROM spip_syndic_articles

[... 221 lines stripped ...]