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