/** * 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'; } }