PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Documentation Fonctions C

Technique - général | Documentation Fonctions C

Par PANCH le 16/07/2008 - 10:31

Bonjour Ă  tous,

je développe à l'heure actuelle des fonctions C pour Postgre sur plateforme Windows avec le compilateur gcc de DevCpp.

Ma question principale est d'ordre général :
Existe-t-il une documentation détaillée sur le développement de fonctions C pour Postgre SQL ?

Pour le moment, ormis le chapitre très succint de la doc postgre, je n'ai trouvé que la documentation de Joe Conway sur http://www.joeconway.com/tut_oscon_2004.pdf

-------------------------------------------------------------------

Plus précisément, je recherche une documentation qui indique l'ensemble des fonctions utiles, des macros et des variables fournies pour développer des fonctions C ainsi que les relations qui les lient. Si la doc de Joe Conway est très bien organisée en deux chapitres : fonctions simple ligne et fonctions multi-lignes, elle est uniquement basée sur des exemples et ne permet pas vraiment de "rentrer dans les détails".

---------------------------------------

De plus, certains exemples ne "passent" pas chez moi. Ainsi, j'aimerai savoir par exemple (j'en ai d'autres en stock) comment faire pour récupérer le descripteur de ligne TupleDesc d'une ligne en entrée de ma fonction.

----------

Joe Conway propose d'utiliser :

TupleTableSlot *slot;
HeapTuple tuple;
TupleDesc tupdesc;
int nc;

slot = (TupleTableSlot *) PG_GETARG_POINTER(0);

tuple = slot->tts_tuple;
tupdesc = slot->tts_tupleDescriptor;
nc = tupdesc->natts;

Toutefois, lorsque j'utilise cette méthode (pour extraire les éléments d'une colonne spécifique de ma table) je m'aperçois que pour chaque ligne le TupleTableSlot est vide : (slot->tts_isempty) me retourne true à chaque fois.

------------

La doc Postgre propose directement d'utiliser :

HeapTupleHeader *t = (HeapTupleHeader *) PG_GETARG_HEAPTUPLEHEADER(0);
get_call_result_type(fcinfo, NULL, &tupdesc);
tupdesc = BlessTupleDesc(tupdesc);
nc = tupdesc->natts;
...

Cette méthode me renvoie un HeapTupleHeader correct, mais le descripteur associé tupdesc est le descripteur des lignes de sortie.

Comment faire pour récupérer le descripteur associé à mes lignes d'entrée ? Existerait-il une méthode similaire à get_call_result_type(fcinfo, NULL, &tupdesc) mais qui fonctionne pour un argument en entrée de ma fonction ? Est-il possible d'accéder à une fonction qui crée un descripteur à partir d'un HeapTupleHeader ou d'un HeapTuple? D'ailleurs quelle est la différence entre HeapTupleHeader et HeapTuple ? Pourquoi, pour faire la même chose, Joe Conway propose d'utiliser une TupleTableSlot là où postgre propose directement de récupérer un HeapTupleHeader ?

J'imagines que vous comprenez maintenant l'impérative nécessité qu'est pour moi la découverte d'une documentation détaillée !

---------------------------------------

Enfin, je tiens à signaler qu'il serait intéressant de rajouter au chapitre sur les fonctions C de la documentation Postgre une partie claire sur les problèmes rencontrés sous Windows lors de la compilation de la DLL. En particulier concernant le problème de conflit dû à la déclaration de la macro BUILDING_DLL. Le lien http://www.mydatabasesupport.com/forums/postgresql/393683-re-general-custom-c-function-palloc-broken.html explique relativement bien l'origine du problème et la méthode proposée pour le résoudre ne m'a pas posé de problème particulier. Le seul hic est le temps que j'ai mis à trouver cette info...

------------------------------------------------------------------------

Je vous remercie pour la lecture de ce post.
J'espère que vous aurez pleins d'idées et de doc à me proposer.
Cordialement,
Francesco.

© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.