Valider 765fa38b rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Un bug serieux sur la sauvegarde : lors de l'insertion on ne comptait pas sur...

Un bug serieux sur la sauvegarde : lors de l'insertion on ne comptait pas sur la table destination mais sur la table source, ce qui entrainait systematiquement une double insertion (une fois en multi puis une fois un par un)
Pouvait provoquer une erreur avec abandon qui manquait de log et n'etait pas signale dans le status. On corrige donc les consequences d'une telle erreur.
parent 2598f98a
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+13 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -570,6 +570,9 @@ function base_copier_tables($status_file, $tables, $serveur_source, $serveur_des
						// mais si ca renvoie false c'est une erreur fatale => abandon
						if ($inserer_copie($table,$rows,$desc_dest,$serveur_dest)===false) {
							// forcer la sortie, charge a l'appelant de gerer l'echec
							spip_log("Erreur fatale dans $inserer_copie table $table","dump"._LOG_ERREUR);
							$status['errors'][] = "Erreur fatale  lors de la copie de la table $table";
							ecrire_fichier($status_file,serialize($status));
							// copie finie
							return true;
						}
@@ -641,15 +644,23 @@ function base_copier_tables($status_file, $tables, $serveur_source, $serveur_des
function base_inserer_copie($table,$rows,$desc_dest,$serveur_dest){

	// verifier le nombre d'insertion
	$nb1 = sql_countsel($table);
	$nb1 = sql_countsel($table,'','','',$serveur_dest);
	// si l'enregistrement est deja en base, ca fera un echec ou un doublon
	$r = sql_insertq_multi($table,$rows,$desc_dest,$serveur_dest);
	$nb = sql_countsel($table);
	$nb = sql_countsel($table,'','','',$serveur_dest);
	if ($nb-$nb1<count($rows)){
		spip_log("base_inserer_copie : ".($nb-$nb1)." insertions au lieu de ".count($rows).". On retente 1 par 1","dump"._LOG_INFO_IMPORTANTE);
		foreach($rows as $row){
			// si l'enregistrement est deja en base, ca fera un echec ou un doublon
			$r = sql_insertq($table,$row,$desc_dest,$serveur_dest);
		}
		// on reverifie le total
		$r = 0;
		$nb = sql_countsel($table,'','','',$serveur_dest);
		if ($nb-$nb1<count($rows)){
			spip_log("base_inserer_copie : ".($nb-$nb1)." insertions au lieu de ".count($rows)." apres insertion 1 par 1","dump"._LOG_ERREUR);
			$r = false;
		}
	}
	return $r;
}