[spip-dev] Oh, le bandeau

Hello,

Je rencontre un pb idiot avec le bandeau de la 2.1 dans le portage Oracle.
Il est décrit par un fichier XML, mais une fois lu celui-ci est recopié dans la meta "bando_navigation".
Cette donnée est si grosse qu'elle dépasse l'équivalent Oracle du type "text" de MySQL,
et si je passe à l'échelon supérieur, ça devient du BLOB ce qui est rédhibitoire car il n'y a pas d'opérateur d'égalité dessus,
alors qu'il est parfois utile de comparer le champ valeur de la table meta.

Est-il vraiment indispensable d'effectuer cette espèce de mise en cache de ce fichier dans la base ?
Je n'ai d'ailleurs pas vu où est géré le pb classique du cache qui devient obsolète parce que le fichier a changé.

Committo,Ergo:Sum

Est-ce que ce problème ne peut pas aussi arriver avec tout plugin qui utiliserait CFG en stockant ses données dans meta, et avec des champs “texte” potentiellement long ?

plus généralement avec la meta plugins qui stocke les plugins activés et quelques info dessus.
Quelle est cette limite en taille dont il est question ici ?

Cédric

Oui, je me suis fait la même réflexion. J'ai d'ailleurs toujours été surpris de cet espèce de sérialisation manuelle pour ranger une seule valeur sous le nom du plugin dans la table des meta, qu'il faut ensuite analyser. Je serai partisan de rajouter un champ dans la table des meta, qui contiendrait par exemple "spip" pour les meta du noyau, et le nom du plugin pour les autres cas. Avec un Index SQL là-dessus, ça permettrait de retrouver plus rapidement la seule valeur désirée, et éviterait le pb potentiel ci-dessus.

Committo,Ergo:Sum

4000 caractères, et le bandeau sérialisé en fait + de 9000.

Committo,Ergo:Sum

Committo,Ergo:sum a écrit :

plus généralement avec la meta plugins qui stocke les plugins activés et quelques info dessus.
Quelle est cette limite en taille dont il est question ici ?

4000 caractères, et le bandeau sérialisé en fait + de 9000.

Oracle n'est pas fait pour la meme chose que MySQL, quand on programme pour oracle, on enregistre l'objet, pas sa serialisation dans un champ texte (et puis on code le CMS en java et PL/SQL).
Mais de toutes facons, c'est une hérésie d'utiliser cette usine à gaz pour faire tourner une base où il n'y a même pas une contrainte d'intégrité déclarée, ton bilan carbone va en prendre un coup !
:stuck_out_tongue:

Enfin, si je dis pas de betises, ce qui se rapproche le plus d'un champ TEXT dans Oracle, c'est un CLOB, et pour l'utiliser, il faut passer par un CONTAINS de Oracle Text

Bref, Oracle, c'est vraiment une merde !
:smiley:

@++

PS : j'ai vu passer des trucs sur le driver 10g qui permettrait de declarer des varchar2 plus long.

PS2 : la semaine prochaine, M$ SQL Server, qui a aussi plein de mots clés réservés et qui ne gère pas le LIMIT comme tout le monde...
:stuck_out_tongue:
Et la bonne réponse sera alors, code ton CMS en C# et COM+

4000 caractères, et le bandeau sérialisé en fait + de 9000.

La table spip_meta est intégralement chargée en RAM à chaque hit, il
est donc malvenu d'y stocker des choses lourdes ; idem pour le
descriptif multilingue des plugins, qui devrait aller ailleurs (un
cache quelconque?).

-- Fil

Oracle n'est pas fait pour la meme chose que MySQL, quand on programme pour oracle, on enregistre l'objet, pas sa serialisation dans un champ texte (et puis on code le CMS en java et PL/SQL).
Mais de toutes facons, c'est une hérésie d'utiliser cette usine à gaz pour faire tourner une base où il n'y a même pas une contrainte d'intégrité déclarée,

L'intérêt du portage est évidemment de pouvoir utiliser des squelettes pour présenter des bases Oracle pré-existantes, il est clair qu'il n'y a peu d'intérêt à démarrer un site SPIP tout neuf sur Oracle, ce n'est pas la question.

Oracle, c'est vraiment une merde !

moins que les jugements à l'emporte-pièce.

PS : j'ai vu passer des trucs sur le driver 10g qui permettrait de declarer des varchar2 plus long.

oui, c'est 4000 avant c'était encore moins.

PS2 : la semaine prochaine, M$ SQL Server, qui a aussi plein de mots clés réservés et qui ne gère pas le LIMIT comme tout le monde...

il n'y a pas 2 serveurs SQL qui gèrent ça de la même manière.

Et la bonne réponse sera alors, code ton CMS en C# et COM+

Non non, un module Apache en C, il n'y a que ça de vrai.

Committo,Ergo:Sum

Committo,Ergo:sum a écrit :

Oracle n'est pas fait pour la meme chose que MySQL, quand on programme pour oracle, on enregistre l'objet, pas sa serialisation dans un champ texte (et puis on code le CMS en java et PL/SQL).
Mais de toutes facons, c'est une hérésie d'utiliser cette usine à gaz pour faire tourner une base où il n'y a même pas une contrainte d'intégrité déclarée,

L'intérêt du portage est évidemment de pouvoir utiliser des squelettes pour présenter des bases Oracle pré-existantes, il est clair qu'il n'y a peu d'intérêt à démarrer un site SPIP tout neuf sur Oracle, ce n'est pas la question.

ben pourquoi pas laisser SPIP sur son MySQL alors ?

Tu n'as jamais utilisé les bases externes sous SPIP ? Tu as un site SPIP, presque toujours sous MySQL, et tu écris des squelettes avec des choses comme

<BOUCLE1(autreBD:uneTable).... etc

autreBD doit être le nom d'un fichier de connexion permettant d'accéder à cette autre base, éventuellement sur un autre serveur, pas forcément MySQL.

En théorie, une telle utilisation n'aurait pas besoin que le portage fonctionne pour l'espace privé, en particulier pour cette meta pléthorique qui a provoqué cette discussion. Mais c'est plus simple de commencer par faire ça, et porter le compilateur ensuite car les tests y sont plus longs (on ne teste pas ce qu'on écrit mais ce qu'on fait écrire par le compilateur). Et pour qq qui veut utiliser les squelettes mais pas SPIP en tant que système de publication, il faut qu'il puisse l'installer sur son serveur SQL quel qu'il soit, même si ensuite il ne reviendra plus dans l'espace privé.

Committo,Ergo:Sum

Mais c'est bien le cas.

SPIP permet de déclarer des bases externes, l'intérêt est donc d'utiliser SPIP comme moteur d'interface pour visualiser *d'autres* bases que celles du SPIP lui-même. Des applications métiers déjà faites par ailleurs, des données de labos enregistrés dans une autre base, ou n'importe quoi d'autres que le CMS quoi...

Bon du coup, "oui mais la table meta c'est juste pour SPIP", ok. Mais je suppose que quitte à faire le portage sur un serveur SQL, ESJ veut le faire jusqu'au bout. :slight_smile:

Committo,Ergo:sum a écrit :

ben pourquoi pas laisser SPIP sur son MySQL alors ?

Tu n'as jamais utilisé les bases externes sous SPIP ? Tu as un site SPIP, presque toujours sous MySQL, et tu écris des squelettes avec des choses comme

<BOUCLE1(autreBD:uneTable).... etc

d'ou ma question...

autreBD doit être le nom d'un fichier de connexion permettant d'accéder à cette autre base, éventuellement sur un autre serveur, pas forcément MySQL.

En théorie, une telle utilisation n'aurait pas besoin que le portage fonctionne pour l'espace privé, en particulier pour cette meta pléthorique qui a provoqué cette discussion. Mais c'est plus simple de commencer par faire ça, et porter le compilateur ensuite car les tests y sont plus longs (on ne teste pas ce qu'on écrit mais ce qu'on fait écrire par le compilateur). Et pour qq qui veut utiliser les squelettes mais pas SPIP en tant que système de publication, il faut qu'il puisse l'installer sur son serveur SQL quel qu'il soit, même si ensuite il ne reviendra plus dans l'espace privé.

Mouais, enfin si c'est ca le but, j'ai un peu de mal à comprendre l'acharnement sur le bandeau et les metas.... tout comme le mode de la boucle document.
il me semble que pour ca SQLite fait très bien l'affaire.

@++

Stephane qui ne comprend pas pourquoi tu veux faire du 4x4 avec une F1

Stephane a écrit :

il me semble que pour ca SQLite fait très bien l'affaire.

ça c'est une rupture créative !

JL

JLuc a écrit :

Stephane a écrit :

il me semble que pour ca SQLite fait très bien l'affaire.

ça c'est une rupture créative !

ben quoi ?
je dis juste que si le but c'est d'attaquer des données existantes sur Oracle avec SPIP sans base MySQL, il vaut mieux installer SPIP sur SQLite.
Le principal probleme de compatibilité Oracle, c'est qu'il ne traite pas les chaines de caractère de la meme facon, donc c'est pas un probleme de meta ou de bandeau serialisé, c'est plus profond que ca, il faudrait remplacer toutes les clauses touchant à des champs de type TEXT (donc CLOB sous Oracle) par l'appel à la procedure stockée CONTAINS qui utilise le moteur d'indexation (Oracle Text).
Vu ou se situe la couche d'abstraction base de donnée de SPIP, ca ne parait pas vraiment possible, sauf à faire des transformations lourde et à la volée sur les requetes.
Ou alors, il faudrait détailler encore plus l'API SQL de SPIP, peut etre meme revoir les critères des boucles, pour differencier les clauses sur des champs texte, ce qui n'est pas vraiment envisagea en 2.x

Comme ESJ a l'air d'accord avec moi pour dire qu'installer SPIP lui meme sur Oracle n'a pas d'interet, je propose une solution simple et efficace.

Enfin moi je dis ca comme ca hein .. si SPIP peut devenir vraiment compatible Oracle, tant mieux, tant que ca ne pose pas de probleme aux 99,99% d'utilisateurs qui ne l'utilisent pas....

Stephane.

Oracle n'offre pas les mêmes opérateurs pour les Varchar et les *LOB, alors que MySQL met tout ça dans le même panier, c'est ça le pb de fond et il apparaîtra aussi lorsque le compilateur appliquera des opérateurs Oracle incorrects sur des champs d'une base externe. En commençant par porter l'espace privé, je tombe sur le pb de manière directe, c'est beaucoup plus simple de comprendre ce qui se passe alors. On peut aussi voir cet espace privé comme un jeu de tests en vraie grandeur du fichier de portage.

Evidemment, toutes les fonctions d'accès en écriture ne sont pas utiles à la visualisation d'une base externe par des squelettes, tu n'as donc pas tort en disant que tu apportes une solution au pb d'insertion sur lequel je suis tombé. Mais évacuer un pb n'est pas le résoudre: tu dis que l'opérateur d'insertion n'a pas besoin d'être porté, mais c'en est qu'un parmi d'autres qui ne s'évacueront pas comme ça. De plus, et ce n'est pas un hasard, ce pb a révélé une utilisation de la table meta très contestable pour les raisons que Fil a exposées. Tout ça n'est donc vraiment pas inutile.

Committo,Ergo:Sum

+1

Cédric

Committo,Ergo:sum a écrit :

il faudrait remplacer toutes les clauses touchant à des champs de type TEXT (donc CLOB sous Oracle) par l'appel à la procedure stockée CONTAINS qui utilise le moteur d'indexation (Oracle Text).
Vu ou se situe la couche d'abstraction base de donnée de SPIP, ca ne parait pas vraiment possible, sauf à faire des transformations lourde et à la volée sur les requetes.
Ou alors, il faudrait détailler encore plus l'API SQL de SPIP, peut etre meme revoir les critères des boucles, pour differencier les clauses sur des champs texte, ce qui n'est pas vraiment envisagea en 2.x

Comme ESJ a l'air d'accord avec moi pour dire qu'installer SPIP lui meme sur Oracle n'a pas d'interet, je propose une solution simple et efficace.

Oracle n'offre pas les mêmes opérateurs pour les Varchar et les *LOB,

Oracle ne permet tout simplement PAS d'utiliser les *LOB et autres LONG dans les clauses WHERE
Il faut passer par une procedure stockée => c'est plus du SQL, c'est un melange SQL / PL-SQL

alors que MySQL met tout ça dans le même panier, c'est ça le pb de fond et il apparaîtra aussi lorsque le compilateur appliquera des opérateurs Oracle incorrects sur des champs d'une base externe.

Oracle ne permettant pas de faire une clause WHERE sur ce qui est pour spip un champ de type TEXT, et les boucles correspondant à du code SQL après compilation, de facto, cela interdit l'usage de critère sur ces champs ou cela necessite la surcharge des critères (pour voir le type du champ et adapter la syntaxe en fonction, ne serait-ce que pour un =, alors que dire d'un LIKE ou d'un == ...)
C'est pour ca que je dis que c'est un probleme de conception.
Soit tu decides d'enrichir l'API SQL pour différencier les clauses sur les champs de type TEXT, et tu es obligé de modifier ca partout dans SPIP, soit tu agis in fine sur la requete générée, mais ca t'oblige alors à analyser la requete et à modifier les critères concernant ces champs.
Avec l'architecture actuelle, je ne vois pas ce que tu peux faire d'autre

En commençant par porter l'espace privé, je tombe sur le pb de manière directe, c'est beaucoup plus simple de comprendre ce qui se passe alors. On peut aussi voir cet espace privé comme un jeu de tests en vraie grandeur du fichier de portage.

Ben moi j'aurais plutot considéré l'espace public comme le jeu de test, si le but c'est d'utiliser des boucles...

Evidemment, toutes les fonctions d'accès en écriture ne sont pas utiles à la visualisation d'une base externe par des squelettes, tu n'as donc pas tort en disant que tu apportes une solution au pb d'insertion sur lequel je suis tombé.

Je n'ai parlé d'insertion à aucun moment.
Je te dis justement que ca concerne TOUTES les requetes, pour peu que la table contienne un champ de type TEXT (spip autorisant l'utilisation de critere sur tous les champs)

Mais évacuer un pb n'est pas le résoudre: tu dis que l'opérateur d'insertion n'a pas besoin d'être porté, mais c'en est qu'un parmi d'autres qui ne s'évacueront pas comme ça.

on est bien d'accord, mais encore une fois, on ne parle pas ici de bandeau, meta ou autre critère mode de la boucle document, on parle de syntaxe (non-)SQL d'oracle en général

De plus, et ce n'est pas un hasard, ce pb a révélé une utilisation de la table meta très contestable pour les raisons que Fil a exposées. Tout ça n'est donc vraiment pas inutile.

C'est jamais inutile, et effectivement, ca leve des lièvres (quoi que, ca fait longtemps qu'on sait que le stockage de gros tableaux serialisés en base, c'est pas génial, mais ca a normalement pour seul but de pouvoir regénérer le fichier de cache correspondant, c'est valable pour meta, plugins, le couteau suisse et sans doute pas mal de plugins).
Donc oui, changer la conception permettra d'eviter de se confronter au probleme pour ce qui touche aux metas... mais rien de plus.

@++

Stephane a écrit :

JLuc a écrit :

Stephane a écrit :

il me semble que pour ca SQLite fait très bien l'affaire.

ça c'est une rupture créative !

ben quoi ?

ben oui : ça surprend mais c'est malin.

je dis juste que si le but c'est d'attaquer des données existantes sur Oracle avec SPIP sans base MySQL, il vaut mieux installer SPIP sur SQLite.
Le principal probleme de compatibilité Oracle, c'est qu'il ne traite pas les chaines de caractère de la meme facon, donc c'est pas un probleme de meta ou de bandeau serialisé, c'est plus profond que ca, il faudrait remplacer toutes les clauses touchant à des champs de type TEXT (donc CLOB sous Oracle) par l'appel à la procedure stockée CONTAINS qui utilise le moteur d'indexation (Oracle Text).
Vu ou se situe la couche d'abstraction base de donnée de SPIP, ca ne parait pas vraiment possible, sauf à faire des transformations lourde et à la volée sur les requetes.
Ou alors, il faudrait détailler encore plus l'API SQL de SPIP, peut etre meme revoir les critères des boucles, pour differencier les clauses sur des champs texte, ce qui n'est pas vraiment envisagea en 2.x

Comme ESJ a l'air d'accord avec moi pour dire qu'installer SPIP lui meme sur Oracle n'a pas d'interet, je propose une solution simple et efficace.

Enfin moi je dis ca comme ca hein .. si SPIP peut devenir vraiment compatible Oracle, tant mieux, tant que ca ne pose pas de probleme aux 99,99% d'utilisateurs qui ne l'utilisent pas....

Hugh !
("+1" en patois iroquois)

JLuc

Hello

je reprends ce fil suite à ce message de spip-zone consacré à la pseudo boucle POUR
http://article.gmane.org/gmane.comp.web.spip.zone/15858
auquel Fil a répondu:

Le besoin est fort, mais je n'aime pas la syntaxe, et toi pas la code.
Cela dit on n'a proposé aucune alternative... et le besoin est fort.

Est-ce que ce problème ne peut pas aussi arriver avec tout plugin qui utiliserait CFG en stockant ses données dans meta, et avec des champs "texte" potentiellement long ?

Oui, je me suis fait la même réflexion. J'ai d'ailleurs toujours été surpris de cet espèce de sérialisation manuelle pour ranger une seule valeur sous le nom du plugin dans la table des meta, qu'il faut ensuite analyser. Je serai partisan de rajouter un champ dans la table des meta, qui contiendrait par exemple "spip" pour les meta du noyau, et le nom du plugin pour les autres cas. Avec un Index SQL là-dessus, ça permettrait de retrouver plus rapidement la seule valeur désirée, et éviterait le pb potentiel ci-dessus.

Mon impression est que le besoin de la pseudo boucle POUR est lié aux nombreuses données sérialisées que CFG oblige à utiliser.
Si on prenait la nouvelle représentation ci-dessus, on retomberait sur une boucle habituelle, et on pourrait aussi faire des jointures utiles entre la table des meta et les autres, ce qui est infaisable avec des données sérialisées.

Committo,Ergo:Sum

C'est une impression extrêmement réductrice. Peut-être est ce le cas que tu as rencontré, mais il en existe de nombreux autres, comme iterer sur une liste de fichiers, sur une liste de données issues d'un xml, ... Bref, sur tout type de données suceptible d'être stocké dans un tableau, sans être en base de donnée.

Cédric