Skip to content
Extraits de code Groupes Projets
Valider 6e878b83 rédigé par Eric Lupinacci's avatar Eric Lupinacci Validation de Gitea
Parcourir les fichiers

Fix de l'utilisation d'une table meta différente pour un plugin donné.

On fait aussi évoluer la feature en permettant de mettre plusieurs plugins dans une même table autre que spip_meta.
parent 56956668
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -215,7 +215,7 @@ function maj_base($version_cible = 0, $redirect = '') {
function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') {
if ($table_meta !== 'meta') {
lire_metas($table_meta);
installer_table_meta($table_meta);
}
$current_version = null;
......
......@@ -260,12 +260,7 @@ function ecrire_config($cfg, $store) {
return false;
} // la config n'existait deja pas !
effacer_meta($casier, $table);
if (!count($GLOBALS[$table])
or count($GLOBALS[$table]) == 1 and isset($GLOBALS[$table]['charset'])
) {
effacer_meta('charset', $table); // enlevons cette meta
supprimer_table_meta($table); // supprimons la table (si elle est bien vide)
}
supprimer_table_meta($table); // supprimons la table (si elle est bien vide)
} // les meta ne peuvent etre que des chaines : il faut serializer le reste
else {
if (!isset($GLOBALS[$table])) {
......
......@@ -124,15 +124,17 @@ function lire_metas($table = 'meta') {
function touch_meta($antidate = false, $table = 'meta') {
$file = cache_meta($table);
if (!$antidate or !@touch($file, $antidate)) {
$r = $GLOBALS[$table];
unset($r['alea_ephemere']);
unset($r['alea_ephemere_ancien']);
// le secret du site est utilise pour encoder les contextes ajax que l'on considere fiables
// mais le sortir deu cache meta implique une requete sql des qu'on a un form dynamique
// meme si son squelette est en cache
//unset($r['secret_du_site']);
if ($antidate) {
$r['touch'] = $antidate;
$r = isset($GLOBALS[$table]) ? $GLOBALS[$table] : array();
if ($table == 'meta') {
unset($r['alea_ephemere']);
unset($r['alea_ephemere_ancien']);
// le secret du site est utilise pour encoder les contextes ajax que l'on considere fiables
// mais le sortir deu cache meta implique une requete sql des qu'on a un form dynamique
// meme si son squelette est en cache
//unset($r['secret_du_site']);
if ($antidate) {
$r['touch'] = $antidate;
}
}
ecrire_fichier_securise($file, serialize($r));
}
......@@ -271,15 +273,47 @@ function installer_table_meta($table) {
* @param bool $force
*/
function supprimer_table_meta($table, $force = false) {
if ($table == 'meta') {
return;
} // interdit !
if ($table !== 'meta') {
// Vérifier le contenu restant de la table
$nb_variables = sql_countsel("spip_$table");
if ($force or !sql_countsel("spip_$table")) {
unset($GLOBALS[$table]);
sql_drop_table("spip_$table");
// vider le cache des tables
$trouver_table = charger_fonction('trouver_table', 'base');
$trouver_table('');
// Supprimer si :
// - la table est vide
// - ou limitée à la variable charset
// - ou qu'on force la suppression
if (
$force
or !$nb_variables
or (
($nb_variables == 1)
and isset($GLOBALS[$table]['charset'])
)
) {
// Supprimer la table des globaleset de la base
unset($GLOBALS[$table]);
sql_drop_table("spip_$table");
// Supprimer le fichier cache
include_spip('inc/flock');
$cache = cache_meta($table);
supprimer_fichier($cache);
// vider le cache des tables
$trouver_table = charger_fonction('trouver_table', 'base');
$trouver_table('');
// Supprimer la table de la liste des tables de configuration autres que spip_meta
if (isset($GLOBALS['meta']['tables_config'])) {
$liste = unserialize($GLOBALS['meta']['tables_config']);
$cle = array_search($table, $liste);
if ($cle !== false) {
unset($liste[$cle]);
if ($liste ) {
ecrire_meta('tables_config', serialize($liste));
} else {
effacer_meta('tables_config');
}
}
}
}
}
}
......@@ -39,7 +39,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @note
* La fonction quitte (retourne false) si le plugin
* n'a pas de version d'installation définie
* (information `version_base` dans le paquet.xml)
* (information `schema` dans le paquet.xml)
*
* @param string $plug
* Nom du plugin
......@@ -53,12 +53,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - le tableau de get_infos sinon
*/
function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') {
// Charger les informations du XML du plugin et vérification de l'existence d'une installation
$get_infos = charger_fonction('get_infos', 'plugins');
$infos = $get_infos($plug, false, constant($dir_type));
if (!isset($infos['install']) or !$infos['install']) {
return false;
}
// passer en chemin absolu si possible, c'est plus efficace
// Passer en chemin absolu si possible, c'est plus efficace
$dir = str_replace('_DIR_', '_ROOT_', $dir_type);
if (!defined($dir)) {
$dir = $dir_type;
......@@ -70,31 +73,50 @@ function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') {
include_once($file);
}
}
$version = isset($infos['schema']) ? $infos['schema'] : '';
$arg = $infos;
// Détermination de la table meta et du nom de la meta plugin
$table = 'meta';
if (isset($infos['meta']) and ($infos['meta'] !== 'meta')) {
$table = $infos['meta'];
// S'assurer que les metas de la table spécifique sont bien accessibles dans la globale
lire_metas($table);
}
$nom_meta = $infos['prefix'] . '_base_version';
// Détermination de la fonction à appeler et de ses arguments
$f = $infos['prefix'] . "_install";
if (!function_exists($f)) {
$f = isset($infos['schema']) ? 'spip_plugin_install' : '';
$arg = $infos;
// On passe la table et la meta pour éviter de les recalculer dans la fonction appelée
$arg['meta'] = $table;
$arg['nom_meta'] = $nom_meta;
} else {
// Ancienne méthode d'installation - TODO à supprimer à terme
// stupide: info deja dans le nom
$arg = $infos['prefix'];
} // stupide: info deja dans le nom
}
$version = isset($infos['schema']) ? $infos['schema'] : '';
if (!$f) {
// installation sans operation particuliere
$infos['install_test'] = array(true, '');
return $infos;
}
// Tester si l'action demandée est nécessaire ou pas.
$test = $f('test', $arg, $version);
if ($action == 'uninstall') {
$test = !$test;
}
// Si deja fait, on ne dit rien
// Si deja fait, on ne fait rien et on ne dit rien
if ($test) {
return true;
}
// Si install et que l'on a la meta d'installation, c'est un upgrade
if ($action == 'install' && !is_null(lire_meta($infos['prefix'] . '_base_version'))) {
// Si install et que l'on a la meta d'installation, c'est un upgrade. On le consigne dans $infos
// pour renvoyer le bon message en retour de la fonction.
if ($action == 'install' && !empty($GLOBALS[$table][$nom_meta])) {
$infos['upgrade'] = true;
}
......@@ -104,25 +126,41 @@ function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') {
$f($action, $arg, $version);
$aff = ob_get_contents();
ob_end_clean();
// vider le cache des descriptions de tables a chaque (de)installation
$trouver_table = charger_fonction('trouver_table', 'base');
$trouver_table('');
$infos['install_test'] = array($f('test', $arg, $version), $aff);
// Si la table meta n'est pas spip_meta et qu'on est dans la première installation du plugin
// on force la création du fichier cache à la date du moment.
// On relit les metas de la table pour être sur que la globale soit à jour pour touch_meta.
if (
($table !== 'meta')
and ($action == 'install')
and empty($infos['upgrade'])
) {
touch_meta(false, $table);
}
return $infos;
}
// Fonction par defaut pour install/desinstall
// http://code.spip.net/@spip_plugin_install
/**
* Fonction standard utilisée par defaut pour install/desinstall
*
* @param string $action
* Nom de l'action (install|uninstall)
* @param array $infos
* Tableau des informations du XML du plugin complété par le nom et la table meta
* @param string $version_cible
* Référence de la version du schéma de données cible
*
* @return bool|void
*/
function spip_plugin_install($action, $infos, $version_cible) {
$prefix = $infos['prefix'];
if (isset($infos['meta']) and (($table = $infos['meta']) !== 'meta')) {
$nom_meta = "base_version";
} else {
$nom_meta = $prefix . "_base_version";
$table = 'meta';
}
$nom_meta = $infos['nom_meta'];
$table = $infos['meta'];
switch ($action) {
case 'test':
return (isset($GLOBALS[$table])
......@@ -130,12 +168,12 @@ function spip_plugin_install($action, $infos, $version_cible) {
and spip_version_compare($GLOBALS[$table][$nom_meta], $version_cible, '>='));
break;
case 'install':
if (function_exists($upgrade = $prefix . "_upgrade")) {
if (function_exists($upgrade = $infos['prefix'] . '_upgrade')) {
$upgrade($nom_meta, $version_cible, $table);
}
break;
case 'uninstall':
if (function_exists($vider_tables = $prefix . "_vider_tables")) {
if (function_exists($vider_tables = $infos['prefix'] . '_vider_tables')) {
$vider_tables($nom_meta, $table);
}
break;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter