Skip to content
Extraits de code Groupes Projets
Valider f346f0ed rédigé par cerdic's avatar cerdic
Parcourir les fichiers

passer a base_copier_tables la liste des tables a ne pas effacer systematiquement

preparer chaque table de destination correspondante a une table source en la droppant/recreant avec la meme structure, ou en l'upgradant simplement si meta ou auteurs
parent e329b76c
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -205,7 +205,7 @@ function base_liste_table_for_dump($exclude_tables = array()){ ...@@ -205,7 +205,7 @@ function base_liste_table_for_dump($exclude_tables = array()){
* @param array $tables * @param array $tables
* @param string $serveur * @param string $serveur
*/ */
function base_vider_tables_destination_copie($tables, $serveur=''){ function base_vider_tables_destination_copie($tables, $exlure_tables = array(), $serveur=''){
$trouver_table = charger_fonction('trouver_table', 'base'); $trouver_table = charger_fonction('trouver_table', 'base');
spip_log('Vider '.count($tables) . " tables sur serveur '$serveur' : " . join(', ', $tables),'base'); spip_log('Vider '.count($tables) . " tables sur serveur '$serveur' : " . join(', ', $tables),'base');
...@@ -261,16 +261,59 @@ function base_detruire_copieur_si_besoin($serveur='') ...@@ -261,16 +261,59 @@ function base_detruire_copieur_si_besoin($serveur='')
} }
/** /**
* Preparer la table dans la base de destination :
* la droper si elle existe (sauf si auteurs ou meta sur le serveur principal)
* la creer si necessaire, ou ajouter simplement les champs manquants
* *
* @param <type> $tables * @param string $table
* @param <type> $serveur_source * @param array $desc
* @param <type> $serveur_dest * @param string $serveur_dest
* @param <type> $callback_progression * @param bool $init
* @param <type> $max_time * @return array
* @param <type> $drop_source */
function base_preparer_table_dest($table, $desc, $serveur_dest, $init=false) {
$upgrade = false;
// si la table existe et qu'on est a l'init, la dropper
if ($desc_dest=sql_showtable($table,false,$serveur_dest) AND $init) {
if ($serveur_dest=='' AND in_array($table,array('spip_meta','spip_auteurs'))) {
// ne pas dropper auteurs et meta sur le serveur principal
// faire un simple upgrade a la place
// pour ajouter les champs manquants
$upgrade = true;
}
else {
sql_drop_table($table);
}
$desc_dest = false;
}
// si la table n'existe pas dans la destination, la creer a l'identique !
if (!$desc_dest) {
include_spip('base/create');
$autoinc = (isset($desc['keys']['PRIMARY KEY']) AND strpos($desc['keys']['PRIMARY KEY'],',')===false);
creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade,$serveur_dest);
$desc_dest = sql_showtable($table,false,$serveur_dest);
}
return $desc_dest;
}
/**
* Copier de base a base
* @param array $tables
* liste des tables a copier
* @param string $serveur_source
* @param string $serveur_dest
* @param string $callback_progression
* fonction a appeler pour afficher la progression
* @param int $max_time
* limite de temps au dela de laquelle sortir de la fonction proprement (de la forme time()+15)
* @param bool $drop_source
* vider les tables sources apres copie
* @param array $no_erase_dest
* liste des tables a ne pas vider systematiquement (ne seront videes que si existent dans la base source)
* @return <type> * @return <type>
*/ */
function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_progression = '', $max_time=0, $drop_source = false) { function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_progression = '', $max_time=0, $drop_source = false, $no_erase_dest = array()) {
spip_log("Copier ".count($tables)." tables de '$serveur_source' vers '$serveur_dest'",'dump'); spip_log("Copier ".count($tables)." tables de '$serveur_source' vers '$serveur_dest'",'dump');
$status_file = _DIR_TMP . "dump-copy-".md5(serialize($tables)."-$serveur_source-$serveur_dest").".txt"; $status_file = _DIR_TMP . "dump-copy-".md5(serialize($tables)."-$serveur_source-$serveur_dest").".txt";
...@@ -286,7 +329,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p ...@@ -286,7 +329,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p
// si init pas encore faite, vider les tables du serveur destination // si init pas encore faite, vider les tables du serveur destination
if (!$initialisation_copie) { if (!$initialisation_copie) {
base_vider_tables_destination_copie($tables, $serveur_dest); base_vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
$status["dump_status_copie"]='ok'; $status["dump_status_copie"]='ok';
ecrire_fichier($status_file,serialize($status)); ecrire_fichier($status_file,serialize($status));
} }
...@@ -311,13 +354,8 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p ...@@ -311,13 +354,8 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p
if (!isset($status['tables_copiees'][$table])) if (!isset($status['tables_copiees'][$table]))
$status['tables_copiees'][$table] = 0; $status['tables_copiees'][$table] = 0;
// si la table n'existe pas dans la destination, la creer a l'identique ! if ($status['tables_copiees'][$table]!==-1
if (!$desc_dest = sql_showtable($table,false,$serveur_dest)) { AND $desc_dest = base_preparer_table_dest($table, $desc_source, $serveur_dest, $status['tables_copiees'][$table] == 0)){
$autoinc = (isset($desc_source['keys']['PRIMARY KEY']) AND strpos($desc_source['keys']['PRIMARY KEY'],',')===false);
sql_create($table, $desc_source['field'], $desc_source['key'], $autoinc, false, $serveur_dest);
$desc_dest = sql_showtable($table,false,$serveur_dest);
}
if ($status['tables_copiees'][$table]!==-1){
if ($callback_progression) if ($callback_progression)
$callback_progression(0,0,$table); $callback_progression(0,0,$table);
while (true) { while (true) {
...@@ -328,7 +366,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p ...@@ -328,7 +366,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p
// si l'enregistrement est deja en base, ca fera un echec ou un doublon // si l'enregistrement est deja en base, ca fera un echec ou un doublon
sql_insertq($table,$row,$desc_dest,$serveur_dest); sql_insertq($table,$row,$desc_dest,$serveur_dest);
$status['tables_copiees'][$table]++; $status['tables_copiees'][$table]++;
if ($max_time AND time()>$_SERVER['REQUEST_TIME']+$max_time) if ($max_time AND time()>$max_time)
break; break;
} }
if ($n == $status['tables_copiees'][$table]) if ($n == $status['tables_copiees'][$table])
...@@ -337,7 +375,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p ...@@ -337,7 +375,7 @@ function base_copier_tables($tables, $serveur_source, $serveur_dest, $callback_p
if ($callback_progression) if ($callback_progression)
$callback_progression($status['tables_copiees'][$table],0,$table); $callback_progression($status['tables_copiees'][$table],0,$table);
ecrire_fichier($status_file,serialize($status)); ecrire_fichier($status_file,serialize($status));
if ($max_time AND time()>$_SERVER['REQUEST_TIME']+$max_time) if ($max_time AND time()>$max_time)
return false; // on a pas fini, mais le temps imparti est ecoule return false; // on a pas fini, mais le temps imparti est ecoule
} }
if ($drop_source) { if ($drop_source) {
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter