46.3. УпÑавление памÑÑÑÑ
- SPI_palloc â вÑделиÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð² веÑÑ
нем конÑекÑÑе иÑполниÑелÑ
- SPI_repalloc â поменÑÑÑ Ð±Ð»Ð¾Ðº памÑÑи в веÑÑ Ð½ÐµÐ¼ конÑекÑÑе иÑполниÑелÑ
- SPI_pfree â оÑвободиÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð² веÑÑ Ð½ÐµÐ¼ конÑекÑÑе иÑполниÑелÑ
- SPI_copytuple â ÑкопиÑоваÑÑ ÑÑÑÐ¾ÐºÑ Ð² веÑÑ Ð½ÐµÐ¼ конÑекÑÑе иÑполниÑелÑ
- SPI_returntuple â подгоÑовиÑÑ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑа в виде Datum
- SPI_modifytuple â ÑоздаÑÑ ÑÑÑокÑ, заменÑÑ Ð¾ÑделÑнÑе Ð¿Ð¾Ð»Ñ Ð² данной
- SPI_freetuple â оÑвободиÑÑ ÑÑÑокÑ, ÑазмеÑÑннÑÑ Ð² веÑÑ Ð½ÐµÐ¼ конÑекÑÑе иÑполниÑелÑ
- SPI_freetuptable â оÑвободиÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, ÑозданнÑй
SPI_executeили подобной ÑÑнкÑией- SPI_freeplan â оÑвободиÑÑ Ñанее ÑÐ¾Ñ ÑанÑннÑй подгоÑовленнÑй опеÑаÑоÑ
- SPI_repalloc â поменÑÑÑ Ð±Ð»Ð¾Ðº памÑÑи в веÑÑ Ð½ÐµÐ¼ конÑекÑÑе иÑполниÑелÑ
Postgres Pro вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð² конÑекÑÑаÑ
памÑÑи и Ñем ÑамÑм ÑеализÑÐµÑ ÑдобнÑй ÑпоÑоб ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñделением памÑÑи в ÑазлиÑнÑÑ
меÑÑаÑ
, Ñ ÑазнÑми ÑÑоками жизни вÑделенной памÑÑи. ÐÑи ÑниÑÑожении конÑекÑÑа оÑвобождаеÑÑÑ Ð²ÑÑ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð² нÑм памÑÑÑ. Таким обÑазом, Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи конÑÑолиÑоваÑÑ ÐºÐ°Ð¶Ð´Ñй оÑделÑнÑй обÑÐµÐºÑ Ð²Ð¾ избежание ÑÑеÑек памÑÑи; вмеÑÑо ÑÑого доÑÑаÑоÑно ÑпÑавлÑÑÑ ÑолÑко неболÑÑим ÑиÑлом конÑекÑÑов. ФÑнкÑÐ¸Ñ palloc и ÑодÑÑвеннÑе ей оÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð¸Ð· «ÑекÑÑего» конÑекÑÑа.
SPI_connect ÑоздаÑÑ Ð½Ð¾Ð²Ñй конÑекÑÑ Ð¿Ð°Ð¼ÑÑи и Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ ÑекÑÑим. SPI_finish воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑ, коÑоÑÑй бÑл ÑекÑÑим до ÑÑого, и ÑниÑÑÐ¾Ð¶Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑ, ÑозданнÑй ÑÑнкÑией SPI_connect. ÐÑи дейÑÑÐ²Ð¸Ñ Ð¾Ð±ÐµÑпеÑиваÑÑ Ð¿Ñи вÑÑ
оде из ваÑей ÑÑнкÑии на C оÑвобождение вÑеменной памÑÑи, вÑделенной внÑÑÑи ÑÑой ÑÑнкÑии, во избежание ÑÑеÑки памÑÑи.
Ðднако еÑли ваÑа ÑÑнкÑÐ¸Ñ Ð½Ð° C должна веÑнÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð² вÑделенной памÑÑи (как знаÑение Ñипа, пеÑедаваемого по ÑÑÑлке), ÑÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð²ÑделÑÑÑ ÑеÑез palloc, как минимÑм пока ÑÑÑановлено подклÑÑение к SPI. ÐÑли Ð²Ñ Ð¿Ð¾Ð¿ÑÑаеÑеÑÑ ÑÑо ÑделаÑÑ, обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¾ÑвобождÑн пÑи вÑзове SPI_finish и ваÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½Ð°Ð´Ñжно. ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð²ÑделÑйÑе памÑÑÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑаемого обÑекÑа, иÑполÑзÑÑ SPI_palloc. SPI_palloc вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð² «веÑÑ
нем конÑекÑÑе иÑполниÑелÑ», Ñо еÑÑÑ, в конÑекÑÑе памÑÑи, коÑоÑÑй бÑл ÑекÑÑим пÑи вÑзове SPI_connect; именно ÑÑÐ¾Ñ ÐºÐ¾Ð½ÑекÑÑ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð·Ð½Ð°ÑениÑ, возвÑаÑаемого из ÑÑнкÑии на C. ÐекоÑоÑÑе из вÑпомогаÑелÑнÑÑ
ÑÑнкÑий, опиÑаннÑÑ
в ÑÑом Ñазделе, Ñакже возвÑаÑаÑÑ Ð¾Ð±ÑекÑÑ, ÑозданнÑе в веÑÑ
нем конÑекÑÑе иÑполниÑелÑ.
Ðогда вÑзÑваеÑÑÑ SPI_connect, ÑекÑÑим конÑекÑÑом ÑÑановиÑÑÑ ÑаÑÑнÑй конÑекÑÑ ÑÑнкÑии на C, ÑоздаваемÑй в SPI_connect. ÐÑе опеÑаÑии вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи, вÑполнÑемÑе ÑÑнкÑиÑми palloc, repalloc или ÑлÑжебнÑми ÑÑнкÑиÑми SPI (кÑоме опиÑаннÑÑ
в ÑÑом Ñазделе иÑклÑÑений), пÑоизводÑÑÑÑ Ð² ÑÑом конÑекÑÑе. Ðогда ÑÑнкÑÐ¸Ñ Ð½Ð° C оÑклÑÑаеÑÑÑ Ð¾Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑа SPI (вÑполнÑÑ SPI_finish), ÑекÑÑим конÑекÑÑом Ñнова ÑÑановиÑÑÑ Ð²ÐµÑÑ
ний конÑекÑÑ Ð¸ÑполниÑелÑ, а вÑÑ Ð¿Ð°Ð¼ÑÑÑ, вÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð² конÑекÑÑе ÑÑой ÑÑнкÑии, оÑвобождаеÑÑÑ, Ñак ÑÑо иÑполÑзоваÑÑ ÐµÑ Ð´Ð°Ð»ÑÑе нелÑзÑ.