function maj_while($installee, $cible, $maj, $meta='', $table='meta') { $n = 0; $time = time(); while ($installee < $cible) { $installee++; if (isset($maj[$installee])) { $etape = serie_alter($installee, $maj[$installee], $meta, $table); if ($etape) return array($installee, $etape); $n = time() - $time; spip_log("$table $meta: $installee en $n secondes",'maj'); if ($meta) ecrire_meta($meta, $installee,'non', $table); } // rien pour SQL if ($n >= _UPGRADE_TIME_OUT) { redirige_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table"); } } // indispensable pour les chgt de versions qui n'ecrivent pas en base // tant pis pour la redondance eventuelle avec ci-dessus if ($meta) ecrire_meta($meta, $installee,'non'); spip_log("MAJ terminee. $meta: $installee",'maj'); return array(); }
function maj_1_950($installee) { // oubli de gerer le prefixe lors l'introduction de l'abstraction // => Relancer les MAJ concernees si la version dont on part les avait fait if ($installee >= 1.946) { serie_alter('950a', $GLOBALS['maj'][1946]); } if ($installee >= 1.947) { serie_alter('950b', $GLOBALS['maj'][1947]); } if ($installee >= 1.949) { @serie_alter('950c', $GLOBALS['maj'][1949]); } global $tables_auxiliaires; include_spip('base/auxiliaires'); $v = $tables_auxiliaires[$k = 'spip_urls']; sql_create($k, $v['field'], $v['key'], false, false); foreach (array('article' => 'id_article', 'rubrique' => 'id_rubrique', 'breve' => 'id_breve', 'auteur' => 'id_auteur', 'mot' => 'id_mot', 'syndic' => 'id_syndic') as $type => $id_objet) { $table = $type == 'syndic' ? $type : $type . "s"; $date = $type == 'breve' ? 'date_heure' : ($type == 'auteur' ? 'maj' : ($type == 'mot' ? 'maj' : 'date')); $q = @sql_select("url_propre AS url, {$id_objet} AS id_objet, '{$type}' AS type, {$date} as date", "spip_{$table}", "url_propre<>''"); if (!$q) { return; } // anormal, mais ne pas boucler en erreur while ($r = sql_fetch($q)) { sql_replace('spip_urls', $r); } spip_log("table {$table} : " . sql_count($q) . " urls propres copiees"); sql_alter("TABLE spip_{$table} DROP INDEX `url_propre`"); sql_alter("TABLE spip_{$table} DROP `url_propre`"); } }
/** * A partir des > 1.926 (i.e SPIP > 1.9.2), cette fonction gere les MAJ. * Se relancer soi-meme pour eviter l'interruption pendant une operation SQL * (qu'on espere pas trop longue chacune) * evidemment en ecrivant dans la meta a quel numero on en est. * * Cette fonction peut servir aux plugins qui doivent donner comme arguments: * 1. le numero de version courant (numero de version 1.2.3 ou entier) * 2. le numero de version a atteindre (numero de version 1.2.3 ou entier) * 3. le tableau des instructions de mise a jour a executer * Pour profiter du mecanisme de reprise sur interruption il faut de plus * 4. le nom de la meta permettant de retrouver tout ca * 5. la table des meta ou elle se trouve ($table_prefix . '_meta' par defaut) * (cf debut de fichier) * en cas d'echec, cette fonction retourne un tableau (etape,sous-etape) * sinon elle retourne un tableau vide * * les fonctions sql_xx appelees lors des maj sont supposees atomiques et ne sont pas relancees * en cas de timeout * mais les fonctions specifiques sont relancees jusqu'a ce qu'elles finissent * elles doivent donc s'assurer de progresser a chaque reprise * * http://doc.spip.org/@maj_while * * @param $installee * @param $cible * @param $maj * @param string $meta * @param string $table * @param string $redirect * @param bool $debut_page * @return array */ function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) { # inclusions pour que les procedures d'upgrade disposent des fonctions de base include_spip('base/create'); include_spip('base/abstract_sql'); $trouver_table = charger_fonction('trouver_table', 'base'); include_spip('inc/plugin'); // pour spip_version_compare $n = 0; $time = time(); // definir le timeout qui peut etre utilise dans les fonctions // de maj qui durent trop longtemps define('_TIME_OUT', $time + _UPGRADE_TIME_OUT); reset($maj); while (list($v, ) = each($maj)) { // si une maj pour cette version if ($v == 'init' or spip_version_compare($v, $installee, '>') and spip_version_compare($v, $cible, '<=')) { if ($debut_page) { maj_debut_page($v, $meta, $table); } echo "MAJ {$v}"; $etape = serie_alter($v, $maj[$v], $meta, $table, $redirect); $trouver_table(''); // vider le cache des descriptions de table # echec sur une etape en cours ? # on sort if ($etape) { return array($v, $etape); } $n = time() - $time; spip_log("{$table} {$meta}: {$v} en {$n} secondes", 'maj.' . _LOG_INFO_IMPORTANTE); if ($meta) { ecrire_meta($meta, $installee = $v, 'oui', $table); } echo "<br />"; } if (time() >= _TIME_OUT) { relance_maj($meta, $table, $redirect); } } $trouver_table(''); // vider le cache des descriptions de table // indispensable pour les chgt de versions qui n'ecrivent pas en base // tant pis pour la redondance eventuelle avec ci-dessus if ($meta) { ecrire_meta($meta, $cible, 'oui', $table); } spip_log("MAJ terminee. {$meta}: {$installee}", 'maj.' . _LOG_INFO_IMPORTANTE); return array(); }