Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 41. Interface de programmation serveur | Avance rapide | Suivant |
SPI_exec
ou une
fonction semblable PostgreSQL alloue de la mémoire dans des
contextes mémoire qui
donnent une méthode pratique pour
gérer les allocations faîtes dans plusieurs endroits qui ont besoin de
vivre pour des durées différentes. Détruire un contexte libère
toute la mémoire qui y était allouée. Donc, il n'est pas nécessaire
de garder la trace des objets individuels pour éviter les fuites de
mémoire ; à la place,
seul un petit nombre de contextes doivent être gérés.
palloc
et les fonctions liées allouent de la mémoire
du contexte << courant >>.
SPI_connect
crée un nouveau contexte mémoire et
le rend courant. SPI_finish
restaure le
contexte mémoire précédant et détruit le contexte créé par
SPI_connect
. Ces actions garantissent que les
allocations temporaires de mémoire faîtes dans votre procédure soient
réclamées lors de la sortie de la procédure, évitant les fuites de mémoire.
Par contre, si votre procédure a besoin de renvoyer un objet dans de la
mémoire allouée (tel que la valeur d'un type de donné passé par référence),
vous ne pouvez pas allouer cette mémoire en utilisant
palloc
, au
moins pas tant que vous êtes connecté à SPI. Si vous essayez, l'objet
sera désalloué par SPI_finish
et votre procédure
ne fonctionnera pas de manière fiable. Pour résoudre ce problème, utilisez
SPI_palloc
pour allouer de la mémoire pour votre objet
de retour. SPI_palloc
alloue de la mémoire dans le
<< contexte de mémoire courant >>, c'est-à-dire le contexte de
mémoire qui était courant lorsque SPI_connect
a été
appelée, ce qui est précisément le bon contexte pour retourner une valeur de
votre procédure.
Si SPI_palloc
est appelé pendant que la procédure n'est
pas connectée à SPI, alors il agit de la même manière qu'un
palloc
normal. Avant qu'une procédure ne se connecte au gestionnaire
SPI, toutes les allocations faîtes par la procédure via
palloc
ou par une fonction utilitaire SPI sont faîtes
dans le contexte de mémoire courant.
Quand SPI_connect
est appelée, le contexte
privé de la procédure, qui est créée par
SPI_connect
, est nommé le contexte courant. Toute
allocation faîte par palloc
,
repalloc
ou une fonction utilitaire SPI (à part pour
SPI_copytuple
,
SPI_copytupledesc
,
SPI_copytupleintoslot
,
SPI_modifytuple
, et
SPI_palloc
) sont faîtes dans ce contexte. Quand une
procédure se déconnecte du gestionnaire SPI (via
SPI_finish
), le contexte courant est restauré au
contexte de mémoire courant et toutes les allocations faîtes dans
le contexte de mémoire de la procédure sont libérées et ne peuvent plus être
utilisées.
Toutes les fonctions couvertes dans cette section peuvent être utilisées par
des procédures connectées comme non connectées. Dans une procédure non
connectée, elles agissent de la même façon que les fonctions serveur
sous-jacentes (palloc
, etc.).
Précédent | Sommaire | Suivant |
SPI_getrelname | Niveau supérieur | SPI_palloc |