All streams
Search
Write a publication
Pull to refresh
99
0
Соловьев Сергей @AshBlade

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

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

Backend Developer, Database Developer
Middle
PostgreSQL
Linux
C
System Programming
Database