From f7476fcb2bbb00a7dba7687ca3788f550faf2dfa Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Mon, 1 Feb 2010 23:54:33 +0000 Subject: [PATCH] report de [15119] [15120] [15121] --- .gitattributes | 1 + ecrire/action/export_all.php | 39 +----- ecrire/base/dump.php | 121 ++++++++++++++++++ ecrire/exec/admin_backup.php | 45 +++++++ ecrire/exec/admin_tech.php | 4 +- ecrire/exec/export_all.php | 233 ++++++++++++----------------------- ecrire/inc/export.php | 8 +- 7 files changed, 251 insertions(+), 200 deletions(-) create mode 100644 ecrire/base/dump.php diff --git a/.gitattributes b/.gitattributes index 5ce029b166..d477f208b6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -65,6 +65,7 @@ ecrire/base/connect_sql.php -text ecrire/base/convert_sql_utf8.php -text ecrire/base/convert_utf8.php -text ecrire/base/delete_all.php -text +ecrire/base/dump.php -text ecrire/base/import_all.php -text ecrire/base/index.php -text ecrire/base/trouver_table.php -text diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php index d9a5dad502..0f18ae3bc9 100644 --- a/ecrire/action/export_all.php +++ b/ecrire/action/export_all.php @@ -32,29 +32,7 @@ function action_export_all_dist() $file = $dir . $archive; utiliser_langue_visiteur(); - if ($quoi =='start'){ - // en mode partiel, commencer par les articles et les rubriques - // pour savoir quelles parties des autres tables sont a sauver - if ($rub) { - if ($t = array_search('spip_rubriques', $tables)) { - unset($tables[$t]); - array_unshift($tables, 'spip_rubriques'); - } - if ($t = array_search('spip_articles', $tables)) { - unset($tables[$t]); - array_unshift($tables, 'spip_articles'); - } - } - // creer l'en tete du fichier et retourner dans l'espace prive - ecrire_fichier($file, export_entete($version),false); - $v = serialize(array($gz, $archive, $rub, $tables, 1, 0)); - ecrire_meta($meta, $v, 'non'); - include_spip('inc/headers'); - // rub=$rub sert AUSSI a distinguer cette redirection - // d'avec l'appel initial sinon FireFox croit malin - // d'optimiser la redirection - redirige_url_ecrire('export_all',"rub=$rub"); - } elseif ($quoi=='end') export_all_fin($file, $meta, $rub); + if ($quoi=='end') export_all_fin($file, $meta, $rub); } // http://doc.spip.org/@export_all_fin @@ -131,21 +109,6 @@ function export_all_fin($file, $meta, $rub) exit; } -// http://doc.spip.org/@export_entete -function export_entete($version_archive) -{ - return -"<" . "?xml version=\"1.0\" encoding=\"". -$GLOBALS['meta']['charset']."\"?".">\n" . -"<SPIP - version=\"" . $GLOBALS['spip_version_affichee'] . "\" - version_base=\"" . $GLOBALS['spip_version_base'] . "\" - version_archive=\"" . $version_archive . "\" - adresse_site=\"" . $GLOBALS['meta']["adresse_site"] . "\" - dir_img=\"" . _DIR_IMG . "\" - dir_logos=\"" . _DIR_LOGOS . "\" ->\n"; -} // production de l'entete du fichier d'archive // http://doc.spip.org/@export_enpied diff --git a/ecrire/base/dump.php b/ecrire/base/dump.php new file mode 100644 index 0000000000..206cea96ea --- /dev/null +++ b/ecrire/base/dump.php @@ -0,0 +1,121 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +define('_VERSION_ARCHIVE', '1.3'); + +include_spip('base/serial'); +include_spip('base/auxiliaires'); +include_spip('public/interfaces'); // pour table_jointures + +// NB: Ce fichier peut ajouter des tables (old-style) +// donc il faut l'inclure "en globals" +if ($f = find_in_path('mes_fonctions.php')) { + global $dossier_squelettes; + @include_once ($f); +} + +if (@is_readable(_CACHE_PLUGINS_FCT)){ + // chargement optimise precompile + include_once(_CACHE_PLUGINS_FCT); +} + +// par defaut tout est exporte sauf les tables ci-dessous +global $EXPORT_tables_noexport; + +$EXPORT_tables_noexport= array( + 'spip_caches', // plugin invalideur + 'spip_resultats', // resultats de recherche ... c'est un cache ! + 'spip_referers', + 'spip_referers_articles', + 'spip_visites', + 'spip_visites_articles', + 'spip_versions', // le dump des fragments n'est pas robuste + 'spip_versions_fragments' // le dump des fragments n'est pas robuste + ); + +if (!$GLOBALS['connect_toutes_rubriques']){ + $EXPORT_tables_noexport[]='spip_messages'; + $EXPORT_tables_noexport[]='spip_auteurs_messages'; +} + +//var_dump($EXPORT_tables_noexport); +$EXPORT_tables_noexport = pipeline('lister_tables_noexport',$EXPORT_tables_noexport); + + +/** + * construction de la liste des tables pour le dump : + * toutes les tables principales + * + toutes les tables auxiliaires hors relations + * + les tables relations dont les deux tables liees sont dans la liste + * + * @global <type> $tables_principales + * @global <type> $tables_auxiliaires + * @global <type> $tables_jointures + * @param array $exclude_tables + * @return array + */ +function base_liste_table_for_dump($exclude_tables = array()){ + $tables_for_dump = array(); + $tables_pointees = array(); + global $tables_principales; + global $tables_auxiliaires; + global $tables_jointures; + + // on construit un index des tables de liens + // pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees + $tables_for_link = array(); + foreach($tables_jointures as $table => $liste_relations) + if (is_array($liste_relations)) + { + $nom = $table; + if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom])) + $nom = "spip_$table"; + if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){ + foreach($liste_relations as $link_table){ + if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){ + $tables_for_link[$link_table][] = $nom; + } + else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){ + $tables_for_link["spip_$link_table"][] = $nom; + } + } + } + } + + $liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires)); + foreach($liste_tables as $table){ + // $name = preg_replace("{^spip_}","",$table); + if ( !isset($tables_pointees[$table]) + && !in_array($table,$exclude_tables) + && !isset($tables_for_link[$table])){ + $tables_for_dump[] = $table; + $tables_pointees[$table] = 1; + } + } + foreach ($tables_for_link as $link_table =>$liste){ + $connecte = true; + foreach($liste as $connect_table) + if (!in_array($connect_table,$tables_for_dump)) + $connecte = false; + if ($connecte) + # on ajoute les liaisons en premier + # si une restauration est interrompue, + # cela se verra mieux si il manque des objets + # que des liens + array_unshift($tables_for_dump,$link_table); + } + return array($tables_for_dump, $tables_for_link); +} + +?> \ No newline at end of file diff --git a/ecrire/exec/admin_backup.php b/ecrire/exec/admin_backup.php index 82be6c12c7..ae7faaa7f1 100644 --- a/ecrire/exec/admin_backup.php +++ b/ecrire/exec/admin_backup.php @@ -13,6 +13,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; include_spip('inc/presentation'); +include_spip('base/dump'); function exec_admin_backup_dist() { @@ -101,6 +102,7 @@ function exec_admin_backup_dist() "</b>$nom<b>.xml</b></li></ul>\n" . "\n<input type='hidden' name='reinstall' value='non' />"; + $res .= options_avancees_dump(); echo generer_form_ecrire('export_all', $res, '', _T('texte_sauvegarde_base')), fin_cadre_trait_couleur(true); @@ -131,4 +133,47 @@ function nom_fichier_dump() } return $nom; } + + +function options_avancees_dump(){ + list($tables,) = base_liste_table_for_dump($GLOBALS['EXPORT_tables_noexport']); + $plie = _T('info_options_avancees'); + $res = controle_tables_en_base('export', $tables); + $res = "<h3>"._T('install_tables_base')."</h3>" + . "\n<ol style='spip'><li>\n" . + join("</li>\n<li>", $res) . + "</li></ol>\n"; + + $res = block_parfois_visible('export_tables', $plie, $res, '', false); + return $res; +} + + +// Fabrique la liste a cocher des tables presentes +function controle_tables_en_base($name, $check) +{ + $p = '/^' . $GLOBALS['table_prefix'] . '/'; + $res = $check; + foreach(sql_alltable() as $t) { + $t = preg_replace($p, 'spip', $t); + if (!in_array($t, $check)) $res[]= $t; + } + sort($res); + + foreach ($res as $k => $t) { + + $c = "type='checkbox'" + . (in_array($t, $check) ? " checked='checked'" : '') + . " onclick='manuel=false'"; + + $res[$k] = "<input $c value='$t' id='$name_$t' name='$name" + . "[]' />\n" + . $t + . " (" + . sql_countsel($t) + . ")"; + } + return $res; +} + ?> diff --git a/ecrire/exec/admin_tech.php b/ecrire/exec/admin_tech.php index 76b8736870..e8824e2c35 100644 --- a/ecrire/exec/admin_tech.php +++ b/ecrire/exec/admin_tech.php @@ -34,7 +34,7 @@ function exec_admin_tech_dist() echo debut_droite('',true); - // + // // Lien vers la reparation // @@ -131,4 +131,4 @@ function autres_bases() . fin_cadre_trait_couleur(true); } -?> \ No newline at end of file +?> diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php index d9c3a4ede0..c908c62683 100644 --- a/ecrire/exec/export_all.php +++ b/ecrire/exec/export_all.php @@ -12,193 +12,114 @@ if (!defined("_ECRIRE_INC_VERSION")) return; -define('_VERSION_ARCHIVE', '1.3'); +/** + * + * On arrive ici depuis exec=admin_tech + * - le premier coup on initialise par exec_export_all_args puis export_all_start + * - ensuite on enchaine sur inc/export, qui remplit le dump et renvoie ici a chaque timeout + * - a chaque coup on relance inc/export + * - lorsque inc/export a fini, il retourne $arg que l'on renvoie + * vers action=export_all avec un end + * - action=export_all clos le fichier et affiche le resume + * + */ -include_spip('base/serial'); -include_spip('base/auxiliaires'); include_spip('inc/presentation'); -include_spip('public/interfaces'); // pour table_jointures - -// NB: Ce fichier peut ajouter des tables (old-style) -// donc il faut l'inclure "en globals" -if ($f = find_in_path('mes_fonctions.php')) { - global $dossier_squelettes; - @include_once ($f); -} - -if (@is_readable(_CACHE_PLUGINS_FCT)){ - // chargement optimise precompile - include_once(_CACHE_PLUGINS_FCT); -} - -// par defaut tout est exporte sauf les tables ci-dessous - -global $EXPORT_tables_noexport; - -$EXPORT_tables_noexport= array( - 'spip_caches', // plugin invalideur - 'spip_resultats', // resultats de recherche ... c'est un cache ! - 'spip_referers', - 'spip_referers_articles', - 'spip_visites', - 'spip_visites_articles', - 'spip_versions', // le dump des fragments n'est pas robuste - 'spip_versions_fragments' // le dump des fragments n'est pas robuste - ); - -if (!$GLOBALS['connect_toutes_rubriques']){ - $EXPORT_tables_noexport[]='spip_messages'; - $EXPORT_tables_noexport[]='spip_auteurs_messages'; -} - -//var_dump($EXPORT_tables_noexport); -$EXPORT_tables_noexport = pipeline('lister_tables_noexport',$EXPORT_tables_noexport); - +include_spip('base/dump'); // http://doc.spip.org/@exec_export_all_dist -function exec_export_all_dist() -{ +function exec_export_all_dist(){ $rub = intval(_request('id_parent')); $meta = "status_dump_" . ($rub ? ($rub .'_') : '') . $GLOBALS['visiteur_session']['id_auteur']; - if (!isset($GLOBALS['meta'][$meta])) - echo exec_export_all_args($rub, _request('gz')); - else { - $export = charger_fonction('export', 'inc'); - if (!$export($meta)) - echo exec_export_all_args($rub, _request('gz')); + if (!isset($GLOBALS['meta'][$meta])){ + // c'est un demarrage en arrivee directe depuis exec=admin_tech + // on initialise + exec_export_all_args($meta, $rub, _request('gz')); } + + $export = charger_fonction('export', 'inc'); + $arg = $export($meta); + + include_spip('inc/headers'); + redirige_par_entete(generer_action_auteur("export_all",$arg,'',true, true)); + } // L'en tete du fichier doit etre cree a partir de l'espace public // Ici on construit la liste des tables pour confirmation. // Envoi automatique en cas d'inaction (sauf si appel incorrect $nom=NULL) -function exec_export_all_args($rub, $gz) -{ +function exec_export_all_args($meta, $rub, $gz){ + $gz = $gz ? '.gz' : ''; $nom = $gz ? _request('znom_sauvegarde') : _request('nom_sauvegarde'); + if (!preg_match(',^[\w_][\w_.]*$,', $nom)) $nom = 'dump'; $archive = $nom . '.xml' . $gz; - list($tables,) = export_all_list_tables(); - $clic = _T('bouton_valider'); - $plie = _T('install_tables_base'); - $res = controle_tables_en_base('export', $tables, $rub); - $res = "\n<ol style='text-align:left'><li>\n" . - join("</li>\n<li>", $res) . - "</li></ol>\n"; - - $res = block_parfois_visible('export_tables', $plie, $res, '', false) - . "<div style='text-align: center;'><input type='submit' value='" - . $clic - . "' /></div>"; - - $arg = "start,$gz,$archive,$rub," . _VERSION_ARCHIVE; - $id = 'form_export'; - $att = " method='post' id='$id'"; - $timeout = 'if (manuel) document.getElementById(manuel).submit()'; - $corps = (($nom !== NULL) - ? http_script("manuel= '$id'; window.setTimeout('$timeout', 60000);") - : '') - . generer_action_auteur('export_all', $arg, '', $res, $att, true); - include_spip('inc/presentation'); - $r = envoi_link('spip', true); - $r = f_jQuery($r); - include_spip('inc/minipres'); - $res = minipres(_T('info_sauvegarde'), $corps); - return str_replace('</head>', $r . '</head>', $res); -} -// construction de la liste des tables pour le dump : -// toutes les tables principales -// + toutes les tables auxiliaires hors relations -// + les tables relations dont les deux tables liees sont dans la liste + // si pas de tables listees en post, utiliser la liste par defaut + if (!$tables = _request('export')) + list($tables,) = base_liste_table_for_dump($GLOBALS['EXPORT_tables_noexport']); -// http://doc.spip.org/@export_all_list_tables -function export_all_list_tables() -{ - $tables_for_dump = array(); - $tables_pointees = array(); - global $EXPORT_tables_noexport; - global $tables_principales; - global $tables_auxiliaires; - global $tables_jointures; - -// on construit un index des tables de liens -// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees - $tables_for_link = array(); - foreach($tables_jointures as $table => $liste_relations) - if (is_array($liste_relations)) - { - $nom = $table; - if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom])) - $nom = "spip_$table"; - if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){ - foreach($liste_relations as $link_table){ - if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){ - $tables_for_link[$link_table][] = $nom; - } - else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){ - $tables_for_link["spip_$link_table"][] = $nom; - } - } - } - } + export_all_start($meta, $gz, $archive, $rub, _VERSION_ARCHIVE, $tables); - $liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires)); - foreach($liste_tables as $table){ - // $name = preg_replace("{^spip_}","",$table); - if ( !isset($tables_pointees[$table]) - && !in_array($table,$EXPORT_tables_noexport) - && !isset($tables_for_link[$table])){ - $tables_for_dump[] = $table; - $tables_pointees[$table] = 1; - } - } - foreach ($tables_for_link as $link_table =>$liste){ - $connecte = true; - foreach($liste as $connect_table) - if (!in_array($connect_table,$tables_for_dump)) - $connecte = false; - if ($connecte) - # on ajoute les liaisons en premier - # si une restauration est interrompue, - # cela se verra mieux si il manque des objets - # que des liens - array_unshift($tables_for_dump,$link_table); - } - return array($tables_for_dump, $tables_for_link); } -// Fabrique la liste a cocher des tables presentes -function controle_tables_en_base($name, $check, $rub) -{ - $p = '/^' . $GLOBALS['table_prefix'] . '/'; - $res = $check; - foreach(sql_alltable() as $t) { - $t = preg_replace($p, 'spip', $t); - if (!in_array($t, $check)) $res[]= $t; - } +function export_all_start($meta, $gz, $archive, $rub, $version, $tables){ - $rub = $rub ? " <= " : ''; - foreach ($res as $k => $t) { + // determine upload va aussi initialiser l'index "restreint" + $maindir = determine_upload(); + if (!$GLOBALS['visiteur_session']['restreint']) + $maindir = _DIR_DUMP; + $dir = sous_repertoire($maindir, $meta); + $file = $dir . $archive; - $c = "type='checkbox'" - . (in_array($t, $check) ? " checked='checked'" : '') - . " onclick='manuel=false'"; + utiliser_langue_visiteur(); - $res[$k] = "<input $c value='$t' id='$name_$t' name='$name" - . "[]' />\n" - . $t - . " ($rub" - . sql_countsel($t) - . ")"; + // en mode partiel, commencer par les articles et les rubriques + // pour savoir quelles parties des autres tables sont a sauver + if ($rub) { + if ($t = array_search('spip_rubriques', $tables)) { + unset($tables[$t]); + array_unshift($tables, 'spip_rubriques'); + } + if ($t = array_search('spip_articles', $tables)) { + unset($tables[$t]); + array_unshift($tables, 'spip_articles'); + } } - return $res; + // creer l'en tete du fichier et retourner dans l'espace prive + ecrire_fichier($file, export_entete($version),false); + $v = serialize(array($gz, $archive, $rub, $tables, 1, 0)); + ecrire_meta($meta, $v, 'non'); + include_spip('inc/headers'); + // rub=$rub sert AUSSI a distinguer cette redirection + // d'avec l'appel initial sinon FireFox croit malin + // d'optimiser la redirection + redirige_url_ecrire('export_all',"rub=$rub"); + + +} + +// http://doc.spip.org/@export_entete +function export_entete($version_archive) +{ + return +"<" . "?xml version=\"1.0\" encoding=\"". +$GLOBALS['meta']['charset']."\"?".">\n" . +"<SPIP + version=\"" . $GLOBALS['spip_version_affichee'] . "\" + version_base=\"" . $GLOBALS['spip_version_base'] . "\" + version_archive=\"" . $version_archive . "\" + adresse_site=\"" . $GLOBALS['meta']["adresse_site"] . "\" + dir_img=\"" . _DIR_IMG . "\" + dir_logos=\"" . _DIR_LOGOS . "\" +>\n"; } ?> diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php index 0feaf4e17e..a21110e1cb 100644 --- a/ecrire/inc/export.php +++ b/ecrire/inc/export.php @@ -21,7 +21,8 @@ function inc_export_dist($meta) if (!isset($GLOBALS['meta'][$meta])) { include_spip('inc/minipres'); echo minipres(); - } else { + } + else { $start = false; list($gz, $archive, $rub, $tables_for_dump, $etape_actuelle, $sous_etape) = unserialize($GLOBALS['meta'][$meta]); @@ -60,8 +61,7 @@ function inc_export_dist($meta) } $all = count($tables_for_dump); if ($etape_actuelle > $all OR !$all){ - include_spip('inc/headers'); - redirige_par_entete(generer_action_auteur("export_all","end,$gz,$archive,$rub",'',true, true)); + return "end,$gz,$archive,$rub"; // c'est fini ! } include_spip('inc/minipres'); @@ -297,7 +297,7 @@ function export_select($row, $les_rubriques, $les_meres) { if (isset($row['impt']) AND $row['impt'] !='oui') return false; if (!$les_rubriques) return true; - // numero de rubrique non determinant pour les forums (0 à 99%) + // numero de rubrique non determinant pour les forums (0 � 99%) if (isset($row['id_rubrique']) AND $row['id_rubrique']) { if (in_array($row['id_rubrique'], $les_rubriques)) { if (isset($row['id_article'])) -- GitLab