[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / base / repair.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Réparation de la base de données
15 *
16 * @package SPIP\Core\SQL\Reparation
17 */
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Action de réparation de la base de données
25 *
26 * Tente de réparer les tables, recalcule les héritages et secteurs
27 * de rubriques. Affiche les erreurs s'il y en a eu.
28 *
29 * @pipeline_appel base_admin_repair
30 * @uses admin_repair_tables()
31 * @uses calculer_rubriques()
32 * @uses propager_les_secteurs()
33 *
34 * @param string $titre Inutilisé
35 * @param string $reprise Inutilisé
36 **/
37 function base_repair_dist($titre = '', $reprise = '') {
38
39 $res = admin_repair_tables();
40 if (!$res) {
41 $res = "<div class='error'>" . _T('avis_erreur_mysql') . ' ' . sql_errno() . ': ' . sql_error() . "</div>\n";
42 } else {
43 include_spip('inc/rubriques');
44 calculer_rubriques();
45 propager_les_secteurs();
46 }
47 include_spip('inc/minipres');
48 $res .= pipeline('base_admin_repair', $res);
49 echo minipres(_T('texte_tentative_recuperation'),
50 $res . generer_form_ecrire('accueil', '', '', _T('public:accueil_site')));
51 }
52
53 /**
54 * Réparer les documents stockés dans des faux répertoires .plat
55 *
56 * @deprecated Les fichiers .plat ne sont plus utilisés. Cette fonction n'est plus appelée depuis r14292
57 * @todo À supprimer ou déplacer dans le plugin Medias.
58 *
59 * @return string Description des changements de chemins des documents
60 **/
61 function admin_repair_plat() {
62 spip_log("verification des documents joints", _LOG_INFO_IMPORTANTE);
63 $out = "";
64 $repertoire = array();
65 include_spip('inc/getdocument');
66 $res = sql_select('*', 'spip_documents', "fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'");
67
68 while ($row = sql_fetch($res)) {
69 $ext = $row['extension'];
70 if (!$ext) {
71 spip_log("document sans extension: " . $row['id_document'], _LOG_INFO_IMPORTANTE);
72 continue;
73 }
74 if (!isset($repertoire[$ext])) {
75 if (@file_exists($plat = _DIR_IMG . $ext . ".plat")) {
76 spip_unlink($plat);
77 }
78 $repertoire[$ext] = creer_repertoire_documents($ext);
79 if (preg_match(',_$,', $repertoire[$ext])) {
80 $repertoire[$ext] = false;
81 }
82 }
83 if ($d = $repertoire[$ext]) {
84 $d = substr($d, strlen(_DIR_IMG));
85 $src = $row['fichier'];
86 $dest = $d . substr($src, strlen($d));
87 if (@copy(_DIR_IMG . $src, _DIR_IMG . $dest)
88 and file_exists(_DIR_IMG . $dest)
89 ) {
90 sql_updateq('spip_documents', array('fichier' => $dest), 'id_document=' . intval($row['id_document']));
91 spip_unlink(_DIR_IMG . $src);
92 $out .= "$src => $dest<br />";
93 }
94 }
95 }
96
97 return $out;
98 }
99
100 /**
101 * Exécute une réparation de la base de données
102 *
103 * Crée les tables et les champs manquants.
104 * Applique sur les tables un REPAIR en SQL (si le serveur SQL l'accepte).
105 *
106 * @return string
107 * Code HTML expliquant les actions réalisées
108 **/
109 function admin_repair_tables() {
110
111 $repair = sql_repair('repair', null, 'continue');
112
113 // recreer les tables manquantes eventuelles
114 include_spip('base/create');
115 creer_base();
116
117 $connexion = $GLOBALS['connexions'][0];
118 $prefixe = $connexion['prefixe'];
119 $rows = array();
120 if ($res1 = sql_showbase()) {
121 while ($r = sql_fetch($res1)) {
122 $rows[] = $r;
123 }
124 sql_free($res1);
125 }
126
127 $res = "";
128 if (count($rows)) {
129 while ($r = array_shift($rows)) {
130 $tab = array_shift($r);
131
132 $class = "";
133 $m = "<strong>$tab</strong> ";
134 spip_log("Repare $tab", _LOG_INFO_IMPORTANTE);
135 // supprimer la meta avant de lancer la reparation
136 // car le repair peut etre long ; on ne veut pas boucler
137 effacer_meta('admin_repair');
138 if ($repair) {
139 $result_repair = sql_repair($tab);
140 if (!$result_repair) {
141 return false;
142 }
143 }
144
145 // essayer de maj la table (creation de champs manquants)
146 maj_tables($tab);
147
148 $count = sql_countsel($tab);
149
150 if ($count > 1) {
151 $m .= "(" . _T('texte_compte_elements', array('count' => $count)) . ")\n";
152 } else {
153 if ($count == 1) {
154 $m .= "(" . _T('texte_compte_element', array('count' => $count)) . ")\n";
155 } else {
156 $m .= "(" . _T('texte_vide') . ")\n";
157 }
158 }
159
160 if ($result_repair
161 and $msg = join(" ",
162 (is_resource($result_repair) or is_object($result_repair)) ? sql_fetch($result_repair) : $result_repair) . ' '
163 and strpos($msg, ' OK ') === false
164 ) {
165 $class = " class='notice'";
166 $m .= "<br /><tt>" . spip_htmlentities($msg) . "</tt>\n";
167 } else {
168 $m .= " " . _T('texte_table_ok');
169 }
170
171 $res .= "<div$class>$m</div>";
172 }
173 }
174
175 return $res;
176 }