b5dab25261965328948095fd9fde61845cd3c7ef
[lhc/web/www.git] / www / plugins-dist / svp / inc / where_compatible_spip.php
1 <?php
2
3 /**
4 * Gestion des recherches de plugins par version ou branche
5 *
6 * @plugin SVP pour SPIP
7 * @license GPL
8 * @package SPIP\SVP\Recherche
9 **/
10
11 if (!defined("_ECRIRE_INC_VERSION")) {
12 return;
13 }
14
15 /**
16 * Construit le WHERE d'une requête SQL de selection des plugins ou paquets
17 * compatibles avec une version, une branche de spip ou une liste de branches.
18 *
19 * Cette fonction est appelée par le critère {compatible_spip}
20 *
21 * @used-by critere_compatible_spip_dist()
22 *
23 * @param string $version
24 * Numéro de version de SPIP, tel que 2.0.8 ou de branche tel que 3.1 ou une liste de branche '3.1,3.2'
25 * @param string $table
26 * Table d'application ou son alias SQL
27 * @param string $op
28 * Opérateur de comparaison, tel que '>' ou '='
29 * @return string
30 * Expression where de la requête SQL
31 */
32 function inc_where_compatible_spip($version, $table, $op) {
33
34 // En cas d'erreur sur le critère on annule l'effet du critère.
35 $where = '1=1';
36
37 // On verifie en premier si on a affaire à une liste de branches ou à une version/branche unique.
38 if (strpos($version, ',') === false) {
39 // Le critère concerne une version ou une branche unique.
40 if (count(explode('.', $version)) == 3) {
41 // le critere s'applique a une version x.y.z (1.9.2, 2.0.8, ...)
42 $min = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', 1)';
43 $max = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', -1)';
44
45 $where = 'CASE WHEN ' . $min . ' = \'\'
46 OR ' . $min . ' = \'[\'
47 THEN \'1.9.0\' <= \'' . $version . '\'
48 ELSE TRIM(LEADING \'[\' FROM ' . $min . ') <= \'' . $version . '\'
49 END
50 AND
51 CASE WHEN ' . $max . ' = \'\'
52 OR ' . $max . ' = \']\'
53 THEN \'99.99.99\' >= \'' . $version . '\'
54 WHEN ' . $max . ' = \')\'
55 OR ' . $max . ' = \'[\'
56 THEN \'99.99.99\' > \'' . $version . '\'
57 WHEN RIGHT(' . $max . ', 1) = \')\'
58 OR RIGHT(' . $max . ', 1) = \'[\'
59 THEN LEFT(' . $max . ', LENGTH(' . $max . ') - 1) > \'' . $version . '\'
60 ELSE LEFT(' . $max . ', LENGTH(' . $max . ') - 1) >= \'' . $version . '\'
61 END';
62 } elseif (count(explode('.', $version)) == 2) {
63 // le critere s'applique a une branche x.y unique (par exemple 1.9)
64 $where = 'LOCATE(\'' . $version . '\', ' . $table . '.branches_spip) ' . $op . ' 0';
65 }
66 } else {
67 // Le critère concerne forcément une liste de branches (la liste n'est pas disponible pour une version).
68 $branches = explode(',', $version);
69 $where_liste = '';
70 foreach ($branches as $_branche) {
71 // On vérifie qu'on est bien en présence d'une branche.
72 if (count(explode('.', $_branche)) == 2) {
73 $where_liste .= ($where_liste ? ' AND ' : '') . 'LOCATE(\'' . $_branche . '\', ' . $table . '.branches_spip) ' . $op . ' 0';
74 }
75 }
76
77 // Si non vide, on renvoie le where calculé.
78 if ($where_liste) {
79 $where = $where_liste;
80 }
81 }
82
83 return $where;
84 }