33.17. Внутреннее устройство#

33.17. Внутреннее устройство

33.17. Внутреннее устройство #

Этот раздел объясняет, как работает ECPG внутренне. Эта информация иногда может быть полезна для помощи пользователям в понимании того, как использовать ECPG.

Первые четыре строки, записанные командой ecpg в вывод, являются фиксированными строками. Две из них - комментарии, а две - строки include, необходимые для взаимодействия с библиотекой. Затем препроцессор читает файл и записывает вывод. Обычно он просто копирует все в вывод.

Когда он видит оператор EXEC SQL, он вмешивается и изменяет его. Команда начинается с EXEC SQL и заканчивается ;. Все, что находится между ними, рассматривается как оператор SQL и анализируется для подстановки переменных.

Переменная подстановки происходит, когда символ начинается с двоеточия (:). Переменная с таким именем ищется среди переменных, которые были ранее объявлены внутри секции EXEC SQL DECLARE.

Самая важная функция в библиотеке - это ECPGdo, которая отвечает за выполнение большинства команд. Она принимает переменное количество аргументов. Это может легко привести к 50 или около того аргументов, и мы надеемся, что это не будет проблемой на любой платформе.

Аргументы:

A line number #

Это номер строки оригинала; используется только в сообщениях об ошибках.

A string #

Это команда SQL, которая должна быть выполнена. Она изменяется входными переменными, то есть переменными, которые не были известны во время компиляции, но должны быть введены в команду. Где должны быть переменные, строка содержит ?.

Input variables #

Каждая входная переменная приводит к созданию десяти аргументов. (См. ниже).

ECPGt_EOIT #

Перечисление enum, указывающее, что больше нет входных переменных.

Output variables #

Каждая выходная переменная вызывает создание десяти аргументов. (См. ниже). Эти переменные заполняются функцией.

ECPGt_EORT #

Перечисление enum, указывающее, что больше нет переменных.

Для каждой переменной, которая является частью команды SQL, функция получает десять аргументов:

  1. Тип в виде специального символа.

  2. Указатель на значение или указатель на указатель.

  3. Размер переменной, если она имеет тип char или varchar.

  4. Количество элементов в массиве (для выборки массивов).

  5. Смещение до следующего элемента в массиве (для выборки массивов).

  6. Тип переменной индикатора представлен специальным символом.

  7. Указатель на переменную-индикатор.

  8. 0

  9. Количество элементов в массиве индикаторов (для выборки массивов).

  10. Смещение к следующему элементу в массиве индикаторов (для выборки массива).

Обратите внимание, что не все SQL-команды обрабатываются таким образом. Например, открытый оператор курсора, такой как:

EXEC SQL OPEN cursor;

не копируется в вывод. Вместо этого, команда DECLARE курсора используется в позиции команды OPEN, потому что она действительно открывает курсор.

Вот полный пример, описывающий вывод препроцессора файла foo.pgc (детали могут изменяться в каждой конкретной версии препроцессора):

EXEC SQL BEGIN DECLARE SECTION;
int index;
int result;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;

переводится в:

/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;

/* exec sql begin declare section */

#line 1 "foo.pgc"

 int index;
 int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ?     ",
        ECPGt_int,&(index),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
        ECPGt_int,&(result),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"

(Здесь отступы добавлены для удобочитаемости и не являются частью предварительной обработки).