Ðлава 62. ÐпÑеделение инÑеÑÑейÑа Ð´Ð»Ñ ÑаблиÑнÑÑ Ð¼ÐµÑодов доÑÑÑпа
Ð ÑÑой главе опиÑÑваеÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð¼ÐµÐ¶Ð´Ñ ÑдÑом ÑиÑÑÐµÐ¼Ñ PostgreSQL и ÑаблиÑнÑми меÑодами доÑÑÑпа, коÑоÑÑе ÑпÑавлÑÑÑ Ñ Ñанением ÑаблиÑ. ЯдÑо ÑиÑÑÐµÐ¼Ñ Ð½Ðµ Ð·Ð½Ð°ÐµÑ Ð¾Ð± ÑÑÐ¸Ñ Ð¼ÐµÑÐ¾Ð´Ð°Ñ Ð´Ð¾ÑÑÑпа ниÑего, кÑоме Ñого, ÑÑо опиÑано здеÑÑ; благодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеализовÑваÑÑ Ð°Ð±ÑолÑÑно новÑе ÑÐ¸Ð¿Ñ Ð¼ÐµÑодов в ÑÐ°Ð¼ÐºÐ°Ñ ÑаÑÑиÑений.
ÐаждÑй ÑаблиÑнÑй меÑод доÑÑÑпа опиÑÑваеÑÑÑ ÑÑÑокой в ÑиÑÑемном каÑалоге pg_am. РзапиÑи pg_am ÑказÑваеÑÑÑ Ð¸Ð¼Ñ Ð¸ ÑÑнкÑиÑ-обÑабоÑÑик Ð´Ð»Ñ ÑÑого ÑаблиÑного меÑода. ÐÑи запиÑи могÑÑ ÑоздаваÑÑÑÑ Ð¸ ÑдалÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ SQL CREATE ACCESS METHOD и DROP ACCESS METHOD.
ФÑнкÑиÑ-обÑабоÑÑик ÑаблиÑного меÑода доÑÑÑпа должна обÑÑвлÑÑÑÑÑ ÐºÐ°Ðº пÑинимаÑÑÐ°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипа internal и возвÑаÑаÑÑÐ°Ñ Ð¿ÑевдоÑип table_am_handler. ÐÑгÑÐ¼ÐµÐ½Ñ Ð² данном ÑлÑÑае ÑикÑивнÑй и нÑжен ÑолÑко Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло вÑзÑваÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно из команд SQL.
ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑабоÑÑика ÑаблиÑного меÑода доÑÑÑпа SQL-ÑкÑипÑом ÑаÑÑиÑениÑ:
CREATE OR REPLACE FUNCTION my_tableam_handler(internal) RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler' LANGUAGE C STRICT; CREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;
ÐозвÑаÑаÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ Ñипа TableAmRoutine, ÑодеÑжаÑÑÑ Ð²ÑÑ, ÑÑо нÑжно знаÑÑ ÐºÐ¾Ð´Ñ ÑдÑа, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод доÑÑÑпа. ÐозвÑаÑаемое знаÑение должно ÑÑÑеÑÑвоваÑÑ Ð²ÑÑ Ð²ÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑеÑвеÑа, ÑÑо обÑÑно доÑÑигаеÑÑÑ Ð¾Ð±ÑÑвлением знаÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº глобалÑной пеÑеменной static const.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñайла Ñ Ð¾Ð±ÑабоÑÑиком ÑаблиÑного меÑода доÑÑÑпа:
#include "postgres.h"
#include "access/tableam.h"
#include "fmgr.h"
PG_MODULE_MAGIC;
static const TableAmRoutine my_tableam_methods = {
.type = T_TableAmRoutine,
/* Methods of TableAmRoutine omitted from example, add them here. */
};
PG_FUNCTION_INFO_V1(my_tableam_handler);
Datum
my_tableam_handler(PG_FUNCTION_ARGS)
{
PG_RETURN_POINTER(&my_tableam_methods);
}
СÑÑÑкÑÑÑа TableAmRoutine, Ñакже назÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑÑÑкÑÑÑой API меÑода доÑÑÑпа, опÑеделÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ меÑода доÑÑÑпа ÑеÑез обÑабоÑÑики. ÐÑи обÑабоÑÑики задаÑÑÑÑ ÐºÐ°Ðº обÑÑнÑе ÑказаÑели на ÑÑнкÑии C, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ не Ð²Ð¸Ð´Ð½Ñ Ð¸ не доÑÑÑÐ¿Ð½Ñ Ð½Ð° ÑÑовне SQL. ÐÑе обÑабоÑÑики и иÑ
ÑвойÑÑва задаÑÑÑÑ Ð² ÑÑÑÑкÑÑÑе TableAmRoutine, в опÑеделении коÑоÑой можно найÑи комменÑаÑии Ñ ÑÑебованиÑми к ним. ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва обÑабоÑÑиков ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÑÑнкÑии-обÑÑÑки, докÑменÑиÑованнÑе Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ (а не ÑазÑабоÑÑика) ÑаблиÑного меÑода доÑÑÑпа. Ðолее подÑобно ÑÑо опиÑÑваеÑÑÑ Ð² Ñайле src/include/access/tableam.h.
ЧÑÐ¾Ð±Ñ ÑеализоваÑÑ Ð¼ÐµÑод доÑÑÑпа ( ÐÐ), ÑазÑабоÑÑик обÑÑно должен ÑоздаÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑпеÑиалÑнÑй ÑÐ»Ð¾Ñ ÑаблиÑÑ ÐºÐ¾ÑÑежей (Ñм. src/include/executor/tuptable.h), позволÑÑÑий ÐºÐ¾Ð´Ñ ÑнаÑÑжи меÑода доÑÑÑпа имеÑÑ ÑÑÑлки на коÑÑежи данного ÐРи обÑаÑаÑÑÑÑ Ðº ÑÑолбÑам коÑÑежа.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑпоÑоб Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , опÑеделÑемÑй ÐÐ, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑакÑиÑеÑки лÑбÑм. ÐапÑимеÑ, ÐÐ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ ÑÑмоÑÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзоваÑÑ ÐºÐµÑ Ð¾Ð±ÑÐ¸Ñ Ð±ÑÑеÑов. ÐÑли ÑÑÐ¾Ñ ÐºÐµÑ Ð¸ÑполÑзÑеÑÑÑ, ÑкоÑее вÑего Ð¸Ð¼ÐµÐµÑ ÑмÑÑл пÑименÑÑÑ Ð¸ ÑÑандаÑÑнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÐºÑ ÑÑÑаниÑÑ, опиÑаннÑÑ Ð² Разделе 66.6.
Ðдним доволÑно ÑеÑÑÑзнÑм огÑаниÑением API ÑаблиÑнÑÑ
меÑодов доÑÑÑпа ÑвлÑеÑÑÑ Ñо, ÑÑо в наÑÑоÑÑее вÑÐµÐ¼Ñ ÐÐ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑии даннÑÑ
и/или индекÑÑ, ÑолÑко еÑли Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ коÑÑежа имееÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ (TID), ÑоÑÑоÑÑий из номеÑа блока и номеÑа ÑлеменÑа (Ñм. Ñакже Раздел 66.6). ÐомпоненÑÑ TIDs в пÑинÑипе могÑÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение, оÑлиÑное Ð¾Ñ Ð¿ÑинÑÑого Ð´Ð»Ñ Ð¼ÐµÑода heap, но еÑли желаÑелÑно поддеÑживаÑÑ ÑканиÑование по биÑовой каÑÑе (вообÑе ÑÑо не обÑзаÑелÑно), Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° должен обеÑпеÑиваÑÑ Ð»Ð¾ÐºÐ°Ð»ÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
.
ÐÐ»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñи Ñбое ÐÐ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ WAL ÑеÑвеÑа или ÑобÑÑвеннÑÑ ÑеализаÑÐ¸Ñ Ð¶ÑÑнала. Ð ÑлÑÑае иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ WAL в ÐРможно задейÑÑвоваÑÑ Ð£Ð½Ð¸ÑиÑиÑованнÑе запиÑи WAL или ÑеализоваÑÑ ÐолÑзоваÑелÑÑкий жÑÑнал ÑеÑÑÑÑов WAL.
ЧÑÐ¾Ð±Ñ ÑеализоваÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ ÑÑанзакÑий ÑпоÑобом, позволÑÑÑим обÑаÑаÑÑÑÑ Ðº ÑазлиÑнÑм ÑаблиÑнÑм меÑодам в одной ÑÑанзакÑии, ÑкоÑее вÑего поÑÑебÑеÑÑÑ Ð¸Ð½ÑегÑиÑоваÑÑ ÐµÑ Ð² меÑ
анизм src/backend/access/transam/xlog.c.
РазÑабоÑÑик нового ÑаблиÑного меÑода доÑÑÑпа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑеÑпнÑÑÑ Ð´ÑÑгÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· ÑеализаÑии ÑÑÑеÑÑвÑÑÑего меÑода heap, наÑ
одÑÑейÑÑ Ð² src/backend/access/heap/heapam_handler.c.