Beispiel #1
0
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();
}
Beispiel #2
0
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`");
    }
}
Beispiel #3
0
/**
 * 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();
}