/** * Programme de mise a jour des tables SQL lors d'un chgt de version. * L'entree dans cette fonction est reservee au maj de SPIP coeur * * Marche aussi pour les plugins en appelant directement la fonction maj_plugin * Pour que ceux-ci profitent aussi de la reprise sur interruption, * ils doivent simplement indiquer leur numero de version installee dans une meta * et fournir le tableau maj a la fonction maj_plugin. * La reprise sur timeout se fait alors par la page admin_plugin et jamais par ici * * http://doc.spip.org/@base_upgrade_dist * * @param string $titre * @param string $reprise * @return */ function base_upgrade_dist($titre = '', $reprise = '') { if (!$titre) { return; } // anti-testeur automatique if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) { if (!is_numeric(_request('reinstall'))) { include_spip('base/create'); spip_log("recree les tables eventuellement disparues", "maj." . _LOG_INFO_IMPORTANTE); creer_base(); } // quand on rentre par ici, c'est toujours une mise a jour de SPIP // lancement de l'upgrade SPIP $res = maj_base(); if ($res) { // on arrete tout ici ! exit; } } spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config", "maj." . _LOG_INFO_IMPORTANTE); // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @spip_unlink(_CACHE_PLUGINS_PATH); @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_CHEMIN); @spip_unlink(_DIR_TMP . "plugin_xml_cache.gz"); include_spip('inc/auth'); auth_synchroniser_distant(); $config = charger_fonction('config', 'inc'); $config(); }
function maj_vieille_base_create_dist($version_cible){ $charger = charger_fonction('charger','maj/vieille_base'); $version = $charger($version_cible); // choisir un nouveau prefixe de table, le noter, et switcher en redefinissant le serveur $new_prefixe = "XXspip$version"; // ici on ecrit la meta dans la table 'officielle' ecrire_meta('restauration_table_prefix',$new_prefixe,'non'); ecrire_meta('vieille_version_installee',$version_cible,'non'); $metas = $GLOBALS['meta']; $prefixe_source = $GLOBALS['connexions'][0]['prefixe']; $GLOBALS['serveur_vieille_base'] = 0; $GLOBALS['connexions'][$GLOBALS['serveur_vieille_base']] = $GLOBALS['connexions'][0]; $GLOBALS['connexions'][$GLOBALS['serveur_vieille_base']]['prefixe'] = $new_prefixe; lire_metas(); if (!isset($GLOBALS['meta']['restauration_table_prefix_source'])) { $create = charger_fonction('create',"maj/vieille_base/$version"); $create(); // reecrire les metas dans la table provisoire foreach($metas as $k=>$v) ecrire_meta($k,$v); ecrire_meta('restauration_table_prefix_source',$prefixe_source,'non'); // noter le numero de version installee // // Exception lorsque la version est entre 10000 et 12000 // car ce qui est utilise est la base au moment du SVN 10000 // qui avait url_propre dans les champs de tous les objets // mais un spip_version type 1.945 (et non 10000). // si on laisse 10000, les mise a jour de url_propre ne se font pas. if ($version == 10000) $version = 1.945; ecrire_meta('version_installee',$version,'non'); } if ($version_cible!=$GLOBALS['meta']['version_installee']) { // upgrader jusqu'a la cible include_spip('base/upgrade'); maj_base($version_cible); } }
function base_upgrade_dist($titre='', $reprise='') { if (!$titre) return; // anti-testeur automatique if ($GLOBALS['spip_version']!=$GLOBALS['meta']['version_installee']) { if (!is_numeric(_request('reinstall'))) { include_spip('base/create'); spip_log("recree les tables eventuellement disparues"); creer_base(); } $meta = _request('meta'); if (!$meta) $res = maj_base(); // reprise sur demande de mise a jour interrompue pour plugin else $res= maj_while($GLOBALS['meta'][$meta], $GLOBALS[$meta]['cible'], $GLOBALS[$meta]['maj'], $meta, _request('table')); if ($res) { if (!is_array($res)) spip_log("Pb d'acces SQL a la mise a jour"); else { include_spip('inc/minipres'); echo minipres(_T('avis_operation_echec') . ' ' . join(' ', $res)); exit; } } } spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config"); // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides spip_unlink(_DIR_TMP.'plugin_xml.cache'); spip_unlink(_DIR_SESSIONS.'ajax_fonctions.txt'); spip_unlink(_CACHE_PIPELINES); spip_unlink(_CACHE_RUBRIQUES); spip_unlink(_CACHE_PLUGINS_OPT); spip_unlink(_CACHE_PLUGINS_FCT); spip_unlink(_CACHE_PLUGINS_VERIF); include_spip('inc/acces'); ecrire_acces(); $config = charger_fonction('config', 'inc'); $config(); }
function import_tables($request, $archive) { global $import_ok, $abs_pos, $affiche_progression_pourcent; // regarder si on est pas en train d'importer dans une copie des tables if (isset($GLOBALS['meta']['restauration_table_prefix'])) { $charger = charger_fonction('charger','maj/vieille_base'); $charger($GLOBALS['meta']['vieille_version_installee']); $GLOBALS['serveur_vieille_base'] = 0; $prefix = $GLOBALS['connexions'][$GLOBALS['serveur_vieille_base']]['prefixe']; $GLOBALS['connexions'][$GLOBALS['serveur_vieille_base']]['prefixe'] = $GLOBALS['meta']['restauration_table_prefix']; // verifier qu'une table meta existe bien // sinon c'est une restauration anterieure echouee if (!sql_getfetsel('valeur','spip_meta','','','','0,1')){ $GLOBALS['connexions'][$GLOBALS['serveur_vieille_base']]['prefixe'] = $prefix; return; } // recharger les metas lire_metas(); } $abs_pos = (!isset($GLOBALS['meta']["restauration_status"])) ? 0 : $GLOBALS['meta']["restauration_status"]; // au premier appel destruction des tables a restaurer // ou initialisation de la table des translations, // mais pas lors d'une reprise. if ($request['insertion']=='on') { include_spip('inc/import_insere'); $request['init'] = (!$abs_pos) ? 'insere_1_init' : 'insere_1bis_init'; $request['boucle'] = 'import_insere'; } elseif ($request['insertion']=='passe2') { $request['init'] = 'insere_2_init'; $request['boucle'] = 'import_translate'; } else { $request['init'] = (!$abs_pos) ? 'import_init_tables' : 'import_table_choix'; $request['boucle'] = 'import_replace'; } if (strncmp(".gz", substr($archive,-3),3)==0) { $size = false; $taille = taille_en_octets($abs_pos); $file = gzopen($archive, 'rb'); $gz = 'gzread'; } else { $size = @filesize($archive); $taille = @floor(100 * $abs_pos / $size)." %"; $file = fopen($archive, 'rb'); $gz = 'fread'; } if ($abs_pos==0) { list($tag, $atts, $charset) = import_debut($file, $gz); // improbable: fichier correct avant debut_admin et plus apres if (!$tag) return !($import_ok = true); $version_archive = import_init_meta($tag, $atts, $charset, $request); } else { $version_archive = $GLOBALS['meta']['restauration_version_archive']; $atts = unserialize($GLOBALS['meta']['restauration_attributs_archive']); spip_log("Reprise de l'importation interrompue en $abs_pos"); $_fseek = ($gz=='gzread') ? 'gzseek' : 'fseek'; $_fseek($file, $abs_pos); } // placer la connexion sql dans le bon charset if (isset($GLOBALS['meta']['restauration_charset_sql_connexion'])) sql_set_charset($GLOBALS['meta']['restauration_charset_sql_connexion']); if (!defined('_DEBUG_IMPORT')) define('_DEBUG_IMPORT', false); if (_DEBUG_IMPORT) ecrire_fichier(_DIR_TMP."debug_import.log","#####".date('Y-m-d H:i:s')."\n",false,false); $fimport = import_charge_version($version_archive); if ($request['insertion'] !== 'passe2') import_affiche_javascript($taille); if (function_exists('ob_flush')) @ob_flush(); flush(); $oldtable =''; $cpt = 0; $pos = $abs_pos; // BOUCLE principale qui tourne en rond jusqu'a le fin du fichier while ($table = $fimport($file, $request, $gz, $atts)) { // memoriser pour pouvoir reprendre en cas d'interrupt, // mais pas d'ecriture sur fichier, ca ralentit trop ecrire_meta("restauration_status", "$abs_pos",'non'); if ($oldtable != $table) { if (_DEBUG_IMPORT){ ecrire_fichier(_DIR_TMP."debug_import.log","----\n".$GLOBALS['debug_import_avant']."\n<<<<\n$table\n>>>>\n".$GLOBALS['debug_import_apres']."\n----\n",false,false); } if ($oldtable) spip_log("$cpt entrees","import"); spip_log("Analyse de $table (commence en $pos)","import"); affiche_progression_javascript($abs_pos,$size,$table); $oldtable = $table; $cpt = 0; $pos = $abs_pos; } $cpt++; } spip_log("$cpt entrees","import"); spip_log("fin de l'archive, statut: " .($import_ok ? 'ok' : 'alert'),"import"); if (!$import_ok) return _T('avis_archive_invalide') . ' ' . _T('taille_octets', array('taille' => $pos)) ; if ($GLOBALS['spip_version_base'] != (str_replace(',','.',$GLOBALS['meta']['version_installee']))){ // il FAUT recharger les bonnes desc serial/aux avant ... include_spip('base/serial'); $GLOBALS['tables_principales']=array(); base_serial($GLOBALS['tables_principales']); include_spip('base/auxiliaires'); $GLOBALS['tables_auxiliaires']=array(); base_auxiliaires($GLOBALS['tables_auxiliaires']); $GLOBALS['tables_jointures']=array(); include_spip('public/interfaces'); declarer_interfaces(); include_spip('base/upgrade'); maj_base(); // upgrade jusqu'a la version courante } // regarder si on est pas en train d'importer dans une copie des tables if (isset($GLOBALS['meta']['restauration_table_prefix_source'])){ $prefixe_source = $GLOBALS['meta']['restauration_table_prefix_source']; $GLOBALS['connexions']['-1'] = $GLOBALS['connexions'][0]; // rebasculer le serveur sur les bonnes tables pour finir proprement $GLOBALS['connexions'][0]['prefixe'] = $prefixe_source; // et relire les meta de la bonne base lire_metas(); $tables_recopiees = isset($GLOBALS['meta']['restauration_recopie_tables'])?unserialize($GLOBALS['meta']['restauration_recopie_tables']):array(); spip_log("charge tables_recopiees ".serialize($tables_recopiees),'dbdump'); // recopier les tables l'une sur l'autre // il FAUT recharger les bonnes desc serial/aux avant ... include_spip('base/serial'); $GLOBALS['tables_principales']=array(); base_serial($GLOBALS['tables_principales']); include_spip('base/auxiliaires'); $GLOBALS['tables_auxiliaires']=array(); base_auxiliaires($GLOBALS['tables_auxiliaires']); $GLOBALS['tables_jointures']=array(); include_spip('public/interfaces'); declarer_interfaces(); // puis relister les tables a importer // et les vider si besoin, au moment du premier passage ici // (et seulement si ce n'est pas une fusion, comment le dit-on ?) $initialisation_copie = (!isset($GLOBALS['meta']["restauration_status_copie"])) ? 0 : $GLOBALS['meta']["restauration_status_copie"]; if (!$initialisation_copie) { // vide les tables qui le necessitent $tables = import_init_tables($request); ecrire_meta("restauration_status_copie", "ok",'non'); } else // la liste des tables a recopier $tables = import_table_choix($request); # var_dump($tables);die(); spip_log("tables a copier :".implode(", ",$tables),'dbdump'); if (in_array('spip_auteurs',$tables)){ $tables = array_diff($tables,array('spip_auteurs')); $tables[] = 'spip_auteurs'; } if (in_array('spip_meta',$tables)){ $tables = array_diff($tables,array('spip_meta')); $tables[] = 'spip_meta'; } sql_drop_table('spip_test','','-1'); foreach ($tables as $table){ if (sql_showtable($table,true,-1)){ if (!isset($tables_recopiees[$table])) $tables_recopiees[$table] = 0; if ($tables_recopiees[$table]!==-1){ affiche_progression_javascript(0,0,$table); while (true) { $n = intval($tables_recopiees[$table]); $res = sql_select('*',$table,'','','',"$n,400",'','-1'); while ($row = sql_fetch($res,'-1')){ array_walk($row,'sql_quote'); sql_replace($table,$row); $tables_recopiees[$table]++; } if ($n == $tables_recopiees[$table]) break; spip_log("recopie $table ".$tables_recopiees[$table],'dbdump'); affiche_progression_javascript($tables_recopiees[$table],0,$table); ecrire_meta('restauration_recopie_tables',serialize($tables_recopiees)); } sql_drop_table($table,'','-1'); spip_log("drop $table",'dbdump'); $tables_recopiees[$table]=-1; ecrire_meta('restauration_recopie_tables',serialize($tables_recopiees)); spip_log("tables_recopiees ".serialize($tables_recopiees),'dbdump'); } } } } // recharger les metas lire_metas(); #die(); return '' ; }
<?php echo "0."; define('_DIR_RESTREINT_ABS', 'ecrire/'); include_once _DIR_RESTREINT_ABS.'inc_version.php'; echo "1."; include_spip('base/create'); spip_connect(); echo "2."; creer_base(); include_spip('base/upgrade'); maj_base(); echo "3."; include_spip('inc/acces'); include_spip('inc/config'); ecrire_acces(); ?>