Matthieu Marcillaud wrote:
Ce n'est pas de la curiosité, c'est du besoin; Tu le sais certainement, la version en développement de SPIP peut fonctionner avec PostgreSQL et SQLite. Les plugins aussi à condition que ceux-ci utilisent les nouvelles fonctions d'accès à la base de données sql_* (insert, insertq, select, replace, update, updateq, alter, create...) et en dernier ressort car c'est la fonction la moins 'portable' sql_query().
Lorsque l'on passe des requetes en utilisant ces fonctions, SPIP, à travers les fichiers /req/pg.php ou req/sqlite_generique.php 'traduit' en quelque sorte ce qu'il reçoit pour créer un requete compatible avec le serveur de base de donnée. Grosso modo, il traduit un langage orienté mysql vers ces autres langages proches.
D'où ma question, quelle était l'incompatibilité ici ? mediumtext n'est pas supporté par pg ?
MM.
Non pas qu'il ne soit pas supporté mais que lors de la création ou du retour de la description ce type ne s'appelle plus mediumtext .
<LONG>
Ci après un exemple que j'espère plus explicite sur une table de ce plugin.
== Description de la table (cf spipbb/base/spipbb.php) ==
$spip_spam_words_log = array(
"id_spam_log" => "bigint(21) NOT NULL auto_increment",
"id_auteur" => "bigint(21) NOT NULL",
"ip_auteur" => "varchar(16) default NULL",
"login" => "varchar(255) default NULL",
"log_date" => "timestamp", // NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP"
"titre" => "text",
"message" => "mediumtext",
"id_forum" => "bigint(21) NOT NULL",
"id_article" => "bigint(21) NOT NULL"
);
$spip_spam_words_log_key = array( 'PRIMARY KEY' => "id_spam_log" );
$tables_principales['spip_spam_words_log'] = array(
'field' => &$spip_spam_words_log,
'key' => &$spip_spam_words_log_key );
== Comparaison (de version de description en base) (cf spipbb/inc/spipbb_inc_config.php:spipbb_check_une_table() ) ==
Pour contrôler la bonne création des tables ainsi qu'une éventuelle ancienne version du schéma en base, j'utilise la fonction sql_showtable par ex :
sql_showtable('spip_spam_words_log',true);
pour le comparer au tableau ci_dessus.
Or dans mon exemple (comparaison de Mysql avec Pgsql)
* message est "transformé" en text
* login en varcharacter (sans spécification de longueur)
* id_forum reste en bigint mais sans spécification de longueur
J'aurais apprécié que le retour de sql_showtable s'approche de la description originale mais ce n'est pas le cas. Donc pour le moment, le patch que tu as vu passer transforme au moins disant pour comparer... ce qui en l'espèce réduit l'efficacité de la comparaison, puisque on ne peut plus comparer les longueurs et qu'il y a des approximations sur les types. Mais bon c'est déjà ça : on vérifie la liste des champs ainsi que leur "type global" (en supposant par ex que mediumtext en MySQL est proche de text en PG).
==> Pistes possibles
- Approfondir les doc de pgsql et faire des tests en local (remis à plus tard faute de temps)... il me faudrait faire de même avec sqlite
- Voir s'il n'existe pas une autre fonction que sql_showtable ou proposer une adaptation de celle-ci pour un retour plus... proche du schéma original => à réfléchir
peut être a l'image de ce que fait spip_pg_frommysql... mais dans le sens inverse... est-ce vraiment possible...
- Temporairement rendre les tests plus "lâches" et convertir les dizaines de requêtes qui le ne sont pas encore, et vérifier que cela fonctionne toujours avec SPIP 1.9.2 (absence de régressions). Obj : être vraiment compatible "autres SGBD". En cours
- Garder le plugin incompatible, tant que... -> je ne peux m'y résoudre donc pour le moment cette piste est abandonnée !
==>> Autres problèmes rencontrés du même ordre
Pour le moment :
- m'assurer que dans sql_select() la syntaxe pour le paramètre $limit est bien "a,b" : cf en Mysql LIMIT a,b qui doit être traduit en OFFSET a + LIMIT b en pgsql...
- vérifier la syntaxe exacte du tableau $where de sql_select pour la liste des contraintes pour la conversion de sql_query en sql_select
- je peine a trouver un substitutif pour "SHOW TABLES LIKE..." que je passe en sql_query
</LONG>
J'ose et je m'en excuse, regretter que le code manque d'une microligne de doc et de noms de variables moins obscurs pour rendre les fonctions (notamment d'abstraction) un peu moins cryptiques, cf la recherche de l'opérateur pour décrypter la structure requise de $where : $op = str_replace('REGEXP', '~', array_shift($v)) en fait $v c'est le $where de la fonction en dessous de pile... etc etc. <troll> En même temps c'est plus rigolo d'appeler ses variables $ti $ta $to ou $titi $tata et $toto (il y en a qui doivent bien rire) </troll>
Trêve de plaisanterie : y a-t-il un moyen _simple_ pour un "amateur" comme moi de documenter le code parce que je n'ai jamais réussi à ajouter quoique ce soit dans doc.spip.org (même pas une mauvaise information) ?
--
Chryjs