<?php

define ("VERBOSE",true);

//site différent
//==============

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 remplace($quoi,&$ou) {
if ($quoi=='demande') $nomid='message_id';
else $nomid=$quoi.'_id';
$tbl=$quoi.'s';	//demandes par exemple
global $$tbl;	//global $demandes
$conversion=&$$tbl; // si $tbl='eleves', $conversion pointe la même chose que $eleves
//remplacer par ex. l'ancien eleve_id=4 par le nouveau eleve_id=123, où 123=$eleve_id[4]
$cherche=$nomid.'=';
//ci-dessous, c'était très beau... mais erreur si pb dans la base (par exemple un reponse_id sans message_id : 
//cnv[message_id] n'est pas défini. Donc on découpe en deux temps
// $set=preg_replace("/$cherche-(\d+)/e","'$cherche'.\$cnv[$1]",$set);
$ret=0; 
if (preg_match("/$cherche(\d+)/e",$ou,$capture)) {
	$cnv=map($capture[1],$conversion);
    if ($cnv)  {
		$ou=preg_replace("/$cherche(\d+)/e","'$cherche'.\$cnv",$ou);
		$ret=$cnv;
		}
    else {
		print "<b>Conversion de $nomid impossible dans [$ou]</b><br />";
        }
    }
elseif (strpos($ou,$cherche.'NULL')) {
	$ret='NULL';	//il s'agit de comptes avec eleve_id ou prof_id='NULL'
	}
else print "<p><b>$nomid non trouvé dans [$ou]</b></p>";
return $ret;
}


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 $guide, $etab_id, $tini, $db;
list($oldetabid,$ligne)=each($tini['etablissements']);
$set=urldecode($ligne);
$rne=extraitstr('rne',$set);
$res=query("SELECT etab_id FROM etablissements WHERE rne='$rne'");
$trouve=false;
while (!$trouve && $row=mysql_fetch_array($res)) {
	$trouve=$row['etab_id']!=$etab_id;
	}
if ($trouve) {
	print "<p class=\"warning\">L'établissement restauré existe déjà dans le site (RNE = $rne).</p>";
	print "<p>Aucun changement n'a été effectué.</p>";
	print "</body></html>";
	exit();
	}
//l'ancien etab_id (celui du backup) est dans $etab_idbkp (variable globale)
pquery("UPDATE etablissements SET $set WHERE etab_id=$etab_id");

//supprimer toutes les données de "2e niveau" de l'étab (il ne s'agit pas de fusion ici)
delcascade2("SELECT prof_id FROM profs WHERE etab_id=$etab_id",
			array(	"DELETE FROM reponses WHERE prof_id ",
					"DELETE FROM lien_profs_classes WHERE prof_id ",
					"DELETE FROM lpi WHERE prof_id ",
					"DELETE FROM lrp WHERE prof_id ",
					"DELETE FROM comptes 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",
					"DELETE FROM comptes WHERE eleve_id "
				)
			);
	
//supprimer toutes les données de "1er niveau" de l'étab
query("DELETE FROM eleves WHERE etab_id=$etab_id AND tag<>-1");
query("DELETE FROM profs WHERE etab_id=$etab_id AND tag<>-1");
query("DELETE FROM classes WHERE etab_id=$etab_id");
query("DELETE FROM _params_auth WHERE etab_id=$etab_id");
query("DELETE FROM changements_logins WHERE etab_id=$etab_id");
query("DROP TABLE IF EXISTS $etab_id".'_conserves');

if (table_dans_base('divers',$db)) 
	query("DELETE FROM divers WHERE etab_id=$etab_id AND (motcle='eleves' OR motcle='profs')");
}

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);
	pquery("INSERT INTO $table SET $set, etab_id=$etab_id");
	}
}

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


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) {
// On ne s'intéresse pas aux éventuels doublons créés sur le site : une vérif des doublons aura lieu après 
global $guide, $etab_id, $tini, $eleves;
$eleves=array();
foreach($tini['eleves'] as $nid => $ligne) {
    $set=urldecode($ligne);
    remplace('classe',$set);
	pquery("INSERT eleves SET $set, etab_id=$etab_id");
	$eleves[$nid]=mysql_insert_id();
	}
}


function restore_res_bre($table) {
global $guide, $etab_id, $tini, $eleves, $resultats;
//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);
	remplace('eleve',$set);
	pquery("INSERT INTO $table SET $set");
	if ($table=='resultats') $resultats[$nid]=mysql_insert_id();
	}
}


function restore_dem($table) {
global $guide, $etab_id, $tini, $eleves, $demandes;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	$e=remplace('eleve',$set);
	if ($e) {
		pquery("INSERT INTO demandes SET $set");		
		$demandes[$nid]=mysql_insert_id();
		}	
	}
}

function restore_led_lec($table) {
//$table = led, lec
global $guide, $etab_id, $tini, $eleves, $classes;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $e=remplace('eleve',$set);
    if ($table=='lien_eleves_classes') $c=remplace('classe',$set);
    if ($e && $c) pquery("INSERT INTO $table SET $set");
	}
	
}


function restore_profs($table) {
global $guide, $etab_id, $tini, $profs;
$profs=array();
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	pquery("INSERT profs SET $set, etab_id=$etab_id");
	$profs[$nid]=mysql_insert_id();
	}
}

function restore_rep($table) {
global $guide, $etab_id, $tini, $demandes, $profs;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $d=remplace('demande',$set);
	$p=remplace('prof',$set);
	if ($d && $p) pquery("INSERT INTO reponses SET $set");
	}
}
		
function restore_lrp($table) {
global $guide, $etab_id, $tini, $profs, $resultats;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $r=remplace('resultat',$set);
    $p=remplace('prof',$set);
	if ($r && $p) pquery("INSERT INTO lrp SET $set");
	}
}	
		


function restore_lpc_lpi($table) {
//tables liées aux profs
global $guide, $etab_id, $tini, $profs, $classes;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
    $p=remplace('prof',$set);
    if ($table=='lien_profs_classes') $c=remplace('classe',$set);
    else $c=1; //pour faire réussir le test ci-dessous
	if ($c && $p) pquery("INSERT INTO $table SET $set");
	}
}

function restore_comptes($table) {
global $guide, $etab_id, $tini,$eleves, $profs;
foreach($tini[$table] as $nid => $ligne) {
    $set=urldecode($ligne);
	$eleve_id=remplace('eleve',$set);
	$prof_id=remplace('prof',$set);
	if ($eleve_id && $prof_id) 	{
		//peuvent valoir un nb>0 ou NULL
		pquery("INSERT INTO comptes SET $set, etab_id=$etab_id");
		$compte_id=mysql_insert_id();
		if ($eleve_id>0) {
			pquery("UPDATE eleves SET compte_id=$compte_id WHERE eleve_id=$eleve_id");
			}
		elseif ($prof_id>0) {
			pquery("UPDATE profs SET compte_id=$compte_id WHERE prof_id=$prof_id");
			}
		}
	}
}
	
?>