[spip-dev] Bug de sauvegarde (SPIP 3+) avec un préfixe de table différent de 'spip'

Bonjour,

Il y a un bug avec les sauvegardes de SPIP 3 dès lors qu'un préfixe de table est appliqué.

Le cas se présente dès que des champs en plus sont déclarés à SPIP. Par exemple avec le plugin «compositions» seul (ou encore avec Motus qui indiquait le problème dans son forum).

Les tables avec des entrées (par exemple articles ou rubriques ou mots clés) et ayant les champs de «composition» en plus ne s'exportent pas.

Le log indique que l'insertion des données ne peut se faire car la colonne «composition» (et autres) n'existe pas dans la table de destination.

En remontant un peu le problème vient d'ici :
http://core.spip.org/projects/spip/repository/entry/spip/ecrire/base/dump.php#L533

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, false);

Cette ligne retourne bien toutes les colonnes dans le cas du préfixe de table 'spip', mais juste celles déclarées dans SPIP (core) dans le cadre d'un autre préfixe de table.

Je ne sais pas trop ce qu'il faut faire pour corriger en fait. Passer le dernier argument à true ? Mais je me dis que s'il a été mis à false il doit y avoir une raison.

MM.

Bonjour,

Il y a un bug avec les sauvegardes de SPIP 3 dès lors qu'un préfixe de
table est appliqué.

[...]

En remontant un peu le problème vient d'ici :
http://core.spip.org/projects/spip/repository/entry/spip/ecrire/base/dump.php#L533

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table),
$serveur_source, false);

Cette ligne retourne bien toutes les colonnes dans le cas du préfixe de
table 'spip', mais juste celles déclarées dans SPIP (core) dans le cadre
d'un autre préfixe de table.

Je ne sais pas trop ce qu'il faut faire pour corriger en fait. Passer le
dernier argument à true ? Mais je me dis que s'il a été mis à false il
doit y avoir une raison.

En testant un peu je remarque un autre comportement étrange (instable ?)

Les lignes suivantes retournent (avec un préfixe de table non 'spip') les mêmes résultats (noter le 3e argument qui change), à savoir la description de la table sans les champs supplémentaires créés par des plugins.

$table = 'spip_groupes_mots';
$serveur_source = '';

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, false);

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, true);

Pourtant, si l'on vide trouver_table entre les 2, la seconde exécution (avec true) trouve bien tous les champs de la table :

$table = 'spip_groupes_mots';
$serveur_source = '';

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, false);

$trouver_table('');

$desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, true);

J'en conclue que :
1) il faudrait vraisemblablement true dans la fonction de dump
2) trouver_table gère un cache qui ne tient pas compte du 3è argument de sa fonction

MM.