source: spip-zone/_core_/plugins/revisions/revisions_administrations.php @ 93092

Last change on this file since 93092 was 93092, checked in by gilles.vincent@…, 4 years ago

Mise en forme plus homegene et plus lisible, pour les declarations des fonctions
Regles :

  • un espace après chaque virgule
  • un espace avant et apres chaque '='
File size: 8.6 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2015                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13/**
14 * Installation du plugin révisions
15 *
16 * @package SPIP\Revisions\Installation
17**/
18
19if (!defined('_ECRIRE_INC_VERSION')) return;
20
21/**
22 * Installation/maj des tables révisions
23 *
24 * @param string $nom_meta_base_version
25 * @param string $version_cible
26 */
27function revisions_upgrade($nom_meta_base_version, $version_cible){
28        // cas particulier :
29        // si plugin pas installe mais que la table existe
30        // considerer que c'est un upgrade depuis v 1.0.0
31        // pour gerer l'historique des installations SPIP <=2.1
32        if (!isset($GLOBALS['meta'][$nom_meta_base_version])){
33                $trouver_table = charger_fonction('trouver_table','base');
34                if ($desc = $trouver_table('spip_versions')
35                  AND isset($desc['exist']) AND $desc['exist']
36                  AND isset($desc['field']['id_article'])){
37                        ecrire_meta($nom_meta_base_version,'1.0.0');
38                }
39                // si pas de table en base, on fera une simple creation de base
40        }
41
42        $maj = array();
43        $maj['create'] = array(
44                array('maj_tables',array('spip_versions','spip_versions_fragments')),
45                array('revisions_upate_meta'),
46        );
47
48        $maj['1.1.0'] = array(
49                // Ajout du champs objet et modification du champs id_article en id_objet
50                // sur les 2 tables spip_versions et spip_versions_fragments
51                array('sql_alter',"TABLE spip_versions CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"),
52                array('sql_alter',"TABLE spip_versions ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
53                // Les id_objet restent les id_articles puisque les révisions n'étaient possibles que sur les articles
54                array('sql_updateq',"spip_versions",array('objet'=>'article'),"objet=''"),
55                // Changement des clefs primaires également
56                array('sql_alter',"TABLE spip_versions DROP PRIMARY KEY"),
57                array('sql_alter',"TABLE spip_versions ADD PRIMARY KEY (id_version, id_objet, objet)"),
58
59                array('sql_alter',"TABLE spip_versions_fragments CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"),
60                array('sql_alter',"TABLE spip_versions_fragments ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
61                // Les id_objet restent les id_articles puisque les révisions n'étaient possibles que sur les articles
62                array('sql_updateq',"spip_versions_fragments",array('objet'=>'article'),"objet=''"),
63                // Changement des clefs primaires également
64                array('sql_alter',"TABLE spip_versions_fragments DROP PRIMARY KEY"),
65                array('sql_alter',"TABLE spip_versions_fragments ADD PRIMARY KEY (id_objet, objet, id_fragment, version_min)"),
66                array('revisions_upate_meta'),
67        );
68        $maj['1.1.2'] = array(
69                array('revisions_upate_meta'),
70                array('sql_updateq',"spip_versions",array('objet'=>'article'),"objet=''"),
71                array('sql_updateq',"spip_versions_fragments",array('objet'=>'article'),"objet=''"),
72        );
73        $maj['1.1.3'] = array(
74                array('sql_alter',"TABLE spip_versions DROP KEY id_objet"),
75                array('sql_alter',"TABLE spip_versions ADD INDEX id_version (id_version)"),
76                array('sql_alter',"TABLE spip_versions ADD INDEX id_objet (id_objet)"),
77                array('sql_alter',"TABLE spip_versions ADD INDEX objet (objet)")
78        );
79        $maj['1.1.4'] = array(
80                array('sql_alter',"TABLE spip_versions CHANGE permanent permanent char(3) DEFAULT '' NOT NULL"),
81                array('sql_alter',"TABLE spip_versions CHANGE champs champs text DEFAULT '' NOT NULL"),
82        );
83        $maj['1.2.0'] = array(
84                array('revisions_uncompress_fragments'),
85                array('revisions_repair_unserialized_fragments'),
86        );
87
88        include_spip('base/upgrade');
89        maj_plugin($nom_meta_base_version, $version_cible, $maj);
90
91}
92
93function revisions_uncompress_fragments(){
94
95        $res = sql_select("*","spip_versions_fragments","compress=".intval(1));
96        while($row = sql_fetch($res)){
97                $fragment = @gzuncompress($row['fragment']);
98
99                // si la decompression echoue, on met en base le flag 'corrompu-gz'
100                // et au dump le framgment compresse dans un fichier
101                if (strlen($row['fragment']) AND $fragment===false){
102                        $dir_tmp = sous_repertoire(_DIR_TMP,"versions_fragments_corrompus");
103                        $f = $row['id_fragment']."-".$row['objet']."-".$row['id_objet'];
104                        spip_log("Fragment gz corrompu $f","maj"._LOG_ERREUR);
105                        $f = $f."-gz.txt";
106                        ecrire_fichier($dir_tmp . $f,$row['fragment']);
107                        $fragment = "corrompu-gz";
108                }
109
110                $set = array(
111                        'compress' => 0,
112                        'fragment' => $fragment,
113                );
114
115                sql_updateq("spip_versions_fragments",$set,"id_fragment=".intval($row['id_fragment'])." AND id_objet=".intval($row['id_objet'])." AND objet=".sql_quote($row['objet'])." AND version_min=".intval($row['version_min']));
116                if (time()>_TIME_OUT) return;
117        }
118
119        sql_updateq("spip_versions_fragments",array('compress'=>-1));
120
121}
122
123function revisions_repair_unserialized_fragments(){
124        $res = sql_select("*","spip_versions_fragments","compress=".intval(-1));
125        $n = sql_count($res);
126        spip_log("$n fragments a verifier","maj");
127        while($row = sql_fetch($res)){
128                $fragment = $row['fragment'];
129                $set = array(
130                        'compress' => 0,
131                );
132
133                // verifier que le fragment est bien serializable
134                if(unserialize($fragment)===false AND strncmp($fragment,"corrompu",8)!==0){
135                        $dir_tmp = sous_repertoire(_DIR_TMP,"versions_fragments_corrompus");
136                        $set['fragment'] = revisions_repair_serialise($fragment);
137                        if (strncmp($set['fragment'],"corrompu",8)==0){
138                                $f = $row['id_fragment'] . "-" . $row['objet'] . "-" . $row['id_objet'];
139                                spip_log("Fragment serialize corrompu $f", "maj" . _LOG_ERREUR);
140                                $f = $f . "-serialize.txt";
141                                ecrire_fichier($dir_tmp . $f, $fragment);
142                        }
143                }
144                sql_updateq("spip_versions_fragments",$set,$w = "id_fragment=".intval($row['id_fragment'])." AND id_objet=".intval($row['id_objet'])." AND objet=".sql_quote($row['objet'])." AND version_min=".intval($row['version_min']));
145                #spip_log($w,"maj");
146
147                if (time()>_TIME_OUT) return;
148        }
149}
150
151function revisions_repair_serialise($serialize){
152        if (unserialize($serialize))
153                return $serialize;
154
155        // verifier les strings
156        preg_match_all(",s:(\d+):\"(.*)\";(?=}|\w:\d+),Uims",$serialize,$matches,PREG_SET_ORDER);
157        $serialize_repair = $serialize;
158        foreach($matches as $match){
159                $s = $match[2];
160                $l = $match[1];
161                if (strlen($s)!==$l){
162                        if (strlen($s)<$l){
163                                $s = str_replace("\r\n","\n",$s);
164                                $s = str_replace("\r","\n",$s);
165                                $s = str_replace("\n","\r\n",$s);
166                        }
167                        if (strlen($s)>$l){
168                                $s = str_replace("\r\n","\n",$s);
169                                $s = str_replace("\r","\n",$s);
170                        }
171                        if (strlen($s)<$l){
172                                $s .= str_pad("",$l-strlen($s)," ");
173                        }
174                        if (strlen($s)==$l){
175                                $s = str_replace($match[2],$s,$match[0]);
176                                $serialize_repair = str_replace($match[0],$s,$serialize_repair);
177                        }
178                }
179        }
180        if (unserialize($serialize_repair))
181                return $serialize_repair;
182
183        // on essaye brutalement
184        $serialize_repair = $serialize;
185        $serialize_repair = str_replace("\r\n","\n",$serialize_repair);
186        $serialize_repair = str_replace("\r","\n",$serialize_repair);
187        if (unserialize($serialize_repair))
188                return $serialize_repair;
189        $serialize_repair = str_replace("\n","\r\n",$serialize_repair);
190        if (unserialize($serialize_repair))
191                return $serialize_repair;
192
193        #echo "Impossible de reparer la chaine :";
194        #var_dump($serialize);
195        #var_dump($matches);
196        #die("corrompu-serialize");
197        return  "corrompu-serialize";
198}
199
200
201/**
202 * Desinstallation/suppression des tables revisions
203 *
204 * @param string $nom_meta_base_version
205 */
206function revisions_vider_tables($nom_meta_base_version) {
207        sql_drop_table("spip_versions");
208        sql_drop_table("spip_versions_fragments");
209
210        effacer_meta($nom_meta_base_version);
211}
212
213/**
214 * Mettre a jour la meta des versions
215 * @return void
216 */
217function revisions_upate_meta(){
218        // Si dans une installation antérieure ou un upgrade, les articles étaient versionnés
219        // On crée la meta correspondante
220        // mettre les metas par defaut
221        $config = charger_fonction('config','inc');
222        $config();
223        if (isset($GLOBALS['meta']['articles_versions']) and $GLOBALS['meta']['articles_versions'] == 'oui'){
224                ecrire_meta('objets_versions',serialize(array('articles')));
225        }
226        effacer_meta('articles_versions');
227        if (!$versions = unserialize($GLOBALS['meta']['objets_versions']))
228                $versions = array();
229        $versions = array_map('table_objet_sql',$versions);
230        ecrire_meta('objets_versions',serialize($versions));
231}
232
233
234?>
Note: See TracBrowser for help on using the repository browser.