SPI_execute
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 faites 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 faites dans votre fonction C soient
réclamées lors de la sortie de la fonction C, évitant les fuites de mémoire.
En revanche, si votre fonction C 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 fonction C
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 une valeur renvoyée à
partir de votre fonction C. Plusieurs autres procédures utilitaires décrites
dans cette section renvoient également des objets créés dans le contexte
mémoire de l'appelant.
Quand SPI_connect
est appelée, le contexte
privé de la fonction C, qui est créé par
SPI_connect
, est nommé le contexte courant. Toute
allocation faîte par palloc
,
repalloc
ou une fonction utilitaire SPI (à part celles
décrites dans cette section) sont faites dans ce contexte. Quand une
fonction C se déconnecte du gestionnaire SPI (via
SPI_finish
), le contexte courant est restauré au
contexte de mémoire courant et toutes les allocations faites dans
le contexte de mémoire de la fonction C sont libérées et ne peuvent plus être
utilisées.