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) ? sql_fetch($result_repair) : $result_repair) . ' ' and strpos($msg, ' OK ') === FALSE) { $class = " class='notice'"; $m .= "<br /><tt>" . htmlentities($msg) . "</tt>\n"; } else { $m .= " " . _T('texte_table_ok'); } $res .= "<div{$class}>{$m}</div>"; } } return $res; }
function optimiser_base_une_table() { $tables = array(); $result = sql_showbase(); // on n'optimise qu'une seule table a chaque fois, // pour ne pas vautrer le systeme // lire http://dev.mysql.com/doc/refman/5.0/fr/optimize-table.html while ($row = sql_fetch($result)) $tables[] = array_shift($row); if ($tables) { $table_op = intval($GLOBALS['meta']['optimiser_table']+1) % sizeof($tables); ecrire_meta('optimiser_table', $table_op); $q = $tables[$table_op]; spip_log("debut d'optimisation de la table $q"); if (sql_optimize($q)) spip_log("fin d'optimisation de la table $q"); else spip_log("Pas d'optimiseur necessaire"); } }
function admin_repair_tables() { $connexion = $GLOBALS['connexions'][0]; $prefixe = $connexion['prefixe']; $res1 = sql_showbase(); $res = ""; if ($res1) { while ($r = sql_fetch($res1)) { $tab = array_shift($r); $res .= "<br /><b>$tab</b> "; spip_log("Repare $tab"); $result_repair = sql_repair($tab); if (!$result_repair) return false; $count = sql_countsel($tab); if ($count>1) $res .= "("._T('texte_compte_elements', array('count' => $count)).")\n"; else if ($count==1) $res .= "("._T('texte_compte_element', array('count' => $count)).")\n"; else $res .= "("._T('texte_vide').")\n"; $msg = join(" ", sql_fetch($result_repair)) . ' '; $ok = strpos($msg, ' OK '); if (!$ok) $res .= "<pre><span style='color: red; font-weight: bold;'>".htmlentities($msg)."</span></pre>\n"; else $res .= " "._T('texte_table_ok')."<br />\n"; } } return $res; }
/** * Retourne la liste des tables SQL * * @api * @uses sql_showbase() * @param string $spip * Filtre sur tables retournées * - NULL : retourne les tables SPIP uniquement (tables préfixées avec le préfixe de la connexion) * - '%' : retourne toutes les tables de la base * @param string $serveur * Le nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : * - false -> ne pas l'executer mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true -> executer la requete. * @return array * Liste des tables SQL **/ function sql_alltable($spip = null, $serveur = '', $option = true) { $q = sql_showbase($spip, $serveur, $option); $r = array(); if ($q) { while ($t = sql_fetch($q, $serveur)) { $r[] = array_shift($t); } } return $r; }
/** * Liste les tables SQL disponibles de la connexion sql donnée * * @param string $connect * Nom du connecteur de base de données * @return array * Liste de tables SQL */ function extras_tables($connect = '') { $a = array(); $taille_prefixe = strlen($GLOBALS['connexions'][$connect ? $connect : 0]['prefixe']); if ($s = sql_showbase(null, $connect)) { while ($t = sql_fetch($s, $connect)) { $t = 'spip' . substr(array_pop($t), $taille_prefixe); $a[] = $t; } } return $a; }
function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db){ global $spip_version_base; // Prefix des tables : // contrairement a ce qui est dit dans le message (trop strict mais c'est // pour notre bien), on va tolerer les chiffres en plus des minuscules // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer // a partir de ce qui est envoye a l'installation if (!defined('_INSTALL_TABLE_PREFIX')) { $table_prefix = ($GLOBALS['table_prefix'] != 'spip') ? $GLOBALS['table_prefix'] : trim(preg_replace(',[^a-z0-9],','',strtolower(_request('tprefix')))); // S'il est vide on remet spip if (!$table_prefix) $table_prefix = 'spip'; } else { $table_prefix = _INSTALL_TABLE_PREFIX; } $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; $fquery = sql_serveur('query', $server_db); if ($choix_db == "new_spip") { $re = ',^[a-z_][a-z_0-9-]*$,i'; if (preg_match($re, $sel_db)) sql_create_base($sel_db, $server_db); else { $re = "Le nom de la base doit correspondre a $re"; spip_log($re); return "<!--\n$re\n-->"; } } // on rejoue la connexion apres avoir teste si il faut lui indiquer // un sql_mode install_mode_appel($server_db, false); $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; // Completer le tableau decrivant la connexion $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; $GLOBALS['connexions'][$server_db]['db'] = $sel_db; $old = sql_showbase($table_prefix . "_meta", $server_db); if ($old) $old = sql_fetch($old, $server_db); if (!$old) { // Si possible, demander au serveur d'envoyer les textes // dans le codage std de SPIP, $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); if ($charset) { sql_set_charset($charset['charset'], $server_db); $GLOBALS['meta']['charset_sql_base'] = $charset['charset']; $GLOBALS['meta']['charset_collation_sql_base'] = $charset['collation']; $GLOBALS['meta']['charset_sql_connexion'] = $charset['charset']; $charsetbase = $charset['charset']; } else { spip_log(_DEFAULT_CHARSET . " inconnu du serveur SQL"); $charsetbase = 'standard'; } spip_log("Creation des tables. Codage $charsetbase"); creer_base($server_db); // AT LAST creer_base_types_doc($server_db); // memoriser avec quel charset on l'a creee if ($charset) { $t = array('nom' => 'charset_sql_base', 'valeur' => $charset['charset'], 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_collation_sql_base'; $t['valeur'] = $charset['collation']; @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_sql_connexion'; $t['valeur'] = $charset['charset']; @sql_insertq('spip_meta', $t, '', $server_db); } $t = array('nom' => 'version_installee', 'valeur' => $spip_version_base, 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'nouvelle_install'; $t['valeur'] = 1; @sql_insertq('spip_meta', $t, '', $server_db); // positionner la langue par defaut du site si un cookie de lang a ete mis if (isset($_COOKIE['spip_lang_ecrire'])){ @sql_insertq('spip_meta', array('nom'=>'langue_site','valeur'=>$_COOKIE['spip_lang_ecrire']), '', $server_db); } } else { // pour recreer les tables disparues au besoin spip_log("Table des Meta deja la. Verification des autres."); creer_base($server_db); $fupdateq = sql_serveur('updateq', $server_db); $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); if ($r) $r = sql_fetch($r, $server_db); $version_installee = !$r ? 0 : (double) $r['valeur']; if (!$version_installee OR ($spip_version_base < $version_installee)) { $fupdateq('spip_meta', array('valeur'=>$spip_version_base, 'impt'=>'non'), "nom='version_installee'", $server_db); spip_log("nouvelle version installee: $spip_version_base"); } // eliminer la derniere operation d'admin mal terminee // notamment la mise a jour @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); } $ligne_rappel = install_mode_appel($server_db); $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta", $server_db); if (!$result_ok) return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; if ($chmod_db) { install_fichier_connexion(_FILE_CHMOD_TMP, "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod_db).");\n"); } if (preg_match(',(.*):(.*),', $adresse_db, $r)) list(,$adresse_db, $port) = $r; else $port = ''; // si ce fichier existe a cette etape c'est qu'il provient // d'une installation qui ne l'a pas cree correctement. // Le supprimer pour que _FILE_CONNECT_TMP prime. if (_FILE_CONNECT AND file_exists(_FILE_CONNECT)) spip_unlink(_FILE_CONNECT); install_fichier_connexion(_FILE_CONNECT_TMP, $ligne_rappel . install_connexion($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db, $table_prefix)); return ''; }
function extras_tables($connect='') { $a = array(); if ($s = sql_showbase(null, $connect)) { while ($t = sql_fetch($s, $connect)) { $a[] = array_pop($t); } } return $a; }