Commit 52bda3c8 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Les sauvegardes de BDDs se font maintenant avec des fichiers ZIP et non des répertoires

parent ee51dfa6
Loading
Loading
Loading
Loading
+3 −2
Changes for admin/actions/help.php: 3 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -27,8 +27,9 @@ $actions = [
    "update-employeur"          => "Mise à jour de la table employeur à partir d'une source (par défault source INSEE)",
    "build-synchronisation"     => "Reconstruction des vues différentielles et des procédures de mise à jour",
    "fichiers-vers-filesystem"  => "Déplace le contenu des fichiers (table FICHIER) vers le système de fichiers",
    "save-bdd"                  => "Sauvegarde une base de données dans un répertoire du système de fichiers",
    "load-bdd"                  => "Charge une base de données à partir d'un répertoire du système de fichiers",
    "save-bdd <Fichier cible>"  => "Sauvegarde une base de données dans un fichier"
        . "\n\t--fichiers=n : Ignore le contenu des fichiers stockée dans la table FICHIER",
    "load-bdd <Fichier source>" => "Charge une base de données à partir d'un fichier de sauvegarde",
];
$actionsDev = [
    "update-ddl"            => "Mise à jour du fichier de définition de la base de données à partir de cette dernière",
+4 −9
Changes for admin/actions/load-bdd.php: 4 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@

$bdd = $oa->getBdd();

$filename = $c->getArg()[2];

$c->println("Chargement d'une base de données", $c::COLOR_CYAN);
if ($c->getOption('doload') !== 'oui') {
    $c->println("Ce script va charger votre base à l'aide des données fournies. Ceci écrasera vos données actuelles. Voulez-vous poursuivre l'opération ?\n(tapez \"oui\" pour continuer)...");
@@ -10,13 +12,6 @@ if ($c->getOption('doload') !== 'oui') {
    if ($doLoad != 'oui') $c->printDie("Interruption de l'opération de chargement de la base de données");
}

$bdd->load($filename);

if (!$c->hasOption('dir')) {
    $c->print("Veuillez entrer le répertoire où se trouvent les données à charger: ");
}
$dir = $c->getInput('dir');


$bdd->load($dir);

$bdd->majSequences();
 No newline at end of file
//$bdd->majSequences();
 No newline at end of file
+6 −6
Changes for admin/actions/save-bdd.php: 6 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -2,14 +2,14 @@

$bdd = $oa->getBdd();

$c->println("Sauvegarde d'une base de données", $c::COLOR_CYAN);
$filename = $c->getArg()[2];

if (!$c->hasOption('dir')) {
    $c->print("Veuillez entrer le répertoire où seront enregistrées les données : ");
}
$dir = $c->getInput('dir');
$c->println("Sauvegarde d'une base de données", $c::COLOR_CYAN);

$fichiers = true;
if ($c->hasOption('fichiers')) {
    $fichiers = $c->getInput('fichiers', "Les contenus de la table FICHIER doivent-ils être inclus ? (O/N)", 'bool');
}

$fncs = [
    'SYNC_LOG' => function ($d) {
@@ -25,4 +25,4 @@ if (!$fichiers) {
    };
}

$bdd->save($dir, [], $fncs);
 No newline at end of file
$bdd->save($filename, [], $fncs);
 No newline at end of file
+48 −18
Changes for admin/src/BddAdmin/Bdd.php: 48 added lines, 18 removed lines.
Original line number Diff line number Diff line
@@ -845,26 +845,25 @@ class Bdd


    /**
     * @param string                $filename
     * @param DdlFilters|array|null $filters
     * @param array                 $fncs
     *
     * @throws Exception
     */
    public function save(string $dirname, $filters = [], array $fncs = [])
    public function save(string $filename, $filters = [], array $fncs = [])
    {
        $this->logBegin("Sauvegarde de la base de données");

        if (!is_dir($dirname)) {
            mkdir($dirname);
        }
        if (!is_dir($dirname)) {
            throw new \Exception("Création du répertoire $dirname impossible");
        if (file_exists($filename)) {
            throw new Exception('Le fichier existe déjà, merci de le supprimer ou bien de trouver un nouveau nom');
        }

        // On supprime les fichiers existants s'il y en a
        $files = array_diff(scandir($dirname), ['.', '..']);
        foreach ($files as $file) {
            unlink("$dirname/$file");
        if (!class_exists('ZipArchive')) {
            throw new Exception('Zip extension not loaded');
        }
        $archive = new \ZipArchive();
        $archive->open($filename, \ZipArchive::CREATE);

        foreach ($fncs as $table => $fnc) {
            if (false === $fnc) {
@@ -876,32 +875,54 @@ class Bdd
        }
        $ddl = $this->getDdl($filters);

        $ddl->saveToFile($dirname . '/bdd.ddl');
        $archive->addFromString('bdd.ddl', $ddl->saveToString());

        $tables = array_keys($ddl->get(Ddl::TABLE));
        sort($tables);
        $tmpNames = [];
        foreach ($tables as $table) {
            $fnc = isset($fncs[$table]) ? $fncs[$table] : null;
            if (false !== $fnc) {
                $this->getTable($table)->save($dirname . '/' . $table . '.tbl', $fnc);
                $tmpname    = tempnam(sys_get_temp_dir(), uniqid());
                $tmpNames[] = $tmpname;
                $this->getTable($table)->save($tmpname, $fnc);
                if (file_exists($tmpname)) {
                    $archive->addFile($tmpname, $table . '.tbl');
                }
            }
        }

        $archive->close();
        foreach ($tmpNames as $tmpName) {
            if (file_exists($tmpName)) {
                unlink($tmpName);
            }
        }
        $this->logEnd();
    }



    public function load(string $dirname, $filters = [], array $fncs = [])
    public function load(string $filename, $filters = [], array $fncs = [])
    {
        $this->logBegin("Restauration de la base de données");

        if (!file_exists($dirname . '/bdd.ddl')) {
            throw new \Exception("Le répertoire $dirname ne contient pas de sauvegarde valide de base de données");
        if (!file_exists($filename)) {
            throw new \Exception("Le fichier $filename n\'existe pas ou bien il n'a pas été trouvé");
        }

        $tmpPath = tempnam(sys_get_temp_dir(), uniqid());
        unlink($tmpPath);

        $archive = new \ZipArchive();
        if (true !== $archive->open($filename)) {
            throw new Exception('La sauvegarde n\'est pas lisible');
        }
        $archive->extractTo($tmpPath);
        $archive->close();

        $ddl = new Ddl();
        $ddl->loadFromFile($dirname . '/bdd.ddl');
        $ddl->loadFromFile($tmpPath . '/bdd.ddl');
        $ddl->filter($filters);

        $tDdl = $ddl->get(Ddl::TABLE);
@@ -914,10 +935,10 @@ class Bdd
        sort($tables);
        $this->inCopy = true;
        foreach ($tables as $table) {
            if (file_exists($dirname . '/' . $table . '.tbl')) {
            if (file_exists($tmpPath . '/' . $table . '.tbl')) {
                $fnc = isset($fncs[$table]) ? $fncs[$table] : null;
                if (false !== $fnc) {
                    $this->getTable($table)->load($dirname . '/' . $table . '.tbl', $fnc);
                    $this->getTable($table)->load($tmpPath . '/' . $table . '.tbl', $fnc);
                }
            }
        }
@@ -928,6 +949,15 @@ class Bdd

        $this->logEnd();

        $dir = opendir($tmpPath);
        while (false !== ($file = readdir($dir))) {
            if (($file != '.') && ($file != '..')) {
                unlink($tmpPath . '/' . $file);
            }
        }
        closedir($dir);
        rmdir($tmpPath);

        return $this;
    }
}
 No newline at end of file
+13 −4
Changes for admin/src/BddAdmin/Ddl/Ddl.php: 13 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -334,16 +334,25 @@ class Ddl implements \Iterator, \ArrayAccess



    public function saveToString(): string
    {
        $data = $this->data;
        asort($data);

        $ddlString = "<?php\n\n//@" . "formatter:off\n\nreturn " . $this->arrayExport($data) . ";\n\n//@" . "formatter:on\n";

        return $ddlString;
    }



    /**
     * @param array  $ddl
     * @param string $filename
     */
    public function saveToFile(string $filename)
    {
        $data = $this->data;
        asort($data);

        $this->writeArray($filename, $data);
        file_put_contents($filename, $this->saveToString());
    }