Работа с SQL отдельно от C++

9 июня 2018 года в библиотеку Pgfe была добавлена возможность работать с кодом SQL отдельно от кода C++.

Идея данного подхода заключается в хранении SQL запросов в отдельном месте, таком, как например, текстовый файл. Порядок работы следующий. Сначала содержимое этого файла должно быть считано в объект типа std::string. Затем следует создать объект типа Sql_vector с помощью функции-конструктора Sql_vector::make(). Наконец, необходимая SQL-строка может быть получена по порядковому номеру (индексу) или по дополнительным данным, таким, как например, строковый идентификатор. Дополнительные данные могут быть указаны в коментариях, непосредственно расположенных перед SQL запросами. В качестве примера рассмотрим следующий SQL код:

-- Это запрос № 1
--
-- $id$plus-one$id$
SELECT :n::int + 1, ';'; -- заметьте, точки с запятой в кавычках допустимы!

/* Это запрос № 2
 *
 * $id$minus-one$id$
 */
SELECT :n::int - 1

При помощи Sql_vector::make() из данного SQL кода можно создать вектор из двух строк SQL - объектов типа Sql_string. Эти объекты будут содержать дополнительные данные, которые указаны как так строковые константы, помещённые в так называемые доллар-тэги. (Синтаксис доллар-тэгов - это хорошо известный способ задания строковых литералов в PostgreSQL.) Далее, с помощью API, предоставляемого классом Sql_vector, получение доступа к импортированным из SQL-файла запросам тривиально, например:

std::string read_file(const std::filesystem::path& path);

void foo()
{
  namespace pgfe = dmitigr::pgfe;
  const auto input = read_file("bunch.sql");
  auto bunch = pgfe::Sql_vector::make(input);
  auto* minus_one = bunch->sql_string("id", "minus-one"); // SELECT :n::int - 1
  auto*  plus_one = bunch->sql_string("id",  "plus-one"); // SELECT :n::int + 1, ';'
  // Дальнейшая работа с этими запросами ...
}

В качестве заключения следует отметить, что данная возможность позволяет:


По вопросам поддержки и расширения функционала Pgfe можно обращаться по адресу dmitigr@gmail.com.