/** * 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'; } }
// A ce niveau, le fichier de connexion à la base de données doit exister. if(!is_file(CHEMIN_FICHIER_CONFIG_MYSQL)) { exit('Erreur : problème avec le fichier : '.FileSystem::fin_chemin(CHEMIN_FICHIER_CONFIG_MYSQL).' !'); } // Créer les dossiers de fichiers temporaires par établissement if(HEBERGEUR_INSTALLATION=='mono-structure') { foreach(FileSystem::$tab_dossier_tmp_structure as $dossier) { FileSystem::creer_dossier($dossier.'0' , $affichage ); FileSystem::ecrire_fichier_index($dossier.'0'); } } // On cherche d'éventuelles tables existantes de SACoche. $DB_TAB = (HEBERGEUR_INSTALLATION=='mono-structure') ? DB_STRUCTURE_COMMUN::DB_recuperer_tables_informations() : DB_WEBMESTRE_PUBLIC::DB_recuperer_tables_informations() ; $nb_tables_presentes = !empty($DB_TAB) ? count($DB_TAB) : 0 ; if($nb_tables_presentes) { $s = ($nb_tables_presentes>1) ? 's' : '' ; $base_nom = (HEBERGEUR_INSTALLATION=='mono-structure') ? SACOCHE_STRUCTURE_BD_NAME : SACOCHE_WEBMESTRE_BD_NAME ; $affichage .= '<p><label class="alerte">'.$nb_tables_presentes.' table'.$s.' de SACoche étant déjà présente'.$s.' dans la base « <b>'.$base_nom.'</b> », les tables n\'ont pas été installées.</label></p>'.NL; $affichage .= '<p class="astuce">Si besoin, supprimez les tables manuellement, puis <a href="#" class="step6">relancer l\'étape 6.</a><label id="ajax_msg"> </label></p>'.NL; $affichage .= '<hr />'.NL; $affichage .= '<h2>Installation logicielle terminée</h2>'.NL; $affichage .= '<p>Pour se connecter avec le compte webmestre : <a href="'.URL_DIR_SACOCHE.'?webmestre">'.URL_DIR_SACOCHE.'?webmestre</a></p>'.NL; } else { if(HEBERGEUR_INSTALLATION=='mono-structure') {