banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 10 February 2010 15:03

nina07
Juste Inscrit !
Date d'inscription: 10 Feb 2010
Messages: 4

Extension de Postgesql avec un nouveau type de données

Bonjour,

j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
                   1-soit modifier le code source
                   2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.

C'est bien ça?

J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.

Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.

Merci

Hors ligne

 

#2 Wed 10 February 2010 16:21

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: Extension de Postgesql avec un nouveau type de données

Bonjour,

Il me semble que Pgsql propose de créer ses propres types de données : http://docs.postgresqlfr.org/8.3/sql-createtype.html wink

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Wed 10 February 2010 18:04

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Extension de Postgesql avec un nouveau type de données

nina07 a écrit:

Bonjour,

j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
                   1-soit modifier le code source
                   2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.

C'est bien ça?

J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.

Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.

Merci


Bonjour,

Il me semble qu'il est egalement possible de definir un nouveau type en SQL seulement, sans ecrire de bibliotheque, pour peu que le nouveau type se compose de types de base. Des fonctions plpgsql peuvent suffire pour manipuler ce type.
A voir si un tel type peut correspondre a vos besoins:

http://www.postgresql.org/docs/8.4/static/rowtypes.html

Nicolas

Hors ligne

 

#4 Thu 11 February 2010 10:29

nina07
Juste Inscrit !
Date d'inscription: 10 Feb 2010
Messages: 4

Re: Extension de Postgesql avec un nouveau type de données

Merci pour les réponses.

En fait, pour être plus claire,  mon but est d'intégrer le nouveau type (un type absrait de donnée)  + ses opérations de telle sorte qu'il puisse être utilisé par n'importe quel utilisateur du SGBD au même titre qu'un type "prédéfinis" (entier, point, etc...). Ainsi, un nouvel utilisateur pourra créer une nouvelle base, avec de nouvelles tables ayant comme type d'attribut (de colonne en fait) ce nouveau type. 

J'ai même une description de son domaine de valeurs.   

Je ne me suis pas encore bien concentrée sur le problème, mais je suppose qyue c'est le CREATE TYPE qu'il me faut. LA question est comment faire pour qu'il puisse être "reconnu" par n'importe quel utilisateur.

Merci encore.

Hors ligne

 

#5 Thu 11 February 2010 10:44

vincentp
Participant actif
Lieu: Drôme
Date d'inscription: 18 Jul 2006
Messages: 128
Site web

Re: Extension de Postgesql avec un nouveau type de données

Nota : ce message est envoyé en retard, il a été écrit avant la dernière réponse. Je poste tout de meme.

nina07 a écrit:

Bonjour,

j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
                  1-soit modifier le code source
                  2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.


Non, il ne faut certainement pas modifier le code source de PostgreSQL. Tu aurais de grandes chances de tout casser, et ton code serait inmaintenable avec les nouvelles versions.
La bonne voie si on en arrive à mettre les mains dans les couches bas niveau (ie le code C), est de créer des extensions. C'est ta solution 2, et il faut de la motivation, un bon niveau de C, du temps et des connaissances du fonctionnement interne de PostgreSQL pour se lancer la dedans. On en arrive la quand on a des contraintes ou des besoins forts, il y a d'autres solutions plus simples avant (cf ci dessous).

nina07 a écrit:

J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.
Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.


A noter qu'en environnement windows c'est encore plus compliqué : le passage par le compilateur MS est souvent scabreux (et tarifé), et l'utilisation de MinGW pour profiter de GCC nécessite la mise en place complexe d'un environnement de développement.


Nicolas Ribot a écrit:

Il me semble qu'il est egalement possible de definir un nouveau type en SQL seulement, sans ecrire de bibliotheque, pour peu que le nouveau type se compose de types de base. Des fonctions plpgsql peuvent suffire pour manipuler ce type.
A voir si un tel type peut correspondre a vos besoins:

http://www.postgresql.org/docs/8.4/static/rowtypes.html


Effectivement c'est la piste la plus simple et la plus efficace (en terme de ratio effort / résultat, pas performances). PostgreSQL permet bien de définir ses propres types, et il en crée même un pour chaque table qui est créée dans la base.
Ensuite il est assez facile de coder des fonctions en PLPgSQL pour faire des actions sur ces types, incluant des requetes SQL et en utilisant les fonctions SQL et PLPgSQL déjà existantes dans PostgreSQL.

Voir :
http://docs.postgresql.fr/8.4/server-programming.html

Ça suffit dans de nombreux cas.
Maintenant, pour savoir quelle est la solution qui correspond le mieux, il faudrait avoir une description du besoin précis.

Quelques contraintes qui peuvent faire qu'on doive passer à de la programmation par extension :
* performance : on ne battra pas le C pour cela (mais on fera d'abord de l'optimisation algorithmique)
* Utilisation de bibliothèques externes
* Indexation poussée : certains types de données nécessitent une indexation particulière. Par exemple les données SIG qui sont des géométries en deux dimension.
* Types de données complexes : ceux qui ne peuvent pas etre représentés par une composition de types simples de PostgreSQL (ex : des images rasters).
* Exercice d'école (ça peut arriver wink

A moins que tu n'aies certaines ou toutes ces contraintes, je commencerais à ta place par jeter un oeil sur  la programmation coté serveur avec du plpgsql.

Hors ligne

 

#6 Thu 11 February 2010 11:09

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Extension de Postgesql avec un nouveau type de données

nina07 a écrit:

Merci pour les réponses.

En fait, pour être plus claire,  mon but est d'intégrer le nouveau type (un type absrait de donnée)  + ses opérations de telle sorte qu'il puisse être utilisé par n'importe quel utilisateur du SGBD au même titre qu'un type "prédéfinis" (entier, point, etc...). Ainsi, un nouvel utilisateur pourra créer une nouvelle base, avec de nouvelles tables ayant comme type d'attribut (de colonne en fait) ce nouveau type. 

J'ai même une description de son domaine de valeurs.   

Je ne me suis pas encore bien concentrée sur le problème, mais je suppose qyue c'est le CREATE TYPE qu'il me faut. LA question est comment faire pour qu'il puisse être "reconnu" par n'importe quel utilisateur.

Merci encore.


Le type, crée par un administrateur, sera disponible pour les autres utilisateurs (normaux).
Voici un petit test effectué:

Connecté en tant qu'admin Postgresql:

create type mytype as (nom text, prenom text);

create table toto (id int, nom_complet mytype);

insert into toto (id, nom_complet) values (1, '("nico", "ribo")');

postgis=# select id, (nom_complet).nom, (nom_complet).prenom from toto;

id | nom  | prenom
----+------+--------
  1 | nico |  ribo
(1 ligne)

grant select on toto to test;

Puis connexion en tant que "test", qui est un utilisateur normal:
je peux faire :

select id, (nom_complet).nom, (nom_complet).prenom from toto;

Comme le dit Vincent, cet exemple est basique en ce sens qu'il ne cree en fait qu'une nouvelle "table", mytype, qui est une composition de types simples de postgresql.
Dans ce cas, des fonctions plpgsql peuvent egalement suffire pour manipuler ce type.

Si le type à créer est plus complexe et demande des traitements particuliers (comme le type "geometry" ajouté par Postgis), alors, des methodes d'acces en C ou Python sont necessaires.

Postgis doit etre une bonne source d'exemples pour voir comment ajouter un type complexe dans PG.

Nicolas

Hors ligne

 

#7 Thu 11 February 2010 14:19

nina07
Juste Inscrit !
Date d'inscription: 10 Feb 2010
Messages: 4

Re: Extension de Postgesql avec un nouveau type de données

Merci Nicolas, Yves et Vincent pour ces réponses constructives.

Effectivement, Nicolas, mon type nécessite des traitements assez complexe et il est en plus de "nature" spatiale. Je comptais consulter Postgis à une étape ultérieure mais je crois que le faire à ce stade est une bonne idée!

Merci encore.

Hors ligne

 

#8 Thu 11 February 2010 15:22

vincentp
Participant actif
Lieu: Drôme
Date d'inscription: 18 Jul 2006
Messages: 128
Site web

Re: Extension de Postgesql avec un nouveau type de données

nina07 a écrit:

Merci Nicolas, Yves et Vincent pour ces réponses constructives.

Effectivement, Nicolas, mon type nécessite des traitements assez complexe et il est en plus de "nature" spatiale. Je comptais consulter Postgis à une étape ultérieure mais je crois que le faire à ce stade est une bonne idée!


J'en rajoute une couche : la plupart du temps les demandes un peu vagues sur des types de données spécifiques cachent en fait une mauvaise modélisation du problème. Du genre : "je n'arrive pas bien à stocker des tableaux dans ma base". C'est souvent une mauvaise approche, car on perd quasiment systématiquement les avantages d'utiliser une base de données relationnelle : indexation, jointures, requêtage SQL… Repenser la modélisation permet en général de résoudre simplement ce qui paraissait impossible auparavant.

Dans le fond je pense que ta problématique est largement traitable par les fonctionnalités classiques de PostgreSQL, avec PostGIS pour le coté spatial, et du code plpgsql pour les traitements.

Je t'invite donc à nous donner le fond du problème (ce que tu veux stocker, et quelles actions tu veux effectuer dessus) pour que l'on en ait le coeur net smile

vincent

Dernière modification par vincentp (Thu 11 February 2010 17:15)

Hors ligne

 

#9 Thu 11 February 2010 16:18

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: Extension de Postgesql avec un nouveau type de données

Bonjour,

+1 avec vincentp, j'ajouterais en plus "pouvez vous nous préciser le contexte d'utilisation est-ce une attaque brute uniquement base de donnée où y a-t-il une interface programmée ?" Car là aussi il est possible d'avoir des objets complexes dans la couche métier représentés par des type "simples" dans la base de donnée.

A+


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#10 Fri 02 April 2010 16:39

nina07
Juste Inscrit !
Date d'inscription: 10 Feb 2010
Messages: 4

Re: Extension de Postgesql avec un nouveau type de données

Re-Bonjour,

En fait le type que je dois implémenter doit :

  - Etendre le système de type de Postgresql/PostGIS
  - Etre un Type abstrait de donnée, ceci implique que ses différentes composantes doivent être encapsulées et ne doivent être accessible qu'à travers les opérations du type
  - est de nature spatio-temporelle (encapsule des éléments eux mêmes composés de données spatiales et temporelles)

Doit il pour cela être implémenté comme
- un type de base et donc en lgge C (pour pouvoir étendre le système de type et garantir aussi l'encapsulation)?
- Un type composite peut faire l'affaire?

Dans le cas d'une définition C (typdef), toutes les fonctions  sur le type doivent aussi être implémentées en C ou est ce qu'elles peuvent être définis avec PLPgSQL?

Merci

Hors ligne

 

Pied de page des forums

Powered by FluxBB