3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Réparation de la base de données
16 * @package SPIP\Core\SQL\Reparation
19 if (!defined('_ECRIRE_INC_VERSION')) {
24 * Action de réparation de la base de données
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.
29 * @pipeline_appel base_admin_repair
30 * @uses admin_repair_tables()
31 * @uses calculer_rubriques()
32 * @uses propager_les_secteurs()
34 * @param string $titre Inutilisé
35 * @param string $reprise Inutilisé
37 function base_repair_dist($titre = '', $reprise = '') {
39 $res = admin_repair_tables();
41 $res = "<div class='error'>" . _T('avis_erreur_mysql') . ' ' . sql_errno() . ': ' . sql_error() . "</div>\n";
43 include_spip('inc/rubriques');
45 propager_les_secteurs();
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')));
54 * Réparer les documents stockés dans des faux répertoires .plat
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.
59 * @return string Description des changements de chemins des documents
61 function admin_repair_plat() {
62 spip_log("verification des documents joints", _LOG_INFO_IMPORTANTE
);
64 $repertoire = array();
65 include_spip('inc/getdocument');
66 $res = sql_select('*', 'spip_documents', "fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'");
68 while ($row = sql_fetch($res)) {
69 $ext = $row['extension'];
71 spip_log("document sans extension: " . $row['id_document'], _LOG_INFO_IMPORTANTE
);
74 if (!isset($repertoire[$ext])) {
75 if (@file_exists
($plat = _DIR_IMG
. $ext . ".plat")) {
78 $repertoire[$ext] = creer_repertoire_documents($ext);
79 if (preg_match(',_$,', $repertoire[$ext])) {
80 $repertoire[$ext] = false;
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)
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 />";
101 * Exécute une réparation de la base de données
103 * Crée les tables et les champs manquants.
104 * Applique sur les tables un REPAIR en SQL (si le serveur SQL l'accepte).
107 * Code HTML expliquant les actions réalisées
109 function admin_repair_tables() {
111 $repair = sql_repair('repair', null, 'continue');
113 // recreer les tables manquantes eventuelles
114 include_spip('base/create');
117 $connexion = $GLOBALS['connexions'][0];
118 $prefixe = $connexion['prefixe'];
120 if ($res1 = sql_showbase()) {
121 while ($r = sql_fetch($res1)) {
129 while ($r = array_shift($rows)) {
130 $tab = array_shift($r);
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');
139 $result_repair = sql_repair($tab);
140 if (!$result_repair) {
145 // essayer de maj la table (creation de champs manquants)
148 $count = sql_countsel($tab);
151 $m .= "(" . _T('texte_compte_elements', array('count' => $count)) . ")\n";
154 $m .= "(" . _T('texte_compte_element', array('count' => $count)) . ")\n";
156 $m .= "(" . _T('texte_vide') . ")\n";
162 (is_resource($result_repair) or is_object($result_repair)) ?
sql_fetch($result_repair) : $result_repair) . ' '
163 and strpos($msg, ' OK ') === false
165 $class = " class='notice'";
166 $m .= "<br /><tt>" . spip_htmlentities($msg) . "</tt>\n";
168 $m .= " " . _T('texte_table_ok');
171 $res .= "<div$class>$m</div>";