Сценарий 04: Разработка функционала

Сценарий 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();                                         
                                                           
╰───────────────────────────────────────────────────────────╯

Рекомендации по размещению

> Где разместить новую функцию инвалидации кеша?

╭─────────────── Рекомендуемое размещение ──────────────────╮
│                                                            │
│  Подсистема: cache manager                                 │
│  Файл: src/backend/utils/cache.c                           │
│  Рядом с методом: cache_lookup() (строка 145)              │
│  Уверенность: 75%                                          │
│                                                            │
│  Связанные методы в этой области:                          │
│    - cache_insert()                                        │
│    - cache_remove()                                        │
│    - cache_invalidate_all()                                │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Примеры шаблонов

> Покажи примеры шаблонов для подсистемы executor

╭─────────────── Примеры шаблонов ─────────────────────────╮
│                                                           │
│  Примеры из целевой подсистемы:                           │
│                                                           │
│  Метод            | Файл          | Шаблон       | CC    │
│  init_executor()  | execMain.c:42 | Инициализация| 3     │
│  exec_scan()      | execScan.c:88 | Обработчик   | 5     │
│  get_plan_node()  | execUtils.c:15| Запрос       | 2     │
│  check_perms()    | execPerms.c:7 | Валидация    | 4     │
│  end_executor()   | execMain.c:200| Очистка      | 1     │
│                                                           │
╰───────────────────────────────────────────────────────────╯

Примеры вопросов

  • “Как работает [feature_name]?”
  • “Какие функции задействованы в [subsystem]?”
  • “Куда разместить новую [функцию] в [модуле]?”
  • “Покажи похожие реализации для [existing_feature]”
  • “Как проходит поток данных для [operation]?”
  • “Найди точки интеграции для [component]”
  • “Покажи примеры шаблонов для [подсистемы]”
  • “Рекомендуй размещение для нового [типа функции]”

Связанные сценарии