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 13 years ago

Closed 13 years ago

Last modified 12 years ago

#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)

patch-prefixed-sql-tables.patch (3.9 KB) - added by Julien 13 years ago.
jDb and jDao : SQL table's prefix
prefix-dao.patch (6.0 KB) - added by Julien 13 years ago.
Nouveau patch
news.org.tar.gz (5.1 KB) - added by Julien 13 years ago.
Test App for SQL table's prefix
news.sql (1.4 KB) - added by Julien 13 years ago.
SQL file for testapp

Download all attachments as: .zip

Change History (16)

Changed 13 years ago by Julien

jDb and jDao : SQL table's prefix

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 ?

Changed 13 years ago by Julien

Nouveau patch

Changed 13 years ago by Julien

Test App for SQL table's prefix

Changed 13 years ago by Julien

SQL file for testapp

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
Note: See TracTickets for help on using tickets.