diff --git a/ecrire/base/convert_sql_utf8.php b/ecrire/base/convert_sql_utf8.php index 86813cc728c87165f3145bd444c188e1a8da1929..af8baae0d543d150bed7120802bf1aa9cfec1ce1 100644 --- a/ecrire/base/convert_sql_utf8.php +++ b/ecrire/base/convert_sql_utf8.php @@ -16,12 +16,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // http://doc.spip.org/@base_convert_sql_utf8_dist function base_convert_sql_utf8_dist($titre, $reprise=false) { - // poser un verrou (et abandonner si l'action est en cours) - - if (!spip_get_lock('conversion_charset_sql')) { - echo minipres(_T('utf8_convert_attendez')); - exit; - } include_spip('inc/meta'); ecrire_meta('convert_sql_utf8','oui','non'); @@ -135,6 +129,5 @@ function convert_sql_utf8(){ ecrire_meta('charset_sql_base',$sql_charset,'non'); ecrire_meta('charset_sql_connexion',$sql_charset,'non'); ecrire_metas(); - spip_release_lock('conversion_charset_sql'); } ?> diff --git a/ecrire/base/convert_utf8.php b/ecrire/base/convert_utf8.php index 3190e01390d5a28e9e7a86fccfe4972c22fe1b21..141d3ac26de7f8b270d2d9818b6302a572fdc930 100644 --- a/ecrire/base/convert_utf8.php +++ b/ecrire/base/convert_utf8.php @@ -38,12 +38,6 @@ function convert_utf8_init($tables_a_convertir) // http://doc.spip.org/@base_convert_utf8_dist function base_convert_utf8_dist($titre, $reprise=false) { - // poser un verrou (et abandonner si l'action est en cours) - - if (!spip_get_lock('conversion_charset')) { - echo minipres(_T('utf8_convert_attendez')); - exit; - } // une liste des tables a convertir, avec le champ dans lequel on // indique '<CONVERT charset>' ; on commence par les rubriques sinon // ca fait desordre dans l'interface privee diff --git a/ecrire/base/import_all.php b/ecrire/base/import_all.php index 397fa538bc94d766495ee4632541935dcafe9ff9..a2e7defce799ac451ed9258bdd3b46075ced24dd 100644 --- a/ecrire/base/import_all.php +++ b/ecrire/base/import_all.php @@ -115,7 +115,6 @@ function import_all_fin($request) { effacer_meta("date_optimisation"); effacer_meta('version_archive_restauration'); effacer_meta('tag_archive_restauration'); - effacer_meta('restauration_session_id'); effacer_meta('restauration_charset_sql_connexion'); ecrire_metas(); if ($request['insertion'] == 'passe2') diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php index d3604ad7462e159fc8c45c6970968e01fb72ccb4..28fa7a1ebc5a966fc6f1b5446dd25daf47b8ecc6 100644 --- a/ecrire/inc/admin.php +++ b/ecrire/inc/admin.php @@ -29,17 +29,39 @@ function inc_admin_dist($script, $titre, $comment='', $retour='') spip_log("meta: $script " . join(',', $_POST)); ecrire_meta($script, serialize($_POST)); ecrire_metas(); - } else spip_log("reprise de $script"); + } else admin_verifie_session($script); + $base = charger_fonction($script, 'base'); $base($titre,$reprise); - effacer_meta($script); - ecrire_metas(); - spip_unlink(_FILE_META); fin_admin($script); - spip_log("efface meta: $script " . ($retour ? $retour : '')); + spip_log("efface les meta admin et $script " . ($retour ? $retour : '')); if ($retour) redirige_par_entete($retour); } +// Gestion dans la meta "admin" du script d'administation demande, +// pour eviter des executions en parallele, notamment apres Time-Out. +// Cette meta contient le nom du script et, a un codage pres, du demandeur. +// Le code de ecrire/index.php devie toute demande d'execution d'un script +// vers le script d'administration indique par cette meta si elle est lа. +// Au niveau de la fonction inc_admin, on controle la meta 'admin'. +// Si la meta n'est pas la, c'est le debut on la cree +// Sinon, on verifie que le connecte est bien celui ayant entame +// l'operation d'administration, +// Si le connecte n'est pas le bon, on refuse la connexion. + +// http://doc.spip.org/@import_verifie_session +function admin_verifie_session($script) { + + $signal = $script . ' ' . fichier_admin($action); + $row = sql_fetsel('valeur', 'spip_meta', "nom='admin'"); + if (!$row) { + ecrire_meta('admin', $signal,'non'); + ecrire_metas(); + } elseif ($row['valeur'] != $signal) + die(_T('info_travaux_texte')); + else spip_log("reprise de $script"); +} + // http://doc.spip.org/@dir_admin function dir_admin() { @@ -123,8 +145,12 @@ function debut_admin($script, $action='', $commentaire='') { // http://doc.spip.org/@fin_admin function fin_admin($action) { $signal = dir_admin() . fichier_admin($action); + @rmdir($signal); // par precaution spip_unlink($signal); - @rmdir($signal); + spip_unlink(_FILE_META); + effacer_meta($action); + effacer_meta('admin'); + ecrire_metas(); } // http://doc.spip.org/@copy_request diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php index f6d2c4e6136ee2632ed79203015b0f18ffc66549..c69ee4e5ff0338e154e3ee2d47cefef715cc9d3b 100644 --- a/ecrire/inc/import.php +++ b/ecrire/inc/import.php @@ -180,17 +180,6 @@ function detruit_restaurateur() } } -// verifier que l'id de session restauration place dans une meta correspond toujours a la session en cours -// sinon cela signifie que la page a ete rechargee, et qu'une autre session a repris depuis le dernier abs_pos -// il faut absolument ne plus rien faire et mourir ... - -// http://doc.spip.org/@import_verifie_session -function import_verifie_session() { - $row = sql_fetsel(array('valeur'),array('spip_meta'),array("nom='restauration_session_id'")); - if ($row['valeur']!=_RESTAURATION_SESSION_ID) - die('la place est prise'); -} - // http://doc.spip.org/@import_tables function import_tables($request, $dir) { global $import_ok, $abs_pos, $affiche_progression_pourcent; @@ -228,12 +217,6 @@ function import_tables($request, $dir) { $gz = 'fread'; } - // creer un id de la session d'import qui sera utilise pour verifier qu'on a toujours la main - // avant chaque insert/update - // permet d'eviter les process concourants qui realisent le meme insert/update - include_spip('inc/acces'); - @define('_RESTAURATION_SESSION_ID',creer_uniqid()); - ecrire_meta('restauration_session_id',_RESTAURATION_SESSION_ID,'non'); if ($abs_pos==0) { list($tag, $atts, $charset) = import_debut($file, $gz); diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php index 63188a2279cd9b0922fb7c88ad8395ab06457ea6..bf16247d07a03f587e23619bb9411a2e2d90f4bc 100644 --- a/ecrire/inc/import_1_3.php +++ b/ecrire/inc/import_1_3.php @@ -69,7 +69,6 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) { if ($values === false) return ($import_ok = false); - import_verifie_session(); // verifier qu'on a toujours la main pour faire des insertions en base if ($values) $boucle($values, $new, $desc, $request, $atts); return $import_ok = $new; diff --git a/ecrire/index.php b/ecrire/index.php index d3c6ce3fb5a73be69eeba8a4ce8b5b6e23e71b7f..cb8b9fda64015aa1c28f9b6b82411b62d897b0a7 100644 --- a/ecrire/index.php +++ b/ecrire/index.php @@ -128,13 +128,18 @@ AND (!isset($var_ajaxcharset)) AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_installee'])))) $exec = 'demande_mise_a_jour'; -// Si interruption d'une longue restauration -// detourner le script demande pour qu'il reprenne le boulot, et -// refuser Ajax et non-admin pour eviter des restaurations paralleles -elseif (isset($GLOBALS['meta']["import_all"])) { +// Quand une action d'administration est en cours (meta "admin"), +// refuser les connexions non-admin ou Ajax pour laisser la base intacte. +// Si c'est une admin, detourner le script demande vers cette action: +// si l'action est vraiment en cours, inc_admin refusera cette 2e demande, +// sinon c'est qu'elle a ete interrompue et il faut la reprendre + +elseif (isset($GLOBALS['meta']["admin"])) { if (isset($var_ajaxcharset) OR !isset($_COOKIE['spip_admin'])) - die('Importation en cours, revenez plus tard.'); - $exec = 'import_all'; + die(_T('info_travaux_texte')); + $l = $GLOBALS['meta']["admin"]; + spip_log("Le script $l, en cours, se substitue a $exec"); + $exec = substr($l, 0, strpos($l, ' ')); } // si nom pas plausible, prendre le script par defaut elseif (!preg_match(',^[a-z_][0-9a-z_]*$,i', $exec)) $exec = "accueil"; diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php index ad718a04e9d0c5df3812850be221aef4165ce32a..ad605cb11a03e2af58cb128976259882b89c4006 100644 --- a/ecrire/install/etape_3.php +++ b/ecrire/install/etape_3.php @@ -97,7 +97,9 @@ function install_bases(){ $finsert('spip_meta', '(nom, valeur,impt)', "('version_installee', '$spip_version','non')"); } else { - creer_base($server_db); // pour recrer les tables disparues au besoin + // pour recreer les tables disparues au besoin + creer_base($server_db); + $r = $fquery ("SELECT valeur FROM spip_meta WHERE nom='version_installee'"); if ($r) $r = $ffetch($r); if ($r) $version_installee = (double) $r['valeur']; @@ -138,8 +140,9 @@ function install_bases(){ $result_ok = $finsert("spip_meta", "(nom, valeur)", "('nouvelle_install', '1')"); } else { - // en cas de reinstall sur mise a jour mal passee - @$fquery("DELETE FROM spip_meta WHERE nom='import_all'"); + // 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'"); $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta"); }