Определение интерфейса для табличных методов доступа
В этой главе описывается интерфейс между ядром системы QHB и табличными методами доступа, управляющими хранилищем для таблиц. Ядро системы мало что знает об этих методах доступа помимо того, что описано в этой главе, поэтому можно разработать совершенно новые типы методов доступа, написав дополнительный код.
Каждый табличный метод доступа описывается строкой в системном каталоге pg_am.
В записи в pg_am указывается имя и функция обработки для табличного метода
доступа. Эти записи можно создавать и удалять с помощью команд SQL
CREATE ACCESS METHOD
и DROP ACCESS METHOD
.
Функция обработки табличного метода доступа должна быть объявлена как принимающая один аргумент типа internal и возвращающая псевдотип table_am_handler. Аргумент является фиктивным значением, которое требуется только для предотвращения вызова функции непосредственно из команд SQL. Результатом работы функции должен быть указатель на структуру типа TableAmRoutine, содержащую все, что необходимо коду ядра для использования табличного метода доступа. Возвращаемое значение должно существовать столько же, сколько и сам сервер, для чего его обычно определяют как переменную static const в глобальном контексте. Структура TableAmRoutine, также называемая API-структурой метода доступа, определяет поведение метода доступа с помощью функций обратного вызова. Эти функции являются указателями на обычные функции на C/RUST и не видны и не могут вызываться на уровне SQL. Все функции обратного вызова и их поведение определяются в структуре TableAmRoutine (с комментариями внутри структуры, определяющими требования к ним). Для большинства функций обратного вызова имеются оберточные функции, которые документируются с точки зрения пользователя (а не разработчика) табличного метода доступа.
Для реализации метода доступа (МД) разработчику, как правило, требуется реализовать специфичный для этого МД тип слота таблицы кортежей, позволяющий коду снаружи метода доступа хранить ссылки на кортежи МД и обращаться к столбцам кортежа.
В настоящее время способ, которым МД фактически хранит данные, практически ничем не ограничивается. Например, можно, но не обязательно, использовать кэш разделяемых буферов сервера qhb. В случае его использования, вероятно, имеет смысл применить стандартную структуру страницы QHB, как описано в разделе Структура страницы базы данных.
Единственное довольно серьезное ограничение API табличного метода доступа заключается в том, что в настоящее время если МД хочет поддерживать модификации и/или индексы, то необходимо, чтобы у каждого кортежа был идентификатор кортежа (TID), состоящий из номера блока и номера элемента (см. также раздел Структура страницы базы данных). Необязательно, чтобы элементы TID имели то же значение, которое они имеют, например, для метода heap, но если требуется поддержка сканирования по битовой карте (это необязательно), то номер блока должен обеспечивать локальность.
Для восстановления при сбое МД может использовать WAL сервера qhb или нестандартную реализацию журнала. При выборе WAL можно использовать типовые записи WAL или реализовать пользовательский менеджер ресурсов WAL.
Любой разработчик нового табличного метода доступа может обратиться к существующей реализации heap и почерпнуть дополнительную информацию о реализации этого метода.