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, функция получает десять аргументов:
Тип в виде специального символа.
Указатель на значение или указатель на указатель.
Размер переменной, если она имеет тип
char
илиvarchar
.Количество элементов в массиве (для выборки массивов).
Смещение до следующего элемента в массиве (для выборки массивов).
Тип переменной индикатора представлен специальным символом.
Указатель на переменную-индикатор.
0
Количество элементов в массиве индикаторов (для выборки массивов).
Смещение к следующему элементу в массиве индикаторов (для выборки массива).
Обратите внимание, что не все 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"
(Здесь отступы добавлены для удобочитаемости и не являются частью предварительной обработки).