PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 19/10/2022 12:13:27

SebCham
Membre

Lire le contenu d'un projet QGIS dans PgAdmin4

Bonjour à tous et toutes,

J'ai découvert récemment qu'il était possible, sans QGIS, d'enregistrer un projet .qgs non pas sur un espace serveur classique mais directement sur Postgresql (Dans Qgis 3.16 = Projet\Enregistrer sous\Postgresql...).
Je souhaitais donc interroger les informations relatives au paramétrage de mes couches qgis dans PgAdmin4 (essentiellement pour connaître les couches postgis appelées dans ce projet qgs) mais ces informations sont stockées dans un champ "content"au format bytea, illisible au 1er abord.
En parcourant les forums et sites officiels tels que ceux-ci :
https://www.postgresql.org/docs/9.1/fun … tring.html
https://dba.stackexchange.com/questions … n-postgres

J'ai découvert qu'il fallait utiliser des fonctions d'encodage et/ou de décodage en m'appuyant sur des formats de type base64, hex ou escape pour traduire ces données bytea en informations intelligibles.
Cependant après plusieurs tests de ce type dans pgAdmin, je n'obtiens aucun résultat probant :

select *,
encode(content,'hex') tt
from admingeo.qgis_projects


SELECT convert_from(decode(t, 'escape'), 'UTF8')
FROM encode((select content from admingeo.qgis_projects), 'escape') as tt


L'un ou l'une d'entre vous aurait-il (-elle) une idée me permettant de traduire le contenu de ce champ en informations intelligibles ?

Merci d'avance pour votre aide wink

Hors ligne

#2 19/10/2022 14:29:03

rjuju
Administrateur

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Bonjour,


De ce que je vois dans le code source de QGIS, le fichier est enregistré sous forme compressée (zip), donc vous ne pourrez pas voir le contenu simplement en affichant le champ bytea.

Hors ligne

#3 19/10/2022 14:59:07

SebCham
Membre

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Ces informations sont donc stockées dans Postgresql mais non requêtables via PgAdmin ? sad
Il est donc impossible via PgAmin de connaître la liste des tables postgis appelées dans un projet qgis ?

Merci d'avance pour votre réponse

Hors ligne

#4 19/10/2022 15:29:41

rjuju
Administrateur

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Tout d'abord pour être clair je n'ai jamais utilisé qgis, et je ne connais rien à cet outil.


Ces informations sont donc stockées dans Postgresql mais non requêtables via PgAdmin ?

Vous pouvez consulter le contenu, qui est l'équivalent d'un fichier zippé.  Vous pouvez tout à fait extraire le contenu et le décompresser, mais à priori pas en SQL.


Il est donc impossible via PgAmin de connaître la liste des tables postgis appelées dans un projet qgis ?


Sans connaitre QGIS la question n'a malheureusement aucun sens pour moi.

Hors ligne

#5 19/10/2022 15:50:35

SebCham
Membre

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Pas de problème, je vais donc explorer cette voie.
Merci beaucoup pour votre aide.
Bonne fin de journée

Hors ligne

#6 19/10/2022 16:09:22

rjuju
Administrateur

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Si cela peut aider, la partie récupération des données est à priori ici: https://github.com/qgis/QGIS/blob/maste … #L123-L132

  QString sql( QStringLiteral( "SELECT content FROM %1.qgis_projects WHERE name = %2" ).arg( QgsPostgresConn::quotedIdentifier( projectUri.schemaName ), QgsPostgresConn::quotedValue( projectUri.projectName ) ) );
  QgsPostgresResult result( conn->PQexec( sql ) );
  if ( result.PQresultStatus() == PGRES_TUPLES_OK )
  {
    if ( result.PQntuples() == 1 )
    {
      // TODO: would be useful to have QByteArray version of PQgetvalue to avoid bytearray -> string -> bytearray conversion
      QString hexEncodedContent( result.PQgetvalue( 0, 0 ) );
      QByteArray binaryContent( QByteArray::fromHex( hexEncodedContent.toUtf8() ) );
      device->write( binaryContent );

Et la décompression ici: https://github.com/qgis/QGIS/blob/maste … .cpp#L1469

if ( !storage->readProject( filename, &inDevice, context ) )
{
[...]
}
returnValue = unzip( inDevice.fileName(), flags );  // calls setError() if returning false

Hors ligne

#7 21/10/2022 08:07:05

SebCham
Membre

Re : Lire le contenu d'un projet QGIS dans PgAdmin4

Bonjour,
Je vais donc explorer cette nouvelle piste.
Merci encore pour votre aide.
Bonne journée.

Hors ligne

Pied de page des forums