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

Last change on this file since 93651 was 93651, checked in by marcimat@…, 5 years ago

Meilleure compatibilité avec PSR-2 et nos règles d'écriture, en appliquant
différents fix avec php-cs-fixers. Fixers appliqués ici :

'encoding', utf8
'eof_ending',
un saut de ligne en fin de fichier
'elseif', elseif plutôt que else if
'function_call_space',
espaces sur fonctions
'function_declaration', espaces sur fonctions
'function_typehint_space',
espaces sur fonctions
'linefeed', sauts de ligne \n uniquement
'lowercase_constants',
true, false, null en munuscule
'lowercase_keywords', mots clés PHP en lowercase
'method_argument_space',
espaces sur appels de fonctions
'multiple_use', use unique sur fonctions anonymes
'newline_after_open_tag',
ouverture de php… et c'est tout sur cette ligne
'operators_spaces', espaces de part et d'autres des opérateurs binaires
'parenthesis',
pas d'espace juste après parenthèse ouvrante, ou avant parenthèse fermante
'php_closing_tag', pas de fermeture de php
'short_tag',
tag PHP corrects
'trailing_spaces', pas d'espace qui traîne en fin de ligne
'visibility',
déclarer 'public / private / protected' sur les méthodes

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