Completed
Push — master ( bc0916...92f140 )
by cam
04:43
created

v30.php ➔ maj_collation_sqlite()   C

Complexity

Conditions 12
Paths 21

Size

Total Lines 71

Duplication

Lines 11
Ratio 15.49 %

Importance

Changes 0
Metric Value
cc 12
nc 21
nop 0
dl 11
loc 71
rs 6.206
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Système de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright © avec tendresse depuis 2001                                 *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
10
 *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
11
\***************************************************************************/
12
13
/**
14
 * Gestion des mises à jour de bdd de SPIP
15
 * 
16
 * Mises à jour en 3.0
17
 *
18
 * @package SPIP\Core\SQL\Upgrade
19
 **/
20
if (!defined('_ECRIRE_INC_VERSION')) {
21
	return;
22
}
23
24
25
$GLOBALS['maj'][16428] = array(
26
	array('maj_liens', 'auteur'), // creer la table liens
27
	array('maj_liens', 'auteur', 'article'),
28
	array('sql_drop_table', "spip_auteurs_articles"),
29
	array('maj_liens', 'auteur', 'rubrique'),
30
	array('sql_drop_table', "spip_auteurs_rubriques"),
31
	array('maj_liens', 'auteur', 'message'),
32
	array('sql_drop_table', "spip_auteurs_messages"),
33
);
34
35
/**
36
 * Mise à jour des tables de liens
37
 *
38
 * Crée la table de lien au nouveau format (spip_xx_liens) ou insère
39
 * les données d'ancien format dans la nouveau format.
40
 *
41
 * Par exemple pour réunir en une seule table les liens de documents,
42
 * spip_documents_articles et spip_documents_forum
43
 *
44
 * Supprime la table au vieux format une fois les données transférées.
45
 *
46
 * @uses creer_ou_upgrader_table()
47
 * @uses maj_liens_insertq_multi_check()
48
 *
49
 * @param string $pivot
50
 *     Nom de la table pivot, tel que `auteur`
51
 * @param string $l
52
 *     Vide : crée la table de lien pivot.
53
 *     Sinon, nom de la table à lier, tel que `article`, et dans ce cas là,
54
 *     remplit spip_auteurs_liens à partir de spip_auteurs_articles.
55
 */
56
function maj_liens($pivot, $l = '') {
57
58
	@define('_LOG_FILTRE_GRAVITE', 8);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
59
60
	$exceptions_pluriel = array('forum' => 'forum', 'syndic' => 'syndic');
61
62
	$pivot = preg_replace(',[^\w],', '', $pivot); // securite
63
	$pivots = (isset($exceptions_pluriel[$pivot]) ? $exceptions_pluriel[$pivot] : $pivot . "s");
64
	$liens = "spip_" . $pivots . "_liens";
65
	$id_pivot = "id_" . $pivot;
66
	// Creer spip_auteurs_liens
67
	global $tables_auxiliaires;
68
	if (!$l) {
69
		include_spip('base/auxiliaires');
70
		include_spip('base/create');
71
		creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
72
	} else {
73
		// Preparer
74
		$l = preg_replace(',[^\w],', '', $l); // securite
75
		$primary = "id_$l";
76
		$objet = ($l == 'syndic' ? 'site' : $l);
77
		$ls = (isset($exceptions_pluriel[$l]) ? $exceptions_pluriel[$l] : $l . "s");
78
		$ancienne_table = 'spip_' . $pivots . '_' . $ls;
79
		$pool = 400;
80
81
		$trouver_table = charger_fonction('trouver_table', 'base');
82
		if (!$desc = $trouver_table($ancienne_table)) {
83
			return;
84
		}
85
86
		// securite pour ne pas perdre de donnees
87
		if (!$trouver_table($liens)) {
88
			return;
89
		}
90
91
		$champs = $desc['field'];
92
		if (isset($champs['maj'])) {
93
			unset($champs['maj']);
94
		}
95
		if (isset($champs[$primary])) {
96
			unset($champs[$primary]);
97
		}
98
99
		$champs = array_keys($champs);
100
		// ne garder que les champs qui existent sur la table destination
101
		if ($desc_cible = $trouver_table($liens)) {
102
			$champs = array_intersect($champs, array_keys($desc_cible['field']));
103
		}
104
105
		$champs[] = "$primary as id_objet";
106
		$champs[] = "'$objet' as objet";
107
		$champs = implode(', ', $champs);
108
109
		// Recopier les donnees
110
		$sub_pool = 100;
111
		while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
112
			$insert = array();
113
			foreach ($ids as $id) {
114
				$n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
115
				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
116
					$n += count($t);
117
					// empiler en s'assurant a minima de l'unicite
118
					while ($r = array_shift($t)) {
119
						$insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
120
					}
121
					if (count($insert) >= $sub_pool) {
122
						maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
123
						$insert = array();
124
					}
125
					// si timeout, sortir, la relance nous ramenera dans cette fonction
126
					// et on verifiera/repartira de la
127
					if (time() >= _TIME_OUT) {
128
						return;
129
					}
130
				}
131
				if (time() >= _TIME_OUT) {
132
					return;
133
				}
134
			}
135
			if (count($insert)) {
136
				maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
137
			}
138
			sql_delete($ancienne_table, sql_in($primary, $ids));
139
		}
140
	}
141
}
142
143
/**
144
 * Insère des données dans une table de liaison de façon un peu sécurisée
145
 *
146
 * Si une insertion multiple échoue, on réinsère ligne par ligne.
147
 *
148
 * @param string $table Table de liaison
149
 * @param array $couples Tableau de couples de données à insérer
150
 * @param array $desc Description de la table de liaison
151
 * @return void
152
 **/
153
function maj_liens_insertq_multi_check($table, $couples, $desc = array()) {
154
	$n_before = sql_countsel($table);
155
	sql_insertq_multi($table, $couples, $desc);
156
	$n_after = sql_countsel($table);
157
	if (($n_after - $n_before) == count($couples)) {
158
		return;
159
	}
160
	// si ecart, on recommence l'insertion ligne par ligne...
161
	// moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
162
	foreach ($couples as $c) {
163
		sql_insertq($table, $c, $desc);
164
	}
165
}
166
167
$GLOBALS['maj'][17311] = array(
168
	array(
169
		'ecrire_meta',
170
		"multi_objets",
171
		implode(',',
172
			array_diff(
173
				array(
174
					(isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
175
						? 'spip_rubriques' : '',
176
					(isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
177
						? 'spip_articles' : ''
178
				),
179
				array('')
180
			))
181
	),
182
	array(
183
		'ecrire_meta',
184
		"gerer_trad_objets",
185
		implode(',',
186
			array_diff(
187
				array(
188
					(isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
189
						? 'spip_articles' : ''
190
				),
191
				array('')
192
			))
193
	),
194
);
195
$GLOBALS['maj'][17555] = array(
196
	array('sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"),
197
	array('sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"),
198
);
199
200
$GLOBALS['maj'][17563] = array(
201
	array('sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"),
202
	array('sql_update', 'spip_articles', array('virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"), "chapo LIKE '=_%'"),
203
);
204
205
$GLOBALS['maj'][17577] = array(
206
	array('maj_tables', array('spip_jobs', 'spip_jobs_liens')),
207
);
208
209
$GLOBALS['maj'][17743] = array(
210
	array('sql_update', 'spip_auteurs', array('prefs' => 'bio', 'bio' => "''"), "statut='nouveau' AND bio<>''"),
211
);
212
213
$GLOBALS['maj'][18219] = array(
214
	array('sql_alter', "TABLE spip_rubriques DROP id_import"),
215
	array('sql_alter', "TABLE spip_rubriques DROP export"),
216
);
217
218
$GLOBALS['maj'][18310] = array(
219
	array('sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"),
220
);
221
222
$GLOBALS['maj'][18597] = array(
223
	array('sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"),
224
	array('maj_propager_les_secteurs'),
225
);
226
227
$GLOBALS['maj'][18955] = array(
228
	array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"),
229
	array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX objet (objet)"),
230
);
231
232
/**
233
 * Mise à jour pour recalculer les secteurs des rubriques
234
 *
235
 * @uses propager_les_secteurs()
236
 **/
237
function maj_propager_les_secteurs() {
238
	include_spip('inc/rubriques');
239
	propager_les_secteurs();
240
}
241
242
/**
243
 * Mise à jour des bdd SQLite pour réparer les collation des champs texte
244
 * pour les passer en NOCASE
245
 *
246
 * @uses base_lister_toutes_tables()
247
 * @uses _sqlite_remplacements_definitions_table()
248
 **/
249
function maj_collation_sqlite() {
250
251
252
	include_spip('base/dump');
253
	$tables = base_lister_toutes_tables();
254
255
	// rien a faire si base non sqlite
256
	if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
257
		return;
258
	}
259
260
	$trouver_table = charger_fonction('trouver_table', 'base');
261
	// forcer le vidage de cache
262
	$trouver_table('');
263
264
	// cas particulier spip_auteurs : retablir le collate binary sur le login
265
	$desc = $trouver_table("spip_auteurs");
266
	spip_log("spip_auteurs : " . var_export($desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
267
	if (stripos($desc['field']['login'], "BINARY") === false) {
268
		spip_log("Retablir champ login BINARY sur table spip_auteurs", "maj");
269
		sql_alter("table spip_auteurs change login login VARCHAR(255) BINARY");
270
		$trouver_table('');
271
		$new_desc = $trouver_table("spip_auteurs");
272
		spip_log("Apres conversion spip_auteurs : " . var_export($new_desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
273
	}
274
275
	foreach ($tables as $table) {
276
		if (time() >= _TIME_OUT) {
277
			return;
278
		}
279
		if ($desc = $trouver_table($table)) {
280
			$desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
281
			if ($d = array_diff($desc['field'], $desc_collate)) {
282
				spip_log("Table $table COLLATE incorrects", "maj");
283
284
				// cas particulier spip_urls :
285
				// supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
286
				if ($table == 'spip_urls') {
287
					// par date DESC pour conserver les urls les plus recentes
288
					$data = sql_allfetsel("*", "spip_urls", '', '', 'date DESC');
289
					$urls = array();
290
					foreach ($data as $d) {
291
						$key = $d['id_parent'] . "::" . strtolower($d['url']);
292
						if (!isset($urls[$key])) {
293
							$urls[$key] = true;
294
						} else {
295
							spip_log("Suppression doublon dans spip_urls avant conversion : " . serialize($d),
296
								"maj." . _LOG_INFO_IMPORTANTE);
297
							sql_delete("spip_urls", "id_parent=" . sql_quote($d['id_parent']) . " AND url=" . sql_quote($d['url']));
298
						}
299
					}
300
				}
301 View Code Duplication
				foreach ($desc['field'] as $field => $type) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
302
					if ($desc['field'][$field] !== $desc_collate[$field]) {
303
						spip_log("Conversion COLLATE table $table", "maj." . _LOG_INFO_IMPORTANTE);
304
						sql_alter("table $table change $field $field " . $desc_collate[$field]);
305
						$trouver_table('');
306
						$new_desc = $trouver_table($table);
307
						spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
308
							"maj." . _LOG_INFO_IMPORTANTE);
309
						continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
310
					}
311
				}
312
			}
313
		}
314
	}
315
316
	// forcer le vidage de cache
317
	$trouver_table('');
318
319
}
320
321
322
$GLOBALS['maj'][19236] = array(
323
	array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom='version_installee'"), // version base principale
324
	array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom LIKE '%_base_version'"),  // version base plugins
325
	array('maj_collation_sqlite'),
326
);
327
328
$GLOBALS['maj'][19268] = array(
329
	array('supprimer_toutes_sessions'),
330
);
331
332
/**
333
 * Supprime toutes les sessions des auteurs
334
 *
335
 * Obligera tous les auteurs à se reconnecter !
336
 **/
337
function supprimer_toutes_sessions() {
338
	spip_log("supprimer sessions auteur");
339
	if ($dir = opendir(_DIR_SESSIONS)) {
340
		while (($f = readdir($dir)) !== false) {
341
			spip_unlink(_DIR_SESSIONS . $f);
342
			if (time() >= _TIME_OUT) {
343
				return;
344
			}
345
		}
346
	}
347
}
348