[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / revisions / genie / optimiser_revisions.php
1 <?php
2 /***************************************************************************\
3 * SPIP, Systeme de publication pour l'internet *
4 * *
5 * Copyright (c) 2001-2019 *
6 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
7 * *
8 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
9 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
10 \***************************************************************************/
11
12 /**
13 * @plugin Revisions pour SPIP
14 * @license GPL
15 * @package SPIP\Revisions\Genie
16 */
17
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 include_spip('base/abstract_sql');
23
24 /**
25 * Tâche Cron d'optimisation des révisions
26 *
27 * @param int $last
28 * Timestamp de la dernière exécution de cette tâche
29 * @return int
30 * Positif : la tâche a été effectuée
31 */
32 function genie_optimiser_revisions_dist($last) {
33
34 optimiser_base_revisions();
35 optimiser_tables_revision();
36
37 return 1;
38 }
39
40 /**
41 * Supprimer les révisions des objets disparus
42 */
43 function optimiser_base_revisions() {
44 /**
45 * On commence par récupérer la liste des types d'objet ayant au moins une révision
46 */
47 $objets_revises = sql_select('objet', 'spip_versions', 'id_version=1', 'objet');
48
49 /**
50 * Pour chaque objet, on va contruire un tableau des identifiants disparus
51 * On supprimera ensuite les occurences dans spip_versions et spip_versions_fragments
52 */
53 while ($objet = sql_fetch($objets_revises)) {
54 $in = array();
55 $table = table_objet_sql($objet['objet']);
56 $id_table_objet = id_table_objet($objet['objet']);
57 $res = sql_select(
58 'A.id_objet AS id_objet, A.objet AS objet',
59 "spip_versions AS A LEFT JOIN $table AS R
60 ON R.$id_table_objet=A.id_objet AND A.objet=" . sql_quote($objet['objet']),
61 "R.$id_table_objet IS NULL AND A.objet=" . sql_quote($objet['objet']) . ' AND A.id_objet > 0',
62 'A.id_objet',
63 'A.id_objet'
64 );
65
66 while ($row = sql_fetch($res)) {
67 $in[$row['id_objet']] = true;
68 }
69 sql_free($res);
70
71 /**
72 * Si on a un array
73 * On supprime toute occurence des objets disparus dans :
74 * -* spip_versions
75 * -* spip_versions_fragments
76 */
77 if ($in) {
78 foreach (array('spip_versions', 'spip_versions_fragments') as $table) {
79 sql_delete($table, sql_in('id_objet', array_keys($in)) . ' AND objet=' . sql_quote($objet['objet']));
80 }
81 }
82 }
83 }
84
85 /**
86 * Optimisation des tables spip_versions et spip_versions_fragments
87 */
88 function optimiser_tables_revision() {
89 foreach (array('spip_versions', 'spip_versions_fragments') as $table) {
90 spip_log("debut d'optimisation de la table $table");
91 if (sql_optimize($table)) {
92 spip_log("fin d'optimisation de la table $table");
93 } else {
94 spip_log("Pas d'optimiseur necessaire pour $table");
95 }
96 }
97 }