Pull to refresh
2K+
102
Соловьев Сергей@AshBlade

Бэкэнд разработчик, но для ПМ могу быть кем угодно

71
Subscribers
Send message

Расширению 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. За это время у меня накопилось множество историй о том, как я это расширение писал и с какими проблемами столкнулся. Если интересно почитать об этом - дайте знать!

Tags:
Total votes 1: ↑1 and ↓0+1
Comments0

Пару месяцев назад (точнее 15 месяцев и 12 дней) я выложил статью про исходный код PostgreSQL где рассказал про инфраструктуру узлов (struct Node) - с помощью него реализуется наследование, полиморфизм и все, все, все.

Вот уже как 2 месяца я работаю разработчиком PostgreSQL. Уже успел реализовать пару фич, закрыть несколько тасок и разбирался с другими проблемами.

Так вот, эти 2 месяца выдались веселыми. Кроме одного момента. Мне надоело постоянно возиться с этими нодами. Проблема в том, что есть наследование и многие переменные имеют свой базовый тип (если не самый базовый Node, который просто 1 поле тэга) - приходится постоянно лезть в (работаю в VS Code) watch панель и писать монструозные конструкции по типу ((RestrictInfo*)((RelOptInfo*)root->rtable[0])->another_field))->value (взято из головы). Причем - чем глубже спускаешься, тем громаднее и неповоротливее выражения становятся.

Я искал различные расширения или способы, чтобы облегчить себе жизнь, но ничего кроме встроенного pprint(Node *).

Мне это не понравилось. И я решил эту проблему по своему. Создал расширение для VS Code, которое позволяет просматривать все переменные и при необходимости кастует узел к нужному типу с отображением всех соответствующих переменных.

Пока у этого расширения 2 фичи:

  1. Приводит наследуемые от Node * переменные к нужному типу и отображает

  2. Дампит переменную-узел в stdout с помощью вызова pprint

Призываю неравнодушных принять участие в его разработке.

Вот ссылка на само расширение.

Tags:
Total votes 2: ↑2 and ↓0+4
Comments0

При установке .NET на линукс есть возможность использовать репозиторий либо официальный Ubuntu, либо от Microsoft (вариант со скриптом не рассматриваю)

Важный момент в том, что установка из этих 2 фидов происходит по-разному и в результате они могут конфликтовать

Принципиальное различие:

  • Ubuntu устанавливается в /usr/lib/dotnet

  • Microsoft устанавливается в /usr/share/dotnet

Когда я переходил из Ubuntu на Microsoft столкнулся с проблемой, что Rider, хоть и находит бинарник дотнета, не может запустить скомпилированное приложение. Выводилась ошибка следующего вида:

You must install .NET to run this application.

App: /home/user/repos/myapp/myapp
Architecture: x64
Host version: 7.0.0
.NET location: Not found

В итоге проблема оказалось следующей:

Исполняемый файл (запускаемый, не *.dll) пытается обнаружить путь до dotnetчерез переменную окружения DOTNET_ROOT

.NET из Ubuntu устанавливает ее равной /usr/lib/dotnet. Но для репозитория Microsoft, dotnet устанавливается в /usr/share/dotnet. После установки из нового фида, переменная не обновляется

Эту проблему я решил обновив файл /etc/environment - устанавливаю DOTNET_ROOT вручную. Теперь файл выглядит так

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
DOTNET_ROOT="/usr/share/dotnet"

Надеюсь, помог тем, кто столкнется с этим в будущем

Total votes 10: ↑10 and ↓0+10
Comments0

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Works in
Registered
Activity

Specialization

Системный инженер, Разработчик баз данных
Средний
PostgreSQL
Linux
C
Системное программирование
Базы данных