Bandeau
Gestinux

Support and Development forum

Acces Postgresql

Reefounet
le 4 juin
à 06:14
Rappel du sujet :

Bonjour à tous,

Après avoir chargé les sources, compilé ... et essayé...impossible de me connecter à Postgresql.
J’ai donc fait des essais avec Zeoslib 8.
Cela fonctionne parfaitement.
J’ai ouvert le projet Gestinux.lpi sous Lazarus et j’ai vu que sur la fiche, il y avait le module TGDBconnection.
J’ai modifié les paramètres pour ma base de données, spécifié le protocol ’Postgresql’ et coché la propriété Connected : Ok cela fonctionne.
C’est donc plus loin dans le programme qu’il faut trouver.
Oui, mais où ?

Cordialement
Benoît

Re : Acces Postgresql

Il n’y a pas besoin de mettre quelquechose dans TGDatabase.LibraryLocation ?

Re : Acces Postgresql

tintinux
Il n’y a pas besoin de mettre quelquechose dans TGDatabase.LibraryLocation ?

Non, j’ai essayé (voir capture écran jointe) et tout fonctionne très bien.
Donc, il faudrait modifier cela dans les sources mais pour le moment je "nage" un peu avec le code et les différents caractéristiques de Lazarus.
A ce propos, existe-t-il un outils qui retrace le chemin effectué par les différents appels de procédures ?
En attendant, je continue l’exploration

Re : Acces Postgresql

tintinux
Il n’y a pas besoin de mettre quelquechose dans TGDatabase.LibraryLocation ?

J’ai fait un bout de code pour montrer tous les protocoles de zeos.
Je l’ai mis en fichier joint.
Cela permet de tester la connexion.
Donc, je confirme, rien de LibraryLocation.
Chez moi, connexion impeccable à Postgres.
Et vous ?

Re : Acces Postgresql

Bonjour

Reefounetexiste-t-il un outils qui retrace le chemin effectué par les différents appels de procédures ?

Le débogueur de Lazarus.

Sinon, essaie de te connecter sans spécifier la base de données, donc laissant vide TGDbConnection.Database.
Gestinux fait cela avant de se connecter à la bonne base (gdatabase.pas ligne 366) afin de permettre de lister les bases existantes, et de mieux diagnostiquer certains problèmes.
Avec MySql cela fonctionne bien et aussi avec PostgreSql dans le passé.
Peut-être est-ce problématique avec une version plus récente de PostgreSql...

Re : Acces Postgresql

Bonjour à tous,

Bon, après pas mal d’essais et de modifications, j’arrive à présenter dans le Combobox de connexion les différents protocoles et à me connecter.
Mais, comme c’est la première connexion, le message de création de Base de données apparaît.
Sauf qu’ayant dévié toute la connexion avec "DBMS", il trouve une erreur ! (voir fichier joint).
Cela fait une semaine que je fouille pour trouver où chercher ! J’avoue que je commence à m’épuiser car je voulais l’essayer et participer mais la je galère !
Pourquoi ne pas simplifier tout cela puisqu’avec le composant Zeos 8, le choix de protocole et la connexion y compris à postgresql fonctionne à merveille ?
Question : ne peut-on pas éviter tout le protocole de connexion à la base de données d’avant ?

Re : Acces Postgresql

Ce n’est pas parce que ZeosLib se connecte à beaucoup de SGBD (ou protocoles) qu’on peut les utiliser tous de la même manière sans s’en préoccuper.
En particulier lors des définitions de structure, il y a des spécificités importantes de chaque SGBD, et même parfois de chaque version d’un SGBD.
On est malheureusement obligé de modifier un peu les instructions passées à chaque SGBD en fonction de ces spécificités.
Cela se fait dans des unités de gestinux_util pour mieux séparer le fonctionnel du middleware SGBD et la propriété Protocol est essentielle.
La simplification que tu évoques est à mon avis, hélas, impossible.

Gestinux jusqu’à sa version 1.4 a supporté PostgreSQL 9, mais c’était il y a 5 ou 6 ans, voire plus. Il est probable qu’il y a eu des ruptures de compatibilité depuis. On pourrait sans doute corriger, mais ce n’est certainement pas une tâche facile. En tous cas, elle ne me semble réalisable que par quelqu’un qui connait très bien PostgreSQL, Lazarus, ZeosLib et Gestinux. Si tu ne trouves même pas quelle est exactement l’erreur rencontrée et où, cela sera très difficile.

Guy Béart chantait : "Il faut mettre la charrue avant les bœufs, ça les encourage.". Mais il y a des limites...

Pour ma part, je ne maintiens plus depuis longtemps un serveur PostgreSQL, je n’ai plus assez de ressources et c’est trop de boulot à faire vivre et à tester.

Pour toi, la solution la plus simple pour éviter de t’arracher les cheveux, serait d’installer un serveur MariaDb, avec lequel on est sûr que Gestinux marche parfaitement.

Une autre solution temporaire pourrait être éventuellement d’essayer de créer la base manuellement à partir d’un script SQL compatible avec PostgreSQL.
Gestinux est a priori capable de générer ce script pour la version 9, à partir d’une base MySql et je peux t’envoyer un tel script.
Des adaptations seront peut-être nécessaires, je ne sais pas.
Après il restera à tester le fonctionnement du logiciel sous PostgreSQL 14.

Quand tu connaîtras mieux le fonctionnement, tu pourras revenir à l’adaptation de Gestinux à la dernière version de PostgreSQL.

.

Re : Acces Postgresql

tintinux
Une autre solution temporaire pourrait être éventuellement d’essayer de créer la base manuellement à partir d’un script SQL compatible avec PostgreSQL.
Gestinux est a priori capable de générer ce script pour la version 9, à partir d’une base MySql et je peux t’envoyer un tel script.
Des adaptations seront peut-être nécessaires, je ne sais pas.

Je suis preneur pour le script SQL. Je connais bien Postgresql que je pratique depuis dix ans. Je pourrais faire remonter les erreurs et cela me permettrait de teste Gestinux, car de mon côté, j’ai déjà tout une Gestion Co+Compta hébergées sous Postgresql. Donc installé MariaDb à côté, je verrai en dernier recours sur une autre machine.
De ce que j’ai lu, MariaDb et Postgresql respectent SQL. Il y a quelques différences de syntaxe mais cela doit être gérable.
Je croise donc les doigts pour que cela fonctionne sans trop de modif afin, enfin, de tester Gestinux.
En te remerciant du partage du script.

Re : Acces Postgresql

Je progresse !
J’ai eu l’idée de modifier les protocoles proposés dans GDbConnectionBase

function DecodeProtocol(const aProtocol: TDBMSType): string;

begin
case aProtocol of
  Dbms_MySql: Result := 'MySql 5-8 & MariaDb 5-10';
  Dbms_PgSql: Result := 'PostgreSql';  

Du coup, j’ai pu me connecter à Postgresql !!!

J’ai même pu voir les base de données existantes avec mon User.
Par contre, lorsque je fait création d’une base de données => "ErrorCreatingDatabase"

J’ai donc créer une base de données vide ’Gestinux’ => pas d’erreur de connexion !

Mais, alors qu’il essaie de créer les tables, un autre message apparaît voir ci-dessous.
Après vérification, il n’a pas créer la table Company. Il ne peut donc effectuer le Select en SQL.

J’abandonne pour ce soir.

Re : Acces Postgresql

Bonjour à tous,
Après une petite nuit, je reviens à nos problèmes.
Je résume :
en modifiant ligne 231 de GdbConnectionBase.pas
Dbms_PgSql: Result := 'PostgreSql 9';
en
Dbms_PgSql: Result := 'PostgreSql';
on se connecte à Postgresql >14 (je n’ai pas tester en dessous).
On obtient les BDD existantes sur le serveur.
Mais si on veut créer la BDD Gestinux, on obtient une erreur (voir message précédent).
Après recherche, l’erreur vient des guillemets en trop dans GdbConnection.pas ligne 400

ExecSqlDataDefinition('CREATE DATABASE "' + aDatabaseName +
     '" WITH ENCODING=''UTF8'' CONNECTION LIMIT=-1', aDatabaseName, 'ErrorCreatingDatabase');

doit être

ExecSqlDataDefinition('CREATE DATABASE ' + aDatabaseName +
      ' WITH ENCODING=''UTF8'' CONNECTION LIMIT=-1', aDatabaseName, 'ErrorCreatingDatabase');

En modifiant cela, le format de la commande SQL est ok.
Mais cela provoque une erreur dans Postgresql car cette commande ne peut pas être comprise dans une transaction.
voir documentation Postgresql https://docs.postgresql.fr/18/sql-createdatabase.html

error1

Du coup, j’ai cherché comment éviter la transaction mais je ne trouve pas où modifier dans le code.
Tintinux, une idée ?

Re : Acces Postgresql

Bonjour
Voici le script SQL généré par Gestinux de l’export d’une base vide pour PostgreSQL 9.
Je ne sais pas s’il fonctionne sur une version plus récente de ce SGBD : si des corrections sont effectuées, merci de renvoyer les erreurs et le script corrigé, pour mise à jour.

Je ne comprends pas ta modification de la fonction DecodeProtocol. Elle retourne a priori seulement un libellé pour affichage. Le 9 indique que seule cette version a été testée. On mettra 14 quand cela marchera bien avec cette version. Si on le supprime, on perd juste l’information, mais je ne vois pas ce que ça change, ou alors c’est qu’elle est appelée à tort quelque part.

La modification de la création de la base est un exemple des différences entre SGBD et des évolutions qui cassent la compatibilité. Cela n’était pas nécessaire en V9. Il faut modifier en conséquence et y a probablement des problèmes similaires dans la suite.

Pour la nécessité de créer une base en dehors d’une transaction, je regarderai plus tard.

Re : Acces Postgresql

J’ai trouvé et corrigé une erreur dans GDbConnectionBase.EncodeProtocol et GDbConnectionBase.EncodeProtocolFromZeos qui expliquerait assez bien ton problème initial rencontré avec PostgreSQL (que tu as contourné en modifiant DecodeProtocol). Il faut abandonner cette modification et mettre à jour les sources.

Merci de dire si cela permet d’aller plus loin.

Re : Acces Postgresql

ReefounetDu coup, j’ai cherché comment éviter la transaction mais je ne trouve pas où modifier dans le code.
Tintinux, une idée ?

Peut-être avec un commit après le SELECT qui précède la création !
Eventuellement à répéter plus loin si nécessaire...

procedure TGDbConnection.CreateDatabase_PgSql(const aDatabaseName: string);

var
  OldTransactIsolationLevel: TZTransactIsolationLevel;

begin
  try
    OldTransactIsolationLevel := TransactIsolationLevel;
    TransactIsolationLevel := tiNone;
    // create database, connected to server
    If InTransaction then
      Commit;
    ExecSqlDataDefinition('CREATE DATABASE ' + aDatabaseName +
      ' WITH ENCODING=''UTF8'' CONNECTION LIMIT=-1', aDatabaseName, 'ErrorCreatingDatabase');
    // must connect to the created database, not to the server
    Connected := False;
    Database := aDatabaseName;
    Connected := True;
    // create language if not existing
    if not ExistingQuery('SELECT 1 FROM pg_language WHERE lanname = ' +
      StringSql('plpgsql')) then
      ExecSqlRaise(SqlCreateLanguage_PgSql);
    // create a function to Update field UpdateDate
    ExecSqlDataDefinition(SqlCreateFunction_Upd_row_PgSql, 'upd_row',
      'ErrorCreatingFunction');
  finally
    TransactIsolationLevel := OldTransactIsolationLevel;
  end;
end;
Re : Acces Postgresql

tintinux
J’ai trouvé et corrigé une erreur dans GDbConnectionBase.EncodeProtocol et GDbConnectionBase.EncodeProtocolFromZeos qui expliquerait assez bien ton problème initial rencontré avec PostgreSQL (que tu as contourné en modifiant DecodeProtocol). Il faut abandonner cette modification et mettre à jour les sources.

Merci de dire si cela permet d’aller plus loin.

Nickel, on va plus loin. On passe la connexion au serveur et on obtient la liste des BDD.

Par contre même erreur pour la création de la nouvelle BDD (J’ai vu que tu avais enlevé les guillemets).

error

Je pense que l’erreur vient du fait qu’on ne peut pas effectuer "Create Database" dans un query standard car dans ce cas, il est considéré comme une transaction depuis Postgresql version 11. Il faut donc passer par le langage Psql. Il faut donc adapter la création de database pour Postgresql avec le langage Psql.
(Pour le script SQL, je regarde cela ce soir)

Re : Acces Postgresql
Réagir au sujet
Forum sur abonnement

Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.