В данном разделе объясняется, как препроцессор ECPG Работает на внутреннем уровне. Эта информация может быть полезна пользователям для понимания принципов работы препроцессор ECPG.
Первые четыре строки, записываемые препроцессором ecpg В выходной поток являются фиксированными строками. Две строки являются комментариями, а еще две — директивами include, необходимыми для взаимодействия с библиотекой. Затем препроцессор ECPG считывает файл и формирует выходные данные. Обычно
он просто дублирует все содержимое в выходной файл.
Когда он встречает EXEC SQL оператор, он
изменяет его структуру. Команда начинается с EXEC
SQL и заканчивается ;. Все, что находится
между ними, рассматривается как SQL оператор и
анализируется для выполнения подстановки переменных.
Подстановка переменной происходит, когда имя символа начинается с двоеточия
(:). Поиск переменной с этим именем выполняется
среди переменных, которые были ранее объявлены в
EXEC SQL DECLARE section.
Самой важной функцией в библиотеке является функция
ECPGdo, которая отвечает за выполнение большинства
команд. Она принимает переменное число аргументов. Их количество может легко достигать 50, и мы надеемся, что это не вызовет проблем ни на одной из платформ.
Список аргументов:
Это номер исходной строки; используется только в сообщениях об ошибках.
Это SQL команда, которую необходимо выполнить.
Она модифицируется входными переменными, то есть переменными, которые
не были известны во время компиляции, но должны быть включены в
команду. В тех местах, где должны находиться переменные, строка содержит
?.
Каждая входная переменная приводит к созданию десяти аргументов. (См. ниже.)
ECPGt_EOIT #
Значение типа enum указывающее на то, что больше нет входных
переменных.
Каждая выходная переменная вызывает создание десяти аргументов. (См. ниже.) Данные переменные заполняются функцией.
ECPGt_EORT #
Значение типа enum сигнализирующий об отсутствии других переменных.
Для каждой переменной, входящей в состав SQL команды, функция получает десять аргументов:
Тип, представленный в виде специального символа.
Указатель на значение или указатель на указатель.
Размер переменной, если она представляет собой тип данных char или varchar.
Количество элементов в массиве (для операций выборки массивов).
Смещение до следующего элемента в массиве (для операций выборки массивов).
Тип переменной-индикатора, представленный в виде специального символа.
Указатель на переменную-индикатор.
0
Количество элементов в массиве индикаторов (для операций выборки массивов).
Смещение до следующего элемента в массиве индикаторов (для операций выборки массивов).
Обратите внимание, что не все команды SQL обрабатываются таким образом. Например, оператор OPEN для курсора, такой как:
EXEC SQL OPEN курсор;
не копируется в выходной файл. Вместо этого параметры курсора
DECLARE команда используется в позиции OPEN команды
потому что она действительно открывает курсор.
Ниже приведен полный пример, описывающий результат работы препроцессора ECPG для файла 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; #include ; /* 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"
(Отступы здесь добавлены для удобочитаемости и не являются результатом работы препроцессора.)