Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jelix 1.8 and lower - postgresql config issue with function encloseName #399

Open
overghost opened this issue Jul 31, 2023 · 1 comment
Open

Comments

@overghost
Copy link

Bonjour,
J'ai pour habitude d'utiliser comme système de base de données postgresql.
du coup, je travaille avec bon nombre de schémas.
lors de la création d'un DAO, je modifie systématiquement le realname en le préfixant du nom du schéma séparé par un point
(realname="schéma.table")

du coup, j'ai systématiquement eu des problèmes.
après plusieurs recherches, j'ai trouvé que le problème venait parce que le framework encapsule le nom de la table au complet... (et donc dans mon cas c'était encapsulé comme ceci : "schéma.table" au lieu de "schéma"."table")

Est-ce qu'il y a une autre façon de faire pour faire référence au bon schéma (dans le cas de postgresql en tous cas)?

Dans la doc Jelix j'ai lu ceci
`Profil pour Postgresql

Paramètres possibles :

driver : doit valoir "pgsql"
database : le nom de la base de données à utiliser
host : le nom du serveur postgresql sur lequel se connecter. Si vous le mettez à vide, la connexion se fera via une socket unix.
port : indique le port de connexion. N'indiquez pas ce paramètre si vous voulez utiliser le port par défaut.
user et password : le login/mot de passe pour la connexion. Ne mettez pas ces paramètres si vous voulez utiliser le login/mot de passe par défaut (indiqués par exemple dans les variables d'environnement du système).
service : nom du service Postgresql. Les paramètres database, host, port, user et password sont alors ignorés.
persistent : indique si la connexion est persistante (on) ou pas (off)
force_encoding : indique s'il faut spécifier le charset utilisé dans l'application, de manière à récupérer les données avec le bon charset. même explication que pour mysql.
timeout : Nombre de secondes autorisées pour l'établissement de la connexion au serveur avant de générer un timeout
single_transaction : Toutes les requêtes d'une même page seront envoyées au serveur au sein d'un même transaction (entre un BEGIN; et un COMMIT;) (on) ou non (off). Défaut: off
search_path : indiquer la liste des schémas dans lequel il faut chercher les tables, si le schéma par défaut pour la connexion ne correspond pas à celui dans lequel l'application va chercher.
session_role : définir le role de session PostgreSQL
force_new : recréer une nouvelle connexion à requête http.

`

Il semble donc qu'on pourrait s'en sortir en renseignant les search_path, mais dans ce cas là, on serait confronté à un problème si jamais dans deux schémas différents on a deux tables portant exactement le même nom, car jelix na va probablement pas prendre le bon schéma (d'où mon intérêt de renseigner le schéma dans le DAO directement, ça évite toute confusion)

Pour résoudre le problème, j'ai modifié les fichiers suivants comme suit:

1. Correction initiale pour résoudre mon problème :
Fichiers modifiés :
vendor\jelix\jelix\lib\jelix\plugins\db\pgsql
vendor\jelix\jelix\lib\jelix\db\tools

code original dans tous les fichiers édités :
public function encloseName($fieldName) { return '"'.$fieldName.'"'; }

Code modifié :
public function encloseName($name) { return $name; }

2. Correction plus avancée pour résoudre mon problème:
Fichiers modifiés :
vendor\jelix\jelix\lib\jelix\plugins\db\pgsql
vendor\jelix\jelix\lib\jelix\db\tools

code original dans tous les fichiers édités :
public function encloseName($fieldName) { return '"'.$fieldName.'"'; }

Code modifié : (credits cocréation de ce code avec chatgpt, corrigé et adapté pour que le rendu soit tout à fait celui que je voulais...)
`public function encloseName($fieldName)
{
// Split the field name into parts based on dots (.)
$parts = explode('.', $fieldName);

// If there is more than one part, it means it contains schema and table name
if (count($parts) > 1) {
    // Enclose each part with double quotes and join them back with dots
    return '"' . implode('"."', $parts) . '"';
} else {
    // If there's only one part, just enclose it with double quotes
    return '"' . $fieldName . '"';
}

}`

encore une fois, peut-être que je n'ai pas suffisamment exploré toute la doc ou tout le code source du framework, mais je n'ai à priori pas trouvé de solution viable pour moi... d'où mes propositions de correction de code dans le framework...

Bonne journée,

@laurentj
Copy link
Member

laurentj commented Aug 1, 2023

Bonjour,

Il n'y a effectivement pas de support des schémas dans jDao. Je ne suis pas sûr que ta correction soit suffisante. Je vais essayer d'investiguer sur ce qu'il y aurait à changer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants