Example #1
0
/**
 * sauvegarder_tables_base_etablissement
 * Remplir le dossier temporaire avec les fichiers de svg des tables
 * Pour une sauvegarde individuelle, scindé en plusieurs étapes pour éviter un dépassement du max_execution_time sur de grosses bases.
 * Par contre pour une sauvegarde par un webmestre d'un ensemble de structures, c'était trop compliqué à découper, on fait tout d'un coup.
 *
 * @param string $dossier
 * @param int    $etape   (0 si tout d'un coup)
 * @return string
 */
function sauvegarder_tables_base_etablissement($dossier_temp, $etape)
{
    if ($etape == 0 || $etape == 1) {
        // Nombre d'enregistrements à récupérer par "SELECT * FROM table_nom" et donc ensuite inséré par "INSERT INTO table_nom VALUES (...),(...),(...)"
        $nb_lignes_maxi = determiner_nombre_lignes_maxi_par_paquet();
        // Lister les tables présentes et le nombre de boucles à effectuer afin de récupérer les données des grosses tables (nombre d'enregistrements / nb_lignes_maxi)
        // On met ça en session pour les appels suivants si sauvegarde en plusieurs étapes.
        $_SESSION['tab_tables_info'] = array();
        $DB_TAB = DB_STRUCTURE_COMMUN::DB_recuperer_tables_informations();
        foreach ($DB_TAB as $DB_ROW) {
            // $nb_lignes_maxi est prévu pour "sacoche_saisie" qui comporte beaucoup de lignes, mais les tables avec des champs longs deviennent lourdes avec moins de lignes
            switch ($DB_ROW['Name']) {
                case 'sacoche_image':
                    $nb_lignes_maxi_for_table = $nb_lignes_maxi / 100;
                    break;
                case 'sacoche_user':
                    $nb_lignes_maxi_for_table = $nb_lignes_maxi / 4;
                    break;
                case 'sacoche_officiel_saisie':
                    $nb_lignes_maxi_for_table = $nb_lignes_maxi / 2;
                    break;
                default:
                    $nb_lignes_maxi_for_table = $nb_lignes_maxi;
            }
            $nombre_boucles = max(ceil($DB_ROW['Rows'] / $nb_lignes_maxi_for_table), 1);
            // Parcourir au moins une fois la boucle pour une table sans enregistrement
            for ($numero_boucle = 0; $numero_boucle < $nombre_boucles; $numero_boucle++) {
                $_SESSION['tab_tables_info'][] = array('TableNom' => $DB_ROW['Name'], 'NombreLignes' => $nb_lignes_maxi_for_table, 'NombreBoucles' => $nombre_boucles, 'NumeroBoucle' => $numero_boucle);
            }
        }
        if ($etape == 1) {
            // Fin de la première étape
            return 'Sauvegarde de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée';
        }
    }
    // Créer les fichiers sql table par table, et morceau par morceau...
    if (count($_SESSION['tab_tables_info'])) {
        $i_stop = $etape ? min(10, count($_SESSION['tab_tables_info'])) : count($_SESSION['tab_tables_info']);
        for ($i = 0; $i < $i_stop; $i++) {
            $tab_table_info = array_shift($_SESSION['tab_tables_info']);
            extract($tab_table_info);
            // TableNom NombreLignes NombreBoucles NumeroBoucle
            $fichier_contenu = '';
            // ... la structure
            if ($NumeroBoucle == 0) {
                $fichier_contenu .= 'DROP TABLE IF EXISTS ' . $TableNom . ';' . "\r\n";
                $DB_ROW = DB_STRUCTURE_COMMUN::DB_recuperer_table_structure($TableNom);
                $fichier_contenu .= str_replace('`', '', $DB_ROW['Create Table']) . ';' . "\r\n";
                $fichier_contenu .= 'ALTER TABLE ' . $TableNom . ' DISABLE KEYS;' . "\r\n";
            }
            // ... les données
            $tab_ligne_insert = array();
            $from = $NumeroBoucle * $NombreLignes;
            $DB_TAB = DB_STRUCTURE_COMMUN::DB_recuperer_table_donnees($TableNom, $from, $NombreLignes);
            if (!empty($DB_TAB)) {
                foreach ($DB_TAB as $DB_ROW) {
                    $DB_ROW = array_map('formater_valeur', $DB_ROW);
                    $tab_ligne_insert[] = '(' . implode(',', $DB_ROW) . ')';
                }
                $fichier_contenu .= 'INSERT INTO ' . $TableNom . ' VALUES ' . "\r\n" . implode(',' . "\r\n", $tab_ligne_insert) . ';' . "\r\n";
            }
            if ($NumeroBoucle == $NombreBoucles - 1) {
                $fichier_contenu .= 'ALTER TABLE ' . $TableNom . ' ENABLE KEYS;' . "\r\n";
            }
            // Enregistrer le fichier
            $fichier_sql_nom = 'dump_' . $TableNom . '_' . sprintf("%03u", $NumeroBoucle) . '.sql';
            FileSystem::ecrire_fichier($dossier_temp . $fichier_sql_nom, $fichier_contenu);
        }
        if ($etape > 0) {
            return 'Sauvegarde de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée';
        } else {
            unset($_SESSION['tab_tables_info']);
            return TRUE;
        }
    } else {
        // A la dernière étape on ne fait rien ici, on zippe juste les fichiers après appel de cette fonction
        unset($_SESSION['tab_tables_info']);
        return 'Sauvegarde de la base terminée';
    }
}