developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.
#293 closed enhancement (fixed)
jDb / jDao : table prefix
Reported by: | Julien | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | Jelix 1.0 RC1 |
Component: | jelix:db | Version: | 1.0 beta3 |
Severity: | normal | Keywords: | |
Cc: | Blocked By: | ||
Blocking: | Documentation needed: | no | |
Hosting Provider: | Php version: |
Description
Français
Description et utilisation
Avec ce patch, on peut utiliser un nouveau paramètre "table_prefix" pour les profils de connexion aux bases de données.
Ce paramètre n'est pas requis, le patch fonctionnera avec ou sans.
Définissez votre préfixe de la façon suivante :
[myprofile] .... table_prefix = "myprefix_"
Quand on utilise jDao, le préfixe est utilisé automatiquement.
Quand on utilise jDb, on doit préfixer explicitement les tables :
$cnx = jDb::getConnection(); $result = $cnx->query('select * from '.$cnx->prefixTable('news').' where category = 10);
Notes techniques
Dans lib/jelix/dao/jDaoGenerator.class.php, j'ai du surcharger le constructeur de jDaoFactoryBase, car la propriété _fromClause est à présent liée dynamiquement au paramètre "table_prefix", et ne peut dont plus être déclarée directement.
English
Description and usage
With this patch, you can set a new parameter called "table_prefix" in your databases' connection profiles.
This new parameter is not required, the patch will work whether it is set or not.
Set your profile prefix like that :
[myprofile] .... table_prefix = "myprefix_"
When using jDao, you have nothing to do, it all works automatically.
When using jDb, you have to explicitly prefix tables with the new prefixTable method :
$cnx = jDb::getConnection(); $result = $cnx->query('select * from '.$cnx->prefixTable('news').' where category = 10);
Tech notes
In lib/jelix/dao/jDaoGenerator.class.php, I had to overload the constructor of jDaoFactoryBase, because the property _fromClause is now dynamically linked to the connection profile's "table_prefix" parameter, and thus it cannot be set directly anymore.
Attachments (4)
Change History (16)
Changed 13 years ago by Julien
comment:1 Changed 13 years ago by laurentj
Remarque sur le patch :
1) Pas de tab pour les tabulations. respecter fr/conventions les conventions de codages?
2)
lib/jelix/dao/jDaoParser.class.php + + $infos['realname'] = '\'.$this->_conn->profil[\'table_prefix\'].\''.$infos['realname']; +
Il n'y a pas de propriétés _conn dans jDaoParser. Et puis jDaoParser est juste là pour parser les fichiers DAO. Il ne doit donc pas faire des choses en fonctions de la connexion/base.
3) patch sur jDaoGenerator: il y a deux problèmes. Le premier, c'est que comme le patch sur jDaoParser n'est pas valide, les noms de tables utilisées dans jDaoGenerator ne sont pas valides.
Et le deuxième gros problème, c'est que le fichier dao généré contient le prefix en dur. Le prefix n'est pas récupéré lors de l'exécution des requêtes. Ce qui fait que si le prefix change dans le profil, ou si on utilise un autre profil qui contiens un autre prefix, les requêtes SQL ne passeront pas, ou pire, cela effectuerai les requêtes sur les mauvaises tables.
Il faut donc que cette méthode prefixTable soit appelée, non pas lors de la génération de la classe DAO, mais lors de l'appel des méthodes de cette classe DAO.
Une autre solution serait qu'il y ait une classe dao générée pour chaque profil, qui contiendrait le prefix en dur dans les requêtes. Ce serait un chouilla plus rapide, mais aussi plus compliquer à mettre en oeuvre (et vérifier à chaque accés à la dao si le fichier dbprofils a été modifié ou non, pour regénerer les classes).
comment:2 Changed 13 years ago by Julien
Salut Laurent,
1) ok, autant pour moi, je croyais avoir mis mon éditeur en soft tabs = 4 espaces.
2) je vais retester, mais je pense que tu as lu un peu vite :
dans
$infos['realname'] = '\'.$this->_conn->profil[\'table_prefix\'].\''.$infos['realname'];
$this->_conn->profil[\'table_prefix\']
n'est pas interprété, mais restitué en tant que chaine "statique".
3) suite à l'explication ci-dessus, le DAO complilé contient la chaine
$this->_conn->profil['table_prefix']
et non sa valeur. L'interprétation ne se fait qu'au moment de l'exécution des méthodes, et donc le préfix est défini en fonction du profil de la connexion utilisée.
Je sais pas si je suis clair, mais ca marchait bien lors de mes tests : un changement du préfix était bien pris en compte même sans recompiler le DAO.
As-tu essayé le patch (si oui, alors j'ai merdé) ou fais-tu ces observations à la lecture du code ?
merci pour ton retour.
Julien
comment:3 Changed 13 years ago by laurentj
- Milestone set to Jelix 1.0
Ok j'ai mal lu (non, je n'ai pas testé en réèl) pour le 2 et le 3. Mais je ne suis pas fan pour l'histoire du 2, de faire ça dans jDaoParser (le parser pouvant être utilisé pour autre chose que la génération de la classe dao).
Je re-étudierais ton code plus tard.
comment:4 Changed 13 years ago by Julien
Pas de problème,
pour moi le faire dans jDaoParser m'assurait du fait de ne pas oublier d'endroit dans les classes de génération (jDaoParser étant le point le plus haut pour l'extraction du nom des tables) et c'était la méthode la plus rapide pour essayer la fonctionnalité.
Si jDaoParser doit pouvoir être utilisé pour autre chose, alors oui, il faut que je revois le code pour intégrer le préfixage en dehors du parser (et donc a priori a plus d'endroits du code).
tu veux que je regarde dans ce sens (juste préfixer au niveau de jDaoGenerator, et plus jDaoParser), et tu choisiras le patch le plus adapté ?
Julien
comment:5 Changed 13 years ago by laurentj
tu veux que je regarde dans ce sens (juste préfixer au niveau de jDaoGenerator, et plus jDaoParser), et tu choisiras le patch le plus adapté ?
Oui
comment:6 Changed 13 years ago by laurentj
Salut Julien,
Tu as pu voir pour une nouvelle version du patch ?
comment:7 Changed 13 years ago by Julien
Voilà le nouveau patch, avec une appli de test.
Il suffit de décommenter le paramètre table_prefix du profil DB pour voir le patch s'activer.
Autre remarques :
jDaoParser n'a pas été modifié.
Bien entendu, les daos ne sont pas recompilés quand on change de préfixe.
comment:8 Changed 13 years ago by laurentj
- Resolution set to fixed
- Status changed from new to closed
Patch landed in the trunk. Thanks for this patch !
comment:9 Changed 13 years ago by laurentj
- Documentation needed set
comment:10 Changed 13 years ago by Julien
Hello,
Ok, j'attaque ça dans le wiki direct ?
Dans la section "Composants de jelix" > "jDb : accéder à une base de données" c'est bien ?
comment:11 Changed 13 years ago by laurentj
Dans la section "Composants de jelix" > "jDb : accéder à une base de données" c'est bien ?
ouaip :-)
comment:12 Changed 12 years ago by laurentj
- Documentation needed unset
jDb and jDao : SQL table's prefix