Pull to refresh
72.45
Skillfactory
Онлайн-школа IT-профессий

Папа может в си, или Простая и аккуратная кодогенерация для SQLite

Reading time 4 min
Views 3K
Original author: Rico Mariani
image

Совсем скоро, 4 и 5 ноября, у нас стартуют новые потоки курсов SQL для анализа данных и C++ разработчик, специально к их старту мы подготовили этот перевод из блога Facebook Engineering с обзором полезного инструмента.

SQLite используется широко, но написание хорошо протестированных и поддерживаемых уровней доступа к данным в лучшем случае может стать сложной задачей. Многие команды применяют некую генерацию кода, чтобы избежать необходимости менять десятки порядковых номеров каждый раз, когда добавляется столбец, но такой подход приводит к ошибкам. Компилятор CQL в CG/SQL позволяет создавать сложные хранимые процедуры с большими запросами, а с помощью комбинаций синтаксических хелперов и сильной типизации эти процедуры гораздо проще получить и сохранить. Сочетание сильной типизации в языке и средства для хорошего юнит-тестирования может дать уверенность в том, что даже очень сложная логика корректна.



Что это такое


CG/SQL — это система генерации кода для популярной библиотеки SQLite, позволяющая разработчикам писать хранимые процедуры в варианте Transact-SQL (T-SQL) и компилировать их в код на языке C, использующий для выполнения операций C API SQLite. CG/SQL позволяет инженерам создавать сложные хранимые процедуры с большими запросами без ручной проверки кода, необходимой существующим методам.

Вся система также включает функции управления и обновления схемы, создания тестирующего кода для хранимых процедур, получения планов запросов для процедур, а также взаимодействия с хранимыми процедурами из других языков, например, Java и Objective-C. Вывод в JSON позволяет делать разбор или интерфейсный код. Пакет содержит обширную документацию по языку и системе.

Что делает инструмент


Компилятор CQL делает большую часть грязной работы. Он читает схему и процедуры, предоставляя язык с сильной типизацией и сотнями ошибок компиляции, разработанных для предотвращения проблем SQLite, возникающих во время выполнения. Компилятор тщательно отслеживает типы данных переменных и типы схем, сообщая о несоответствиях: например о попытке присвоить обнуляемые столбцы необнуляемым выходным переменным, а в противном случае гарантирует, что API SQLite используются последовательно и корректно.

Сгенерированный код всегда проверяет коды возврата, кроме того, всегда использует корректные порядковые номера и типы столбцов при привязке или считывании данных в систему или из системы SQLite. Это именно то, что трудно получить и сохранить корректно. В дополнение ко всему, примечания к схеме позволяют системе автоматически создавать хранимые процедуры, обновляющие базу данных с любой предыдущей версии схемы до текущей версии. Чтобы такое было возможным, проводятся десятки проверок.

Аннотации к процедурам также могут использоваться для указания на то, что вы хотели бы поддерживать код тестов создания фрагментов схемы и вставки данных в эту схему. Такой подход позволяет протестировать процедуры почти без суеты, а также не зависеть от развертываемой системы. Аналогично эти средства могут создавать схемы, проверяющие планы запросов во время компиляции.

Зачем это нужно?


SQLite используется широко, но написание хорошо протестированных и поддерживаемых уровней доступа к данным в лучшем случае может стать сложной задачей. Многие команды применяют некую генерацию кода, чтобы избежать необходимости менять десятки порядковых номеров каждый раз, когда добавляется столбец, но такой подход приводит к ошибкам. Компилятор CQL в CG/SQL позволяет создавать сложные хранимые процедуры с большими запросами, а с помощью комбинаций синтаксических хелперов и сильной типизации эти процедуры гораздо проще получить и сохранить. Сочетание сильной типизации в языке и средства для хорошего юнит-тестирования может дать уверенность в том, что даже очень сложная логика корректна. Синтаксические хелперы преобразуют безопасный код в канонический SQL, так инженеры пишут меньше кода, но при этом код корректнее и он выполняется везде. Посмотрим на пример:

create procedure insert_a_row(like your_table)
begin
  insert into your_table from arguments;
end;

Этот код создает процедуру вставки в любую таблицу (здесь это your_table), аргументы которой — именно столбцы таблицы. Вы не забудете о столбцах, не поставите десятки аргументов в неправильном порядке. Конструкции краткие, кроме того, они устойчивы к ошибкам, что позволяет инженерам проще генерировать код без необходимости проверять каждый его кусочек вручную.

CG/SQL на Github

CG/SQL конечно полезная вещь, но скидочный промокод HABR — не менее полезен, он даст вам получить дополнительные 10% к скидке указанной на баннере.

image




Рекомендуемые статьи


Tags:
Hubs:
+1
Comments 3
Comments Comments 3

Articles

Information

Website
www.skillfactory.ru
Registered
Founded
Employees
501–1,000 employees
Location
Россия
Representative
Skillfactory School