<?php

define ("VERBOSE",true);

//msmn (même site, même numéro)
//==============================

function extraitid($quoi,$ou) {
//d'une chaîne "....,machin_id=12,...", retrouve le 12 à partir de "machin"
if (preg_match("/$quoi=(\d+)/e",$ou,$capture)) return $capture[1];
else return 0;
}

function extraitstr($quoi,$ou) {
//d'une chaîne "....,truc='abel',...", retrouve abel à partir de "truc"
if (preg_match("/$quoi=\'(\w+)\'/e",$ou,$capture)) return $capture[1];
else return '';
}

function map($id,&$tab) {
//si l'objet $id de la table $tab a disparu de l'étab ou du site, retourne un mappage=0 pour cet objet
if (isset($tab[$id])) return $tab[$id];
else return 0;
}

function pquery($sql,$comment='') {
if (VERBOSE) {
	if ($comment) $comment='<i>'.$comment.'</i> : ';
	echo $comment,$sql,"<br />\n";
	}
query($sql);
}

function plquery($sql,$comment='') {
if (VERBOSE) print "&nbsp;&nbsp;&nbsp;-&nbsp;";
pquery($sql,'<i>'.$comment.'</i>');
}

function pchangeetab($set) {
if (VERBOSE) print "<i>Non restauré (chgt étab)</i> : ".$set.'<br />';
}

function pexiste($set) {
if (VERBOSE) print "<i>Existe encore</i> : ".$set.'<br />';
}
	
//==================================================================================

function restore_etab($table) {
global $vider, $guide, $etab_id, $tini, $db;
list($oldetabid,$set)=each($tini['etablissements']);
$set=urldecode($set);
pquery("UPDATE etablissements SET $set WHERE etab_id=$etab_id");
//supprimer les enregistrements de certaines tables de peu d'intérêt

if ($vider) {
	delcascade2("SELECT resultats.resultat_id 
					FROM resultats
					INNER JOIN eleves ON eleves.eleve_id=resultats.eleve_id
					WHERE eleves.etab_id=$etab_id",
				"DELETE FROM lrp WHERE resultat_id");
						
	delcascade2("SELECT demandes.message_id 
					FROM demandes
					INNER JOIN eleves ON eleves.eleve_id=demandes.eleve_id
					WHERE eleves.etab_id=$etab_id",
				"DELETE FROM reponses WHERE message_id");
				
	delcascade2("SELECT prof_id FROM profs WHERE etab_id=$etab_id",
				array(	"DELETE FROM lien_profs_classes WHERE prof_id",
						"DELETE FROM lpi WHERE prof_id"));

	delcascade2("SELECT eleve_id FROM eleves WHERE etab_id=$etab_id",
				array(	"DELETE FROM demandes WHERE eleve_id",
	    				"DELETE FROM lien_eleves_disciplines WHERE eleve_id",
	    				"DELETE FROM lien_eleves_classes WHERE eleve_id",
						"DELETE FROM brevets WHERE eleve_id",
						"DELETE FROM resultats WHERE eleve_id"));
	
	query("DELETE FROM eleves WHERE etab_id=$etab_id");
	query("DELETE FROM profs WHERE etab_id=$etab_id");
	query("DELETE FROM comptes WHERE etab_id=$etab_id");
	query("DELETE FROM classes WHERE etab_id=$etab_id");
	query("DELETE FROM libelles_perso WHERE etab_id=$etab_id");
	query("DELETE FROM _params_auth WHERE etab_id=$etab_id");
	if (table_dans_base('divers',$db)) 
		query("DELETE FROM divers WHERE etab_id=$etab_id");
	}
else {
	query("DELETE FROM eleves WHERE tag=1 AND etab_id=$etab_id");
	query("DELETE FROM profs WHERE tag=1 AND etab_id=$etab_id");
	if (table_dans_base('divers',$db)) 
		query("DELETE FROM divers WHERE etab_id=$etab_id AND (motcle='eleves' OR motcle='profs')");
	}
query("DELETE FROM changements_logins WHERE etab_id=$etab_id");
query("DELETE FROM erreurs_logins WHERE etab_id=$etab_id");
query("DROP TABLE IF EXISTS $etab_id".'_conserves');
}

function restore_libperso_parauth($table) {
global $guide, $etab_id, $tini;
//pas de suppression des nouveaux, vérification des anciens
foreach($tini[$table] as $nid => $ligne) {
	$set=urldecode($ligne);
	if ($table=='libelles_perso') $whereligne='item_id='.extraitid('item_id',$set);
	else $whereligne="param_nom='".extraitstr('param_nom',$set)."'";
	$res=query("SELECT etab_id FROM $table WHERE $whereligne AND etab_id=$etab_id");
	if (mysql_num_rows($res)==0) pquery("INSERT INTO $table SET $set, etab_id=$etab_id");
	else pexiste($set);
	}
}

function restore_cla($table) {
global $guide, $etab_id, $tini;
foreach($tini[$table] as $nid => $ligne) {
	$set=urldecode($ligne);
	pquery("REPLACE INTO classes SET $set, classe_id=$nid, etab_id=$etab_id","restauration");
	}
}

function restore_divers($table) {
global $guide, $etab_id, $tini;
foreach($tini[$table] as $nid => $ligne) {
	$set=urldecode($ligne);
	pquery("INSERT INTO divers SET $set, etab_id=$etab_id");
	}
}


function restore_eleves($table) {
global $guide, $etab_id, $tini, $mapeleves;
$mapeleves=array();$mapeleves[0]=0; //pour restore_comptes
foreach($tini['eleves'] as $nid => $ligne) {
    $set=urldecode($ligne);
	$res=query("SELECT etab_id,classe_id FROM eleves WHERE eleve_id=$nid");
	if (list($etab_actuel,$classe_act)=mysql_fetch_array($res)) {
		if ($etab_actuel==$etab_id) {
			pquery("UPDATE eleves SET $set WHERE eleve_id=$nid","mise à jour");
			$mapeleves[$nid]=$nid;
			if ($classe_act!=extraitid('classe_id',$set)) {
				//il a changé de classe depuis le backup : on supprime le lien actuel mais on ne touche pas aux groupes
				//l'ancien lien sera rétabli dans le restore de la table lien_eleves_classes
				plquery("DELETE FROM lien_eleves_classes WHERE eleve_id=$nid AND classe_id=$classe_act");
				}
			}
		else {
			pchangeetab($set);
			$mapeleves[$nid]=0; //changement d'étab donc pas de restitution
			}
		}
	else { 
		//l'enregistrement n'existe plus (supprimé) ; on le rétablit
		pquery("REPLACE eleves SET $set, eleve_id=$nid, etab_id=$etab_id","restauration");
		$mapeleves[$nid]=$nid;
		}
	}
}


function restore_res_bre($table) {
global $guide, $etab_id, $tini, $mapeleves;
//ces tables ont un id et une référence à un eleve_id
$nomid=getguide($table,'cle');
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    //les tables res et bre doivent être restituées, que l'élève soit dans l'étab ou qu'il en ait changé
	pquery("REPLACE $table SET $set, $nomid=$nid","restauration");
	}
}


function restore_dem($table) {
global $guide, $etab_id, $tini, $mapeleves, $mapclasses;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	$whereligne='message_id='.$nid;
	$obtenueligne=extraitid('obtenue',$set);
	if ($obtenueligne==0) {
		//danger : elle a pu être obtenue entre le backup et le restore
		$eleveligne=extraitid('eleve_id',$set);
		$itemligne=extraitid('item_id',$set);
		$discligne=extraitid('disc_id',$set);
		$resr=query("SELECT resultat_id FROM resultats WHERE eleve_id=$eleveligne AND item_id=$itemligne AND disc_id=$discligne");
		if (mysql_num_rows($resr)) { 
			/* Il faudrait changer l'état de la demande (obtenue et active) pour qu'elle reste cohérente 
			  puis après restauration des réponses, recalculer nboui et nbnon qui ont changé.
			  Pour alléger, on supprime la demande (qui n'a pas une utilité primordiale vu que l'item est acquis).
			  La restauration des réponses supprimera aussi les réponses postérieures
			  en s'apercevant qu'il n'y a plus de demande associée. 
			  L'élève aura quand même son résultat avec ses témoins dans lrp.  
			*/
			pquery("DELETE FROM demandes WHERE $whereligne","supprimée (résultat obtenu)");
			}
		else {
			/* Il n'y a pas de résultat associé à la demande
			  on la restaure et on restaurera de même les réponses trouvées dans le backup
			  On peut 
				 - conserver les réponses postérieures au backup. Il faut alors mettre à jour 
				 	les champs nboui et nbnon de la demande (lourd)
				 - supprimer ces réponses et effectuer ainsi un restore au sens habituel, sans mansuétude.
			   Ici, pour éviter de comparer les dates, on les supprime toutes. 
			   Celles obtenues avant le backup seront restaurées. 
			*/
			pquery("REPLACE demandes SET $set, $whereligne","restauration");		
			plquery("DELETE FROM reponses WHERE $whereligne","suppression des réponses nouvelles");
			}
		}
	else {
		//le résultat a été obtenu avant le backup. La demande et les réponses sont donc figées 
		//dans le backup et on peut les restaurer sans problème (les champs de la demande n'ont pas évolué).
		pquery("REPLACE demandes SET $set, $whereligne","restauration");		
		}
	}
}

function restore_rep($table) {
global $guide, $etab_id, $tini, $mapeleves;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $messageligne=extraitid('message_id',$set);
    //vérifier que la demande existe encore
	$res=query("SELECT eleve_id FROM demandes WHERE message_id=$messageligne");
	if (mysql_num_rows($res)) pquery("REPLACE reponses SET $set, reponse_id=$nid","restauration");
	}
}
		
function restore_lrp($table) {
global $guide, $etab_id, $tini, $mapprofs;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $profligne=extraitid('prof_id',$set);
	//le prof peut ne plus être dans l'étab : $mapprofs[$profligne] n'est pas défini
	//il peut même avoir quitté le site. Dans les 2 cas, l'enr de lrp n'est plus utilisable
    $prof_id=map($profligne,$mapprofs);
    if ($prof_id) {
		$whereligne=urldecode(str_replace(',',' AND ',$ligne));
		$res=query("SELECT * FROM lrp WHERE $whereligne");
		if (mysql_num_rows($res)==0) {
			pquery("INSERT INTO lrp SET $set");
			}
		else pexiste($set);
		}
	else pchangeetab($set);
	}
}	
		
function restore_led_lec($table) {
//$table = led, lec
global $guide, $etab_id, $tini, $mapeleves;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $eleveligne=extraitid('eleve_id',$set);
    $eleve_id=map($eleveligne,$mapeleves);
    if ($eleve_id) {
    	//l'élève est encore dans l'étab
		$whereligne=urldecode(str_replace(',',' AND ',$ligne)); 
		$res=query("SELECT * FROM $table WHERE $whereligne");
		if (mysql_num_rows($res)==0) pquery("INSERT INTO $table SET $set");
		else pexiste($set);
    	}
    else pchangeetab($set);
	}
	
}

function restore_profs($table) {
global $guide, $etab_id, $tini, $mapprofs;
$mapprofs=array();
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	$res=query("SELECT etab_id FROM profs WHERE prof_id=$nid");
	if (list($etab_actuel)=mysql_fetch_array($res)) {
		if ($etab_actuel==$etab_id) {
			pquery("UPDATE profs SET $set WHERE prof_id=$nid","mise à jour");
			$mapprofs[$nid]=$nid;
			plquery("DELETE FROM lien_profs_classes WHERE prof_id=$nid");
			}
		else {
			pchangeetab($set);
			$mapprofs[$nid]=0; //changement d'étab donc pas de restitution
			}
		}
	else { 
		//l'enregistrement n'existe plus (supprimé) ; on le rétablit
		pquery("REPLACE profs SET $set, prof_id=$nid, etab_id=$etab_id","restauration");
		$mapprofs[$nid]=$nid;
		}
	}
}


function restore_lpc_lpi($table) {
//tables liées aux profs
global $guide, $etab_id, $tini, $mapprofs;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $profligne=extraitid('prof_id',$set);
    $prof_id=map($profligne,$mapprofs);
    if ($prof_id) {
		$where=urldecode(str_replace(',',' AND ',$ligne)); //remplacer la virgule AVANT d'exécuter le urldecode
		$res=query("SELECT * FROM $table WHERE $where");
		if (mysql_num_rows($res)==0) {
			//restaurer l'enregistrement perdu
			pquery("INSERT INTO $table SET $set");
			}
		else pexiste($set); //existe encore
		}
	else pchangeetab($set);
	}
}

function restore_comptes($table) {
global $guide, $etab_id, $tini,$mapeleves, $mapprofs;
$mapprofs[0]=0;
$mapeleves[0]=0;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	$res=query("SELECT * FROM comptes WHERE compte_id=$nid");
	if ($row=mysql_fetch_array($res)) {
		$etab_actuel=$row['etab_id'];
		if ($etab_actuel==$etab_id) {
			pquery("UPDATE comptes SET $set WHERE compte_id=$nid", "mise à jour");
			}
		else pchangeetab($set);
		}
	else { 
		//on rétablit l'enregistrement supprimé avec une vérif supplémentaire 
		$eleveligne=extraitid('eleve_id',$set);
		$profligne=extraitid('prof_id',$set);
		$restore=false;
		if ($eleveligne) {
			$eleve_id=map($eleveligne,$mapeleves);
			if ($eleve_id) $restore=true;
			}
		elseif ($profligne) {
			$prof_id=map($profligne,$mapprofs);
			if ($prof_id) $restore=true;
			}
		else {
			//cas admin, gestion
			$restore=true;
			}
		if ($restore) pquery("REPLACE comptes SET $set, compte_id=$nid, etab_id=$etab_id", "restauration");
		else pchangeetab($set);
		}
	}
}
	
?>