1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| <?php
set_time_limit(0);
ini_set('memory_limit', '2G');
echo "<h1 id=top>Générateur de différentiel de base de données</h1>";
$original = "p2.sql"; // export de la base de données d'origine
$modifie = "a2.sql"; // export de la base de données modifiée
$diff = "diff.sql"; // nom du fichier de résultat
$ct_idem = 0; // Compteur des lignes présentes dans les deux fichiers
$o_arr = file($original, FILE_SKIP_EMPTY_LINES); // Ou ouvre le fichier original sous forme de tableau. (comme ça on peut le parcourir)
$add = file($modifie, FILE_SKIP_EMPTY_LINES); // On ouvre le fichier modifié sous forme de tableau.
$del = array(); // dell est le tableau dans le quel on va ajouter les instruction de suppression des ligne qui était présente dans le fichier d'orrigine
// mais qui ont été supprimé dans le fichier modifié
foreach($o_arr as $i => $line){ // Pour chaque ligne du fichier d'origine
$key = array_search($line, $add);
if($key === null){
//ERROR
}
if(!$key){ // Cette ligne était dans le fichier d'origine mais n'existe plus dans le fichier modifié
$del[] = del($line); // On ajoute à la liste des lignes à supprimer
}else{
$add[$key] = ''; // Cette ligne est présente dans les deux fichiers. Elle n'est donc pas intéressante. On la neutralise.
$ct_idem++;
}
}
// $add ne contient plus que les lignes du fichier modifié qui n'était pas déjà présente dans le fichier d'origine.
// Les lignes qui n'était pas dans le fichier d'origine sont toujours là.
// $del contient les DELETE des lignes qui était dans le fichier d'origine mais qui n'existe plus dans le fichier modifié.
// Dans la première boucle on a simplement remplacer les lignes à supprimer par des lignes vides.
// On va maintenant les supprimer pour de bon.
$add2 = array();
foreach($add as $line){
if(trim($line)){
$add2[] = $line;
}
}
$add= $add2;
if (is_writable($diff)) {
// 'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
if (!$handle = fopen($diff, 'w')) {
echo "Impossible d'ouvrir le fichier ($diff)";
}else{
if (fwrite($handle, implode('',$del)) === FALSE) {
echo "Impossible d'écrire dans le fichier ($diff)";
}
if (fwrite($handle, implode('',$add)) === FALSE) {
echo "Impossible d'écrire dans le fichier ($diff)";
}
fclose($handle);
}
} else {
echo "Le fichier $diff n'est pas accessible en écriture.";
}
/* ========================================================================== */
/** Transforme une instruction REPLACE en DELETE */
function del($line){
// REPLACE INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES(5865, 862, '78');
$p1 = strpos($line, '`')+1;
$p2 = strpos($line, '`', $p1);
$table = substr($line, $p1, $p2-$p1);
$p3 = strpos($line, '(')+1;
$p4 = strpos($line, ')', $p3);
$atts = substr($line, $p3, $p4-$p3);
$p5 = strpos($line, '(', $p4)+1;
$p6 = strpos($line, ')', $p5);
$vals = substr($line, $p5, $p6-$p5);
$att_array = explode(',', $atts);
$val_array = explode(',', $vals);
$att_array = array_map('trim', $att_array);
$val_array = array_map('trim', $val_array);
$id_key = array_search('`id`', $att_array);
$id = $val_array[$id_key];
$del = "DELETE FROM $table WHERE id=$id;\n";
return $del;
} |
Partager