Valider 9190faaa rédigé par cerdic's avatar cerdic
Parcourir les fichiers

L'API editer_liens s'enrichit d'une fonction objet_optimiser_liens chargee...

L'API editer_liens s'enrichit d'une fonction objet_optimiser_liens chargee d'optimiser les liens morts vers les objets effaces
Utilisation pour optimiser les liens documents (a la place du code buggue existant) et auteurs (n'etait pas pris en charge)
nettoyage des tables auxiliaires qui n'existent plus
parent c8b90b58
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+73 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -135,6 +135,27 @@ function objet_trouver_liens($objets_source,$objets_lies){
}


/**
 * Nettoyer les liens morts vers des objets qui n'existent plus
 * $objets_source et $objets sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * un * pour $objet,$id_objet permet de traiter par lot
 * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
 *
 * @param array $objets_source
 * @param array $objets_lies
 * @return int
 */
function objet_optimiser_liens($objets_source,$objets_lies){
	return objet_traiter_laisons('lien_optimise',$objets_source,$objets_lies);
}



/**
@@ -303,6 +324,58 @@ function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
	return ($echec?false:$dels);
}


/**
 * Sous fonction optimisation
 * qui nettoie les liens morts (vers un objet inexistant)
 * pour un objet source dont la cle primaire
 * et la table de lien sont fournies
 *
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 * un * pour $id,$objet,$id_objets permet de traiter par lot
 *
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @return int
 */
function lien_optimise($objet_source,$primary,$table_lien,$id,$objets){
	$echec = false;
	$dels = 0;
	foreach($objets as $objet => $id_objets){
		$objet = objet_type($objet); # securite
		if (!is_array($id_objets)) $id_objets = array($id_objets);
		foreach($id_objets as $id_objet) {
			$where = lien_where($primary, $id, $objet, $id_objet);
			# les liens des objets qui sont lies a un objet inexistant
			$r = sql_select("DISTINCT objet",$table_lien,$where);
			while ($t = sql_fetch($r)){
				$type = $t['objet'];
				$spip_table_objet = table_objet_sql($type);
				$id_table_objet = id_table_objet($type);
				$res = sql_select("L.$primary AS id,id_objet",
								"$table_lien AS L
									LEFT JOIN $spip_table_objet AS O
										ON O.$id_table_objet=L.id_objet AND L.objet=".sql_quote($type),
						"O.$id_table_objet IS NULL");
				// sur une cle primaire composee, pas d'autres solutions que de virer un a un
				while ($row = sql_fetch($res)){
					$e = sql_delete($table_lien, array("$primary=".$row['id'],"id_objet=".$row['id_objet'],"objet=".sql_quote($type)));
					if ($e!=false){
						$dels+=$e;
						spip_log("Entree ".$row['id']."/".$row['id_objet']."/$type supprimee dans la table $table_lien");
					}
				}
			}
		}
	}
	return ($echec?false:$dels);
}


/**
 * Sous fonction qualification
 * qui traite les liens pour un objet source dont la cle primaire
+1 −36
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -34,32 +34,7 @@ $spip_auteurs_liens = array(
$spip_auteurs_liens_key = array(
		"PRIMARY KEY"		=> "id_auteur,id_objet,objet",
		"KEY id_auteur"	=> "id_auteur");
/*
$spip_auteurs_articles = array(
		"id_auteur"	=> "bigint(21) DEFAULT '0' NOT NULL",
		"id_article"	=> "bigint(21) DEFAULT '0' NOT NULL");

$spip_auteurs_articles_key = array(
		"PRIMARY KEY"	=> "id_auteur, id_article",
		"KEY id_article"	=> "id_article");

$spip_auteurs_rubriques = array(
		"id_auteur"	=> "bigint(21) DEFAULT '0' NOT NULL",
		"id_rubrique"	=> "bigint(21) DEFAULT '0' NOT NULL");

$spip_auteurs_rubriques_key = array(
		"PRIMARY KEY"	=> "id_auteur, id_rubrique",
		"KEY id_rubrique"	=> "id_rubrique");

$spip_auteurs_messages = array(
		"id_auteur"	=> "bigint(21) DEFAULT '0' NOT NULL",
		"id_message"	=> "bigint(21) DEFAULT '0' NOT NULL",
		"vu"		=> "CHAR (3)");

$spip_auteurs_messages_key = array(
		"PRIMARY KEY"	=> "id_auteur, id_message",
		"KEY id_message"	=> "id_message");
*/
$spip_documents_liens = array(
		"id_document"	=> "bigint(21) DEFAULT '0' NOT NULL",
		"id_objet"	=> "bigint(21) DEFAULT '0' NOT NULL",
@@ -78,17 +53,7 @@ $spip_meta = array(

$spip_meta_key = array(
		"PRIMARY KEY"	=> "nom");
/*
$tables_auxiliaires['spip_auteurs_articles'] = array(
	'field' => &$spip_auteurs_articles,
	'key' => &$spip_auteurs_articles_key);
$tables_auxiliaires['spip_auteurs_rubriques'] = array(
	'field' => &$spip_auteurs_rubriques,
	'key' => &$spip_auteurs_rubriques_key);
$tables_auxiliaires['spip_auteurs_messages'] = array(
	'field' => &$spip_auteurs_messages,
	'key' => &$spip_auteurs_messages_key);
*/

$tables_auxiliaires['spip_auteurs_liens'] = array(
	'field' => &$spip_auteurs_liens,
	'key' => &$spip_auteurs_liens_key);
+13 −40
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -69,10 +69,10 @@ function optimiser_sansref($table, $id, $sel, $and="")
{
	$in = array();
	while ($row = sql_fetch($sel)) $in[$row['id']]=true;
	sql_free($sel);

	if ($in) {
		$in = join(',', array_keys($in));
		sql_delete($table,  sql_in($id,$in) . ($and?" AND $and":""));
		sql_delete($table,  sql_in($id,array_keys($in)) . ($and?" AND $and":""));
		spip_log("Numeros des entrees $id supprimees dans la table $table: $in");
	}
	return count($in);
@@ -141,32 +141,18 @@ function optimiser_base_disparus($attente = 86400) {
	// Auteurs
	//

	# les liens d'articles sur des auteurs effaces
	# les liens d'objets sur des auteurs effaces
	$res = sql_select("L.id_auteur AS id",
		      "spip_auteurs_liens AS L
		        LEFT JOIN spip_auteurs AS A
		          ON L.id_auteur=A.id_auteur",
			"L.objet='article' AND A.id_auteur IS NULL");
			"A.id_auteur IS NULL");

	$n+= optimiser_sansref('spip_auteurs_liens', 'id_auteur', $res, "objet='article'");
	$n+= optimiser_sansref('spip_auteurs_liens', 'id_auteur', $res);

	# les liens de messages sur des auteurs effaces
	$res = sql_select("M.id_auteur AS id",
		      "spip_auteurs_liens AS M
		        LEFT JOIN spip_auteurs AS A
		          ON M.id_auteur=A.id_auteur",
			"M.objet='message' AND A.id_auteur IS NULL");

	$n+= optimiser_sansref('spip_auteurs_liens', 'id_auteur', $res, "objet='message'");

	# les liens de rubriques sur des auteurs effaces
	$res = sql_select("A.id_objet AS id",
		      "spip_auteurs_liens AS A
		        LEFT JOIN spip_rubriques AS R
		          ON A.id_objet=R.id_rubrique",
			"A.objet='rubrique' AND R.id_rubrique IS NULL");

	$n+= optimiser_sansref('spip_auteurs_liens', 'id_objet', $res, "objet='rubrique'");
	include_spip('action/editer_liens');
	// optimiser les liens de tous les auteurs vers des objets effaces
	$n+= objet_optimiser_liens(array('document'=>'*','*'));

	# effacer les auteurs poubelle qui ne sont lies a rien
	$res = sql_select("A.id_auteur AS id",
@@ -187,23 +173,10 @@ function optimiser_base_disparus($attente = 86400) {
	// Documents
	//

	# les liens des documents qui sont lies a un objet inexistant
	$r = sql_select("DISTINCT objet","spip_documents_liens");
	while ($t = sql_fetch($r)){
		$type = $t['objet'];
		$spip_table_objet = table_objet_sql($type);
		$id_table_objet = id_table_objet($type);
		$res = sql_select("L.id_document AS id,id_objet",
			      "spip_documents_liens AS L
			        LEFT JOIN $spip_table_objet AS O
			          ON O.$id_table_objet=L.id_objet AND L.objet=".sql_quote($type),
				"O.$id_table_objet IS NULL");
		// sur une cle primaire composee, pas d'autres solutions que de virer un a un
		while ($row = sql_fetch($sel)){
			sql_delete("spip_documents_liens", array("id_document=".$row['id'],"id_objet=".$row['id_objet'],"objet=".sql_quote($type)));
			spip_log("Entree ".$row['id']."/".$row['id_objet']."/$type supprimee dans la table spip_documents_liens");
		}
	}
	include_spip('action/editer_liens');
	// optimiser les liens de tous les documents vers des objets effaces
	$n+= objet_optimiser_liens(array('document'=>'*','*'));
	

	// on ne nettoie volontairement pas automatiquement les documents orphelins