Page 2 of 2

Re: Acces Postgresql

Posted: 07 Jun 2026, 11:08
by tintinux
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

Posted: 07 Jun 2026, 11:58
by 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.

Re: Acces Postgresql

Posted: 07 Jun 2026, 12:40
by tintinux
Reefounet wrote:Du 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...

Code: Select all

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

Posted: 07 Jun 2026, 16:58
by Reefounet
tintinux wrote: 07 Jun 2026, 11:58 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.png
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

Posted: 08 Jun 2026, 07:36
by Reefounet