Расширению PostgreSQL Hacker Helper исполнился год.
Это расширение VS Code для разработки исходного кода PostgreSQL. Почти год назад я сделал пост о его создании, а буквально пару дней назад (9 августа) наступил год со дня релиза 1.0.0 версии.
Изначально, это была утилита для динамического вычисления выражений и каста переменных, но спустя время я понял, что не все так просто. Главная загвоздка в том, что существуют типы (если так можно сказать), которые требуют особого обращения.
Самый яркий пример - это List
, динамический массив. Что в нем такого особенного? Во-первых, структура данных одна, но внутри себя он хранит (либо-либо) указатель/int/TransactionId/Oid. Во-вторых, его реализация зависит от версии - раньше он был реализован как связный список, а сегодня - это массив.
Еще один занятный пример - Value
. Сегодня этой структуры нет, так как она разбилась на отдельные String
, Integer
, Float
, Boolean
и BitString
(src/include/nodes/value.h). Это также нарушает изначально красивую картину, так как приходится добавлять логику - название структуры не соответствует типу хранимого узла.
За этот год я добавил множество фичей:
Рендеринг выражений (переменные, представляющие выражения отображаются выражением, которое они представляют)
Отображение содержимого хэш-таблиц
Указатели на отношения из переменных типа
Relids
Форматирование файла с помощью
pgindent
Бутстраппинг новых расширений (создание шаблонных файлов)
Дамп представления узлов в лог или отдельный текстовый файл (через
pprint
/nodeToString
)
Если же говорить о нефункциональных особенностях:
Большая расширяемость за счет файла конфигурации
Поддержка нескольких расширений отладчиков
Тестирование и CI-пайплайн для этого
Больше всего мне запомнилось добавление поддержки отладчика CodeLLDB. Этим я занимался 5 дней с утра до ночи. В то же время и добавил тестирование.
Самое сложное из всего этого - поддержка старых версий PostgreSQL. Для работы расширения я полагаюсь на динамическое вычисление функций в отладчике, но разные мажорные релизы могут ломать бинарную совместимость и некоторые функции могут быть удалены. Уже не помню сколько раз часами искал обходные пути для реализации какой-то функциональности.
Глядя на все это осознаю, что теперь это можно назвать целой IDE для PostgreSQL. Хотя и кажется, что все что можно было написать уже сделано, но постоянно нахожу новые возможности для его развития.
Ссылки: репозиторий и расширение.
P.S. За это время у меня накопилось множество историй о том, как я это расширение писал и с какими проблемами столкнулся. Если интересно почитать об этом - дайте знать!