Сценарий 04: Разработка функций¶
Разработчик изучает существующий код для добавления новых функций.
Быстрый старт¶
# Выберите сценарий разработки функций
/select 04
Понимание существующего кода¶
Поиск связанных функций¶
> Найти функции, связанные с обработкой транзакций
╭─────────────── Связанный код ───────────────────────────────╮
│ │
│ Функции транзакций: │
│ │
│ Точки входа: │
│ StartTransaction() src/backend/access/transam/xact.c │
│ CommitTransaction() src/backend/access/transam/xact.c │
│ AbortTransaction() src/backend/access/transam/xact.c │
│ │
│ Вспомогательные функции: │
│ AssignTransactionId() src/backend/access/transam/xact.c │
│ GetCurrentTransactionId() src/backend/access/transam/xact.c │
│ │
│ Связанные модули: │
│ src/backend/access/heap/ - Операции с кучей │
│ src/backend/storage/lmgr/ - Менеджер блокировок │
│ │
╰─────────────────────────────────────────────────────────────╯
Анализ цепочек вызовов¶
> Показать путь вызова от парсера к исполнителю
╭─────────────── Цепочка вызовов ─────────────────────────────╮
│ │
│ Поток Парсер → Исполнитель: │
│ │
│ 1. pg_parse_query() │
│ ↓ │
│ 2. pg_analyze_and_rewrite() │
│ ↓ │
│ 3. pg_plan_queries() │
│ ↓ │
│ 4. PortalRun() │
│ ↓ │
│ 5. ExecutorStart() → ExecutorRun() → ExecutorFinish() │
│ ↓ │
│ 6. ExecProcNode() [диспетчеризация по конкретным узлам] │
│ │
╰─────────────────────────────────────────────────────────────╯
Точки интеграции¶
Поиск точек расширения¶
> Где я могу добавить новый тип узла?
╭─────────────── Точки расширения ───────────────────────────╮
│ │
│ Добавление нового типа узла исполнителя: │
│ │
│ 1. Определите структуру узла в: │
│ src/include/nodes/execnodes.h │
│ │
│ 2. Реализуйте операции узла: │
│ src/backend/executor/nodeXXX.c │
│ - ExecInitXXX() │
│ - ExecXXX() │
│ - ExecEndXXX() │
│ │
│ 3. Зарегистрируйте в диспетчере: │
│ src/backend/executor/execProcnode.c │
│ - ExecInitNode() │
│ - ExecProcNode() │
│ │
╰────────────────────────────────────────────────────────────╯
Понимание зависимостей¶
> От каких модулей зависит менеджер буферов?
╭─────────────── Зависимости ───────────────────────────────╮
│ │
│ Зависимости менеджера буферов: │
│ │
│ Верхний уровень (использует): │
│ - storage/smgr (Интерфейс менеджера хранилища) │
│ - storage/lmgr (Менеджер блокировок) │
│ - utils/memutils (Контексты памяти) │
│ │
│ Нижний уровень (используется): │
│ - access/heap (Методы доступа к куче) │
│ - access/index (Методы доступа к индексам) │
│ - executor/* (Выполнение запросов) │
│ │
│ Интерфейсы: │
│ - ReadBuffer() (Основной интерфейс чтения) │
│ - ReleaseBuffer() (Интерфейс освобождения) │
│ │
╰───────────────────────────────────────────────────────────╯
Шаблоны кода¶
Поиск похожих реализаций¶
> Показать примеры обработки ошибок в исполнителе
╭─────────────── Шаблоны обработки ошибок ──────────────────╮
│ │
│ Распространённые шаблоны в исполнителе: │
│ │
│ 1. ereport с уровнем ERROR: │
│ ereport(ERROR, │
│ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), │
│ errmsg("функция X не поддерживается"))); │
│ │
│ 2. Обработка исключений с PG_TRY: │
│ PG_TRY(); │
│ { │
│ /* опасная операция */ │
│ } │
│ PG_CATCH(); │
│ { │
│ /* очистка */ │
│ PG_RE_THROW(); │
│ } │
│ PG_END_TRY(); │
│ │
╰───────────────────────────────────────────────────────────╯
Примеры вопросов¶
- “Как работает [feature_name]?”
- “Какие функции задействованы в [subsystem]?”
- “Куда следует добавить код для [new_feature]?”
- “Покажи похожие реализации для [existing_feature]”
- “Как проходит поток данных для [operation]?”
- “Найди точки интеграции для [component]”
Связанные сценарии¶
- Ознакомление — Основы изучения кодовой базы
- Архитектура — Понимание архитектуры
- Рефакторинг — Улучшение кода