developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 12 years ago

Closed 11 years ago

Last modified 10 years ago

#869 closed bug (fixed)

execSQLScript does not use table_prefix

Reported by: foxmask Owned by:
Priority: normal Milestone: Jelix 1.2 beta
Component: jelix:db Version: 1.1
Severity: normal Keywords:
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version:

Description

In dbprofils.ini.php even if the parm table_prefix is set ; execSQLScript does not use it at all.

Change History (13)

comment:1 Changed 12 years ago by laurentj

well, it is very difficult to fix this issue: we have to create a real SQL parser. Not for me :-)

comment:2 Changed 12 years ago by foxmask

je pense qu'une regexp trouvant "TABLE" pour mettre apres le prefix devrait le faire mais je ne me suis pas penché dessus car la fonction parse devrait etre revue aussi pour le coup :/

comment:3 Changed 12 years ago by laurentj

"TABLE" est un peu trop commun (si il y a le mot TABLE dans une chaine d'une instruction INSERT, ça va pas le faire du tout).

Il faut donc un vrai parser SQL, qui va detecter donc les noms de tables et ajouter le prefix. La version execSQLScript du driver mysql est plus ou moins un parser SQL, mais il va falloir l'améliorer et le porter pour les autres drivers.

comment:4 Changed 12 years ago by foxmask

Oui,

je suis allé un peu vite ; je pensais aux instructions CREATE|DROP|ALTER TABLE, mais il va sans dire qu'il y a aussi UPDATE|INSERT|DELETE|TRUNCATE|SELECT (pour les plus communes).

Peut-etre que execSQL est trop permissif pour l'utilisateur et du coup impose beaucoup de travail coté framework.

Donc pour le parser, il faudrait partir du "standard" SQL (2008 dernier en date?) pour éviter les spécificités de chaque plateforme.

Peut-être peut-on se poser la question de changer de parser pour un dont la grammaire serait facile à utiliser pour chacun ?

Par exemple tu avais parle de fichiers Yaml un temps où on avait abordé le sujet des install auto des modules et scripts de bases.

La "voie" prise par FluxBB par exemple, est de mettre dans un array une variable contenant la requetes , en plusieurs partie :

le mot clef (INSERT/UPDATE/DELETE)

la table

les colonnes à mettre à jour

le parser (spécifique à chaque plateforme) utilise ce array et reconstruit l'instruction .

le code est propre et comprehensible.

ligne 100 http://fluxbb.org/trac/browser/fluxbb/branches/fluxbb-1.3-legacy/upload/include/dblayer/mysql_innodb.php

Quel serait ton choix ?

Cdt.

comment:5 Changed 12 years ago by laurentj

il faudrait partir du "standard" SQL (2008 dernier en date?) pour éviter les spécificités de chaque plateforme.

impossible. Qui connait le SQL "standard" ? Et puis les scripts, on les génère automatiquement (vive phpmyadmin). Donc pas de sql standards malheureusement.

tu avais parle de fichiers Yaml

yaml, ça pu

La "voie" prise par FluxBB par exemple, est de mettre dans un array une variable contenant la requetes , en plusieurs partie :

horrible. Donc du coup, tu tapes 3 fois plus de code. pas top

Quel serait ton choix ?

le parser SQL serait à mon avis un choix bien plus judicieux et plus propre.

comment:6 Changed 12 years ago by foxmask

Heu ... qui connait le SQL standard, ben

On pourrait aussi dire "on lance dreamweaver et hop voilà le html, car qui connait le html standard ?" ;D

Donc le parser SQL (actuel) serait "simplement" amélioré pour gerer tout type de requete sans chercher à utiliser une class tierce qui "saurait" faire, exact ?

note que je n'ai aucun choix / idée de class ou autre, je cherche à savoir ce que le parser doit être pour etre apte à tout faire ;)

comment:7 Changed 11 years ago by foxmask

Pour mes propres besoins dans HaveFnuBB je demande lors de l'installation de saisir un prefixe de table mais ne peux m'en servir,

donc je vais voir si je ne peux pas faire un preg_replace du prefixe que j'ai de toute façon mis dans mon script SQL et le remplacer à la volée par celui que me donne l'utilisateur lors de l'installation pour ensuite fournir le resultat à execScriptSQL.

comment:8 Changed 11 years ago by foxmask

je suis parvenu à mes fins de la façon suivante :

1) j'ouvre le fichier dbprofile.ini.php pour trouver si un table_prefix est defini

1.1) si non je fais un $tools->execSQLScript($file);

1.2) si oui :

if ($dbProfile->getValue('table_prefix','havefnubb') != '' ) {
   $tablePrefix = $dbProfile->getValue('table_prefix','foobar') ;
   $fileDest = dirname(__FILE__).'/../install/sql/'.$tablePrefix.'install.'.$profile['driver'].'.sql';
   $sources = file($file);
   $newSource = '';
						
   $pattern = '/(DROP TABLE IF EXISTS|CREATE TABLE IF NOT EXISTS|INSERT INTO) `(hf_)(.*)/';
							
   foreach ((array)$sources as $key=>$line) {
      if (preg_match($pattern,$line,$match)) {
	$newSource .= $match[1] .' `'.$tablePrefix . $match[3];
   }
   else {
        $newSource .= $line;
   }						}							
   $fh = fopen($fileDest,'w+');
   fwrite($fh,$newSource);
   fclose($fh);
   $file = dirname(__FILE__).'/../install/sql/'.$tablePrefix.'install.'.$profile['driver'].'.sql';
   $tools->execSQLScript($file);
   @unlink($file);
}
else 
   $tools->execSQLScript($file);

tout ceci pourrait se retrouver directemet dans fonciton execSQLScript de la class jDBTools non ?

par ailleurs la regexp sera forcement à revoir mais dans mon cas elle me va puisue c'est bibi qui code le SQL toujours de la meme façon ;)

comment:9 Changed 11 years ago by foxmask

aussi une "astuce", je fourni le script avec un prefix maison (hf_).

de la sorte je peux le rechercher facilement dans le script SQL pour le remplacer par celui choisi par l'utilisateur.

comment:10 Changed 11 years ago by laurentj

  • Milestone set to Jelix 1.2

comment:11 Changed 11 years ago by laurentj

  • Resolution set to fixed
  • Status changed from new to closed

Finally, I just do a replacement of %%PREFIX%% by the prefix indicated in the profil. http://hg.jelix.org/jelix/jelix-trunk/rev/b1a886e0f39f

comment:12 Changed 11 years ago by laurentj

  • Documentation needed set
Note: See TracTickets for help on using tickets.