[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / dump / inc / dump.php
index 01c5f2f..dbc0da4 100644 (file)
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined("_ECRIRE_INC_VERSION")) return;
+/**
+ * API permettant la manipulation des sauvegardes
+ *
+ * @package SPIP\Dump\API
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 
 /**
- * Repertoire de sauvegarde
+ * Répertoire de sauvegarde
+ *
+ * Crée et retourne le chemin du répertoire de sauvegarde
+ *
+ * @see _DIR_DUMP
  *
  * @return string
  */
 function dump_repertoire() {
        $repertoire = _DIR_DUMP;
        if (!@file_exists($repertoire)
-               AND !$repertoire = sous_repertoire(_DIR_DUMP,'',false,true)
+               and !$repertoire = sous_repertoire(_DIR_DUMP, '', false, true)
        ) {
-               $repertoire = preg_replace(','._DIR_TMP.',', '', _DIR_DUMP);
+               $repertoire = preg_replace(',' . _DIR_TMP . ',', '', _DIR_DUMP);
                $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
        }
+
        return $repertoire;
 }
 
 
 /**
  * Nom du fichier de sauvegarde
- * la fourniture de l'extension permet de verifier que le nom n'existe pas deja
  *
- * @param string $dir
- * @param string $extension
+ * la fourniture de l'extension permet de vérifier que le nom n'existe pas déjà.
+ *
+ * @param string $dir Chemin de stockage du fichier
+ * @param string $extension Extension du fichier de sauvegarde
  * @return string
  */
-function dump_nom_fichier($dir,$extension='sqlite'){
+function dump_nom_fichier($dir, $extension = 'sqlite') {
        include_spip('inc/texte');
-       $site = isset($GLOBALS['meta']['nom_site'])
-         ? preg_replace(array(",\W,is",",_(?=_),",",_$,"),array("_","",""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])),30,""))
-         : 'spip';
+       $site = 'spip';
+       if (isset($GLOBALS['meta']['nom_site'])) {
+               $site = typo($GLOBALS['meta']['nom_site']); // extraire_multi
+               $site = couper(translitteration(trim($site)), 30, '');
+               $site = preg_replace(array(',\W,is', ',_(?=_),', ',_$,'), array('_', '', ''), $site);
+       }
 
        $site .= '_' . date('Ymd');
 
        $nom = $site;
-       $cpt=0;
-       while (file_exists($dir. $nom . ".$extension")) {
+       $cpt = 0;
+       while (file_exists($dir . $nom . ".$extension")) {
                $nom = $site . sprintf('_%03d', ++$cpt);
        }
-       return $nom.".$extension";
+
+       return $nom . ".$extension";
 }
 
 /**
- * Determine le type de serveur de sauvegarde
+ * Détermine le type de serveur de sauvegarde,
  * sqlite2 ou sqlite3
- * 
+ *
  * @return string
  */
 function dump_type_serveur() {
 
        // chercher si sqlite2 ou 3 est disponible
        include_spip('req/sqlite3');
-       if (spip_versions_sqlite3())
+       if (spip_versions_sqlite3()) {
                return 'sqlite3';
+       }
 
        include_spip('req/sqlite2');
-       if (spip_versions_sqlite2())
+       if (spip_versions_sqlite2()) {
                return 'sqlite2';
+       }
 
        return '';
 }
 
 /**
  * Conteneur pour les arguments de la connexion
- * si on passe $args, les arguments de la connexion sont memorises
- * renvoie toujours les derniers arguments memorises
  *
- * @staticvar array $connect_args
- * @param array $connect
+ * Si on passe $args, les arguments de la connexion sont memorisés.
+ * Renvoie toujours les derniers arguments memorisés.
+ *
+ * @staticvar array $connect_args    Pour stocker le premier conteneur
+ * @param array $args
  * @return array
  */
-function dump_serveur($args=null) {
+function dump_serveur($args = null) {
        static $connect_args = null;
-       if ($args)
+       if ($args) {
                $connect_args = $args;
+       }
 
        return $connect_args;
 }
 
 function dump_connect_args($archive) {
-       if (!$type_serveur = dump_type_serveur())
+       if (!$type_serveur = dump_type_serveur()) {
                return null;
-       return array(dirname($archive), '', '', '', basename($archive,".sqlite"), $type_serveur, 'spip');
+       }
+
+       return array(dirname($archive), '', '', '', basename($archive, '.sqlite'), $type_serveur, 'spip');
 }
 
 /**
  * Initialiser un dump
- * @param string $status_file
- * @param string $archive
- * @param array $tables
- * @param array $where
+ *
+ * @param string $status_file Fichier contenant les informations serialisees sur le statut de l'export
+ * @param string $archive Nom de l'archive (stockee dans le fichier de statut)
+ * @param array $tables Liste des tables a exporter (autocaculee par defaut)
+ * @param array $where Condition sur l'export
+ * @param string $action Pour differencier la sauvegarde de l'import
  * @return bool/string
  */
-function dump_init($status_file, $archive, $tables=null, $where=array(),$action='sauvegarde'){
-       $status_file = _DIR_TMP.basename($status_file).".txt";
+function dump_init($status_file, $archive, $tables = null, $where = array(), $action = 'sauvegarde') {
+       $status_file = _DIR_TMP . basename($status_file) . '.txt';
 
        if (lire_fichier($status_file, $status)
-               AND $status = unserialize($status)
-               AND $status['etape']!=='fini'
-               AND filemtime($status_file)>=time()-120) // si le fichier status est trop vieux c'est un abandon
-               return _T("dump:erreur_".$action."_deja_en_cours");
+               and $status = unserialize($status)
+               and $status['etape'] !== 'fini'
+               and filemtime($status_file) >= time() - 120
+       ) {
+               // si le fichier status est trop vieux c'est un abandon
+               return _T('dump:erreur_' . $action . '_deja_en_cours');
+       }
 
-       if (!$type_serveur = dump_type_serveur())
+       if (!$type_serveur = dump_type_serveur()) {
                return _T('dump:erreur_sqlite_indisponible');
+       }
 
-       if (!$tables)
-               list($tables,) = base_liste_table_for_dump(lister_tables_noexport());
-       $status = array('tables'=>$tables,'where'=>$where,'archive'=>$archive);
+       if (!$tables) {
+               list($tables, ) = base_liste_table_for_dump(lister_tables_noexport());
+       }
+       $status = array('tables' => $tables, 'where' => $where, 'archive' => $archive);
 
        $status['connect'] = dump_connect_args($archive);
        dump_serveur($status['connect']);
-       if (!spip_connect('dump'))
+       if (!spip_connect('dump')) {
                return _T('dump:erreur_creation_base_sqlite');
+       }
 
        // la constante sert a verifier qu'on utilise bien le connect/dump du plugin,
        // et pas une base externe homonyme
-       if (!defined('_DUMP_SERVEUR_OK'))
+       if (!defined('_DUMP_SERVEUR_OK')) {
                return _T('erreur_connect_dump', array('dump' => 'dump'));
+       }
 
        $status['etape'] = 'init';
 
-       if (!ecrire_fichier($status_file, serialize($status)))
-               return _T('dump:avis_probleme_ecriture_fichier',array('fichier'=>$status_file));
+       if (!ecrire_fichier($status_file, serialize($status))) {
+               return _T('dump:avis_probleme_ecriture_fichier', array('fichier' => $status_file));
+       }
 
        return true;
 }
 
 /**
  * Afficher l'avancement de la copie
- * @staticvar int $etape
- * @param <type> $courant
- * @param <type> $total
- * @param <type> $table
+ *
+ * @staticvar int $etape    Nombre de fois ou on est passe dans cette foncion
+ * @param <type> $courant   Flag pour indiquer si c'est la table sur laquelle on travaille actuellement
+ * @param <type> $total     Nombre total de tables
+ * @param <type> $table     Nom de la table
  */
-function dump_afficher_progres($courant,$total,$table) {
+function dump_afficher_progres($courant, $total, $table) {
        static $etape = 1;
        if (unique($table)) {
-               if ($total<0 OR !is_numeric($total))
-                       echo "<br /><strong>".$etape. '. '."</strong>$table ";
-               else
-                       echo "<br /><strong>".$etape. '. '."$table</strong> ".($courant?" <i>($courant)</i> ":"");
+               if ($total < 0 or !is_numeric($total)) {
+                       echo '<br /><strong>' . $etape . '. ' . "</strong>$table ";
+               } else {
+                       echo '<br /><strong>' . $etape . '. ' . "$table</strong> " . ($courant ? " <i>($courant)</i> " : '');
+               }
                $etape++;
        }
-       if (is_numeric($total) AND $total>=0)
-               echo ". ";
-       else
-               echo "(". (-intval($total)).")";
+       if (is_numeric($total) and $total >= 0) {
+               echo '. ';
+       } else {
+               echo '(' . (-intval($total)) . ')';
+       }
        flush();
 }
 
 /**
- * Ecrire le js pour relancer la procedure de dump
- * @param string $redirect
- * @return string
+ * Écrire le js pour relancer la procédure de dump
+ *
+ * @param string $redirect URL de la prochaine etape du dump
+ * @return string           Code HTML de redirection
  */
-function dump_relance($redirect){
+function dump_relance($redirect) {
        // si Javascript est dispo, anticiper le Time-out
        return "<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',300);</script>\n";
 }
 
 
 /**
- * Marquer la procedure de dump comme finie
+ * Marquer la procédure de dump comme finie
+ *
  * @param string $status_file
- * @return <type>
+ *     Fichier qui mémorise les infos utiles concernant la sauvegarde en cours
+ * @param string $action
+ *     Type d'action supplémentaire à réaliser :
+ *
+ *     - restaurer : supprimer la structure qui était stockée dans le dump
+ *     - 'auvegarder : stocker dans le dump la structure de la base source
  */
-function dump_end($status_file, $action=''){
-       $status_file = _DIR_TMP.basename($status_file).".txt";
+function dump_end($status_file, $action = '') {
+       $status_file = _DIR_TMP . basename($status_file) . '.txt';
        if (!lire_fichier($status_file, $status)
-               OR !$status = unserialize($status))
+               or !$status = unserialize($status)
+       ) {
                return;
-       
-       switch($action) {
+       }
+
+       switch ($action) {
                case 'restaurer':
                        // supprimer la structure qui etait stockee dans le dump
-                       sql_delete('spip_meta',"nom='dump_structure_temp'");
+                       sql_delete('spip_meta', "nom='dump_structure_temp'");
                        break;
                case 'sauvegarder':
                        // stocker dans le dump la structure de la base source
                        $structure = array();
-                       foreach($status['tables_copiees'] as $t=>$n)
-                               $structure[$t] = sql_showtable($t,true);
+                       foreach ($status['tables_copiees'] as $t => $n) {
+                               $structure[$t] = sql_showtable($t, true);
+                       }
                        dump_serveur($status['connect']);
                        spip_connect('dump');
-                       sql_delete('spip_meta',"nom='dump_structure_temp'",'dump'); #enlever une vieille structure deja la, au cas ou
-                       sql_insertq('spip_meta',array('nom'=>'dump_structure_temp','valeur'=>serialize($structure),'impt'=>'non'),array(),'dump');
+                       // si spip_meta n'a pas ete backup elle n'est pas dans le dump, il faut la creer pour y stocker cette meta
+                       if (!sql_showtable('spip_meta', true, 'dump')) {
+                               $desc = sql_showtable('spip_meta', true);
+                               sql_create('spip_meta', $desc['field'], $desc['key'], false, false, 'dump');
+                       }
+                       sql_delete('spip_meta', "nom='dump_structure_temp'", 'dump'); #enlever une vieille structure deja la, au cas ou
+                       sql_insertq(
+                               'spip_meta',
+                               array('nom' => 'dump_structure_temp', 'valeur' => serialize($structure), 'impt' => 'non'),
+                               array(),
+                               'dump'
+                       );
                        break;
        }
-       
+
        $status['etape'] = 'fini';
        ecrire_fichier($status_file, serialize($status));
 }
@@ -208,75 +265,115 @@ function dump_end($status_file, $action=''){
 /**
  * Lister les fichiers de sauvegarde existant dans un repertoire
  * trie par nom, date ou taille
- * 
- * @param string $dir
- * @param string $tri
- * @param string $extension
- * @param int $limit
+ *
+ * @param string $dir Repertoire de sauvegarde
+ * @param string $tri Tri pour recuperer les fichiers
+ * @param string $extension Extension des fichiers de sauvegarde
+ * @param int $limit Nombre max de fichiers listes
  * @return array
  */
-function dump_lister_sauvegardes($dir,$tri='nom',$extension="sqlite",$limit = 100) {
-       $liste_dump = preg_files($dir,'\.'.$extension.'$',$limit,false);
+function dump_lister_sauvegardes($dir, $tri = 'nom', $extension = 'sqlite', $limit = 100) {
+       $liste_dump = preg_files($dir, '\.' . $extension . '$', $limit, false);
 
        $n = strlen($dir);
        $tn = $tl = $tt = $td = array();
-       foreach($liste_dump as $fichier){
+       foreach ($liste_dump as $fichier) {
                $d = filemtime($fichier);
                $t = filesize($fichier);
                $fichier = substr($fichier, $n);
-               $tl[]= array('fichier'=>$fichier,'taille'=>$t,'date'=>$d);
+               $tl[] = array('fichier' => $fichier, 'taille' => $t, 'date' => $d);
                $td[] = $d;
                $tt[] = $t;
                $tn[] = $fichier;
        }
-       if ($tri == 'taille')
+       if ($tri == 'taille') {
                array_multisort($tt, SORT_ASC, $tl);
-       elseif ($tri == 'date')
+       } elseif ($tri == 'date') {
                array_multisort($td, SORT_ASC, $tl);
-       else
+       } else {
                array_multisort($tn, SORT_ASC, $tl);
+       }
+
        return $tl;
 }
 
-
+/**
+ * Extraire le statut contenu dans un fichier
+ *
+ * @param $status_file       Nom du fichier stocke dans _DIR_TMP
+ * @return array
+ */
 function dump_lire_status($status_file) {
-       $status_file = _DIR_TMP.basename($status_file).".txt";
+       $status_file = _DIR_TMP . basename($status_file) . '.txt';
        if (!lire_fichier($status_file, $status)
-               OR !$status = unserialize($status))
+               or !$status = unserialize($status)
+       ) {
                return '';
+       }
 
        return $status;
 }
 
+/**
+ * Verifier qu'un sauvegarde est finie
+ *
+ * @param $status_file      Nom du fichier stocke dans _DIR_TMP
+ * @return string           Chaine non vide s'il reste des choses a faire
+ */
 function dump_verifie_sauvegarde_finie($status_file) {
-       if (!$status=dump_lire_status($status_file)
-        OR $status['etape']!=='fini')
-        return '';
+       if (!$status = dump_lire_status($status_file)
+               or $status['etape'] !== 'fini'
+       ) {
+               return '';
+       }
+
        return ' ';
 }
 
+/**
+ * Recuperer le nom du fichier d'archivage qui est memorise dans le fichier de statut
+ *
+ * @param $status_file      Nom du fichier stocke dans _DIR_TMP
+ * @return string           Nom ou chaine vide si on a un probleme
+ */
 function dump_nom_sauvegarde($status_file) {
-       if (!$status=dump_lire_status($status_file)
-         OR !file_exists($f=$status['archive'].".sqlite"))
+       if (!$status = dump_lire_status($status_file)
+               or !file_exists($f = $status['archive'] . '.sqlite')
+       ) {
                return '';
+       }
 
        return $f;
 }
 
+/**
+ * Recuperer la taille du fichier de sauvegarde
+ *
+ * @param $status_file      Nom du fichier stocke dans _DIR_TMP
+ * @return string/int       Taille ou Chaine vide en cas de probleme
+ */
 function dump_taille_sauvegarde($status_file) {
-       if (!$f=dump_nom_sauvegarde($status_file)
-               OR !$s = filesize($f))
+       if (!$f = dump_nom_sauvegarde($status_file)
+               or !$s = filesize($f)
+       ) {
                return '';
+       }
 
        return $s;
 }
 
+/**
+ * Recuperer la date de derniere modification du fichier de sauvegarde
+ *
+ * @param $status_file      Nom du fichier stocke dans _DIR_TMP
+ * @return string/int       Date ou Chaine vide en cas de probleme
+ */
 function dump_date_sauvegarde($status_file) {
-       if (!$f=dump_nom_sauvegarde($status_file)
-               OR !$d = filemtime($f))
+       if (!$f = dump_nom_sauvegarde($status_file)
+               or !$d = filemtime($f)
+       ) {
                return '';
+       }
 
-       return date('Y-m-d',$d);
+       return date('Y-m-d', $d);
 }
-
-?>
\ No newline at end of file