34.15. Режим совместимости с Informix#
34.15. Режим совместимости с Informix #
ecpg можно запустить в так называемом режиме совместимости с Informix. Если
этот режим активен, он пытается вести себя так, как если бы он был прекомпилятором Informix
для Informix E/SQL. В общем, это позволит вам использовать знак доллара вместо примитива EXEC SQL для введения
встроенных SQL-команд:
$int j = 3; $CONNECT TO :dbname; $CREATE TABLE test(i INT PRIMARY KEY, j INT); $INSERT INTO test(i, j) VALUES (7, :j); $COMMIT;
Примечание
Не должно быть никаких пробелов между $ и следующей директивой препроцессора, то есть include, define, ifdef и т. д. В противном случае, препроцессор будет интерпретировать компонент как переменную хоста.
Существуют два режима совместимости: INFORMIX, INFORMIX_SE.
При связывании программ, использующих этот режим совместимости, не забудьте связать их с libcompat, который поставляется с ECPG.
Помимо ранее объясненного синтаксического сахара, режим совместимости Informix также переносит некоторые функции для ввода, вывода и преобразования данных, а также встроенные операторы SQL, известные из E/SQL в ECPG.
Режим совместимости с Informix тесно связан с библиотекой pgtypeslib ECPG. pgtypeslib отображает типы данных SQL на типы данных в программе-хосте на языке C, и большинство дополнительных функций режима совместимости с Informix позволяют работать с этими типами данных на языке C. Однако следует отметить, что степень совместимости ограничена. Он не пытается копировать поведение Informix; он позволяет выполнять примерно те же операции и предоставляет функции с тем же именем и базовым поведением, но это не полноценная замена, если вы в настоящее время используете Informix. Кроме того, некоторые типы данных отличаются. Например, типы данных datetime и interval в Tantor SE не знают о диапазонах, таких как, например, YEAR TO MINUTE, поэтому в ECPG вы не найдете поддержки для этого.
34.15.1. Дополнительные типы #
Специальный псевдотип "string" для хранения обрезанной справа символьной строки теперь поддерживается в режиме Informix без использования typedef. Фактически, в режиме Informix ECPG отказывается обрабатывать исходные файлы, содержащие typedef sometype string;
EXEC SQL BEGIN DECLARE SECTION; string userid; /* this variable will contain trimmed data */ EXEC SQL END DECLARE SECTION; EXEC SQL FETCH MYCUR INTO :userid;
34.15.2. Дополнительные/Отсутствующие встроенные SQL-запросы #
CLOSE DATABASE#Этот оператор закрывает текущее соединение. Фактически, это синоним для
DISCONNECT CURRENTв ECPG:$CLOSE DATABASE; /* close the current connection */ EXEC SQL CLOSE DATABASE;
FREE cursor_name#Из-за различий в работе ECPG по сравнению с ESQL/C Informix (а именно, какие шаги являются чистыми грамматическими преобразованиями, а какие шаги зависят от базовой библиотеки времени выполнения), в ECPG нет оператора
FREE cursor_name. Это связано с тем, что в ECPG операторDECLARE CURSORне преобразуется в вызов функции в библиотеке времени выполнения, которая использует имя курсора. Это означает, что в библиотеке времени выполнения ECPG нет учета SQL-курсоров, только в сервере PostgreSQL.FREE statement_name#FREE statement_nameявляется синонимом дляDEALLOCATE PREPARE statement_name.
34.15.3. Дескрипторы областей SQLDA, совместимые с Informix #
Режим совместимости с Informix поддерживает другую структуру, отличную от описанной в Раздел 34.7.2. См. ниже:
struct sqlvar_compat
{
short sqltype;
int sqllen;
char *sqldata;
short *sqlind;
char *sqlname;
char *sqlformat;
short sqlitype;
short sqlilen;
char *sqlidata;
int sqlxid;
char *sqltypename;
short sqltypelen;
short sqlownerlen;
short sqlsourcetype;
char *sqlownername;
int sqlsourceid;
char *sqlilongdata;
int sqlflags;
void *sqlreserved;
};
struct sqlda_compat
{
short sqld;
struct sqlvar_compat *sqlvar;
char desc_name[19];
short desc_occ;
struct sqlda_compat *desc_next;
void *reserved;
};
typedef struct sqlvar_compat sqlvar_t;
typedef struct sqlda_compat sqlda_t;
Глобальные свойства:
sqld#Количество полей в дескрипторе
SQLDA.sqlvar#Указатель на свойства для каждого поля.
desc_name#Неиспользуемый, заполненный нулевыми байтами.
desc_occ#Размер выделенной структуры.
desc_next#Указатель на следующую структуру SQLDA, если набор результатов содержит более одной записи.
reserved#Неиспользуемый указатель, содержит NULL. Сохранено для обеспечения совместимости с Informix.
Свойства для каждого поля приведены ниже, они хранятся в массиве sqlvar:
sqltype#Тип поля. Константы находятся в
sqltypes.hsqllen#Длина данных поля.
sqldata#Указатель на данные поля. Указатель имеет тип
char *, данные, на которые он указывает, находятся в бинарном формате. Пример:int intval; switch (sqldata->sqlvar[i].sqltype) { case SQLINTEGER: intval = *(int *)sqldata->sqlvar[i].sqldata; break; ... }sqlind#Указатель на индикатор NULL. Если он возвращается командами DESCRIBE или FETCH, то это всегда действительный указатель. Если он используется в качестве входного значения для
EXECUTE ... USING sqlda;, то значение NULL-указателя означает, что значение для этого поля не является NULL. В противном случае, это действительный указатель, иsqlitypeдолжен быть правильно установлен. Пример:if (*(int2 *)sqldata->sqlvar[i].sqlind != 0) printf("value is NULL\n");sqlname#Имя поля. Строка, завершающаяся нулем.
sqlformat#Зарезервировано в Informix, значение
PQfformatдля поля.sqlitype#Тип данных индикатора NULL. Всегда равен SQLSMINT при возврате данных с сервера. Когда
SQLDAиспользуется для параметризованного запроса, данные обрабатываются в соответствии с установленным типом.sqlilen#Длина данных индикатора NULL.
sqlxid#Расширенный тип поля, результат
PQftype.sqltypenamesqltypelensqlownerlensqlsourcetypesqlownernamesqlsourceidsqlflagssqlreserved#Unused.
sqlilongdata#Оно равно
sqldata, еслиsqllenбольше 32 кБ.
Пример:
EXEC SQL INCLUDE sqlda.h;
sqlda_t *sqlda; /* This doesn't need to be under embedded DECLARE SECTION */
EXEC SQL BEGIN DECLARE SECTION;
char *prep_stmt = "select * from table1";
int i;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL PREPARE mystmt FROM :prep_stmt;
EXEC SQL DESCRIBE mystmt INTO sqlda;
printf("# of fields: %d\n", sqlda->sqld);
for (i = 0; i < sqlda->sqld; i++)
printf("field %d: \"%s\"\n", sqlda->sqlvar[i]->sqlname);
EXEC SQL DECLARE mycursor CURSOR FOR mystmt;
EXEC SQL OPEN mycursor;
EXEC SQL WHENEVER NOT FOUND GOTO out;
while (1)
{
EXEC SQL FETCH mycursor USING sqlda;
}
EXEC SQL CLOSE mycursor;
free(sqlda); /* The main structure is all to be free(),
* sqlda and sqlda->sqlvar is in one allocated area */
Для получения дополнительной информации см. заголовочный файл sqlda.h и тест на совместимость src/interfaces/ecpg/test/compat_informix/sqlda.pgc.
34.15.4. Дополнительные функции #
decadd#Добавьте два значения типа decimal.
int decadd(decimal *arg1, decimal *arg2, decimal *sum);
Функция получает указатель на первый операнд типа decimal (
arg1), указатель на второй операнд типа decimal (arg2) и указатель на значение типа decimal, которое будет содержать сумму (sum). В случае успеха функция возвращает 0.ECPG_INFORMIX_NUM_OVERFLOWвозвращается в случае переполнения иECPG_INFORMIX_NUM_UNDERFLOWв случае потери значимости. -1 возвращается в случае других ошибок, аerrnoустанавливается в соответствующий номерerrnoиз pgtypeslib.deccmp#Сравните две переменные типа decimal.
int deccmp(decimal *arg1, decimal *arg2);
Функция получает указатель на первое десятичное значение (
arg1), указатель на второе десятичное значение (arg2) и возвращает целочисленное значение, которое указывает, какое из них большее значение.1, если значение, на которое указывает
arg1, больше значения, на которое указываетvar2-1, если значение, на которое указывает
arg1, меньше значения, на которое указываетarg20, если значение, на которое указывает
arg1, и значение, на которое указываетarg2, равны
deccopy#Скопировать десятичное значение.
void deccopy(decimal *src, decimal *target);
Функция получает указатель на десятичное значение, которое должно быть скопировано в качестве первого аргумента (
src), и указатель на целевую структуру типа decimal (target) в качестве второго аргумента.deccvasc#Преобразование значения из его ASCII-представления в десятичный тип.
int deccvasc(char *cp, int len, decimal *np);
Функция получает указатель на строку, содержащую строковое представление числа для преобразования (
cp), а также его длинуlen.np- указатель на десятичное значение, в котором сохраняется результат операции.Допустимыми форматами являются, например:
-2,.794,+3.44,592.49E07или-32.84e-4.Функция возвращает 0 в случае успеха. Если произошло переполнение или потеря значимости, возвращается
ECPG_INFORMIX_NUM_OVERFLOWилиECPG_INFORMIX_NUM_UNDERFLOW. Если ASCII-представление не может быть разобрано, возвращаетсяECPG_INFORMIX_BAD_NUMERICилиECPG_INFORMIX_BAD_EXPONENT, если возникла проблема при разборе показателя степени.deccvdbl#Преобразовать значение типа double в значение типа decimal.
int deccvdbl(double dbl, decimal *np);
Функция принимает переменную типа double, которую следует преобразовать, в качестве первого аргумента (
dbl). В качестве второго аргумента (np) функция принимает указатель на десятичную переменную, которая должна содержать результат операции.Функция возвращает 0 в случае успеха и отрицательное значение, если конвертация не удалась.
deccvint#Преобразовать значение типа int в значение типа decimal.
int deccvint(int in, decimal *np);
Функция принимает переменную типа int, которую следует преобразовать, в качестве первого аргумента (
in). В качестве второго аргумента (np) функция принимает указатель на десятичную переменную, которая должна содержать результат операции.Функция возвращает 0 в случае успеха и отрицательное значение, если конвертация не удалась.
deccvlong#Преобразовать значение типа long в значение типа decimal.
int deccvlong(long lng, decimal *np);
Функция принимает переменную типа long, которую следует преобразовать, в качестве первого аргумента (
lng). В качестве второго аргумента (np) функция принимает указатель на десятичную переменную, которая должна содержать результат операции.Функция возвращает 0 в случае успеха и отрицательное значение, если конвертация не удалась.
decdiv#Разделите две переменные типа decimal.
int decdiv(decimal *n1, decimal *n2, decimal *result);
Функция получает указатели на переменные, которые являются первым (
n1) и вторым (n2) операндами, и вычисляетn1/n2.result- указатель на переменную, которая должна содержать результат операции.При успешном выполнении возвращается 0, а в случае ошибки деления - отрицательное значение. Если произошло переполнение или потеря значимости, функция возвращает
ECPG_INFORMIX_NUM_OVERFLOWилиECPG_INFORMIX_NUM_UNDERFLOWсоответственно. Если обнаружена попытка деления на ноль, функция возвращаетECPG_INFORMIX_DIVIDE_ZERO.decmul#Умножение двух десятичных значений.
int decmul(decimal *n1, decimal *n2, decimal *result);
Функция получает указатели на переменные, которые являются первым (
n1) и вторым (n2) операндами, и вычисляетn1*n2.result- это указатель на переменную, которая должна содержать результат операции.При успешном выполнении возвращается 0, а в случае ошибки умножения - отрицательное значение. Если произошло переполнение или потеря значимости, функция возвращает
ECPG_INFORMIX_NUM_OVERFLOWилиECPG_INFORMIX_NUM_UNDERFLOWсоответственно.decsub#Вычтите одно десятичное значение из другого.
int decsub(decimal *n1, decimal *n2, decimal *result);
Функция получает указатели на переменные, которые являются первым (
n1) и вторым (n2) операндами и вычисляетn1-n2.result- это указатель на переменную, которая должна содержать результат операции.При успешном выполнении функция возвращает 0, а в случае неудачи - отрицательное значение. Если произошло переполнение или потеря значимости, функция возвращает
ECPG_INFORMIX_NUM_OVERFLOWилиECPG_INFORMIX_NUM_UNDERFLOWсоответственно.dectoasc#Преобразование переменной типа decimal в ее ASCII-представление в виде строки типа C char*.
int dectoasc(decimal *np, char *cp, int len, int right)
Функция получает указатель на переменную типа decimal (
np), которую она преобразует в текстовое представление.cp- это буфер, который должен содержать результат операции. Параметрrightуказывает, сколько цифр справа от десятичной точки должно быть включено в вывод. Результат будет округлен до этого количества десятичных цифр. Установкаrightв -1 указывает, что все доступные десятичные цифры должны быть включены в вывод. Если длина выходного буфера, которая указывается параметромlen, недостаточна для хранения текстового представления, включая завершающий нулевой байт, в результате будет сохранен только один символ*, и возвращается -1.Функция возвращает либо -1, если буфер
cpбыл слишком мал, либоECPG_INFORMIX_OUT_OF_MEMORY, если память была исчерпана.dectodbl#Преобразование переменной типа decimal в double.
int dectodbl(decimal *np, double *dblp);
Функция получает указатель на десятичное значение для преобразования (
np) и указатель на переменную типа double, которая должна содержать результат операции (dblp).При успешном выполнении возвращается 0, а в случае ошибки - отрицательное значение.
dectoint#Преобразовать переменную типа decimal в целое число.
int dectoint(decimal *np, int *ip);
Функция получает указатель на десятичное значение для преобразования (
np) и указатель на целочисленную переменную, которая должна содержать результат операции (ip).При успешном выполнении возвращается 0, а в случае ошибки - отрицательное значение. Если произошло переполнение, возвращается значение
ECPG_INFORMIX_NUM_OVERFLOW.Обратите внимание, что реализация ECPG отличается от реализации Informix. Informix ограничивает целое число диапазоном от -32767 до 32767, в то время как ограничения в реализации ECPG зависят от архитектуры (
INT_MIN .. INT_MAX).dectolong#Преобразовать переменную типа decimal в длинное целое число.
int dectolong(decimal *np, long *lngp);
Функция получает указатель на десятичное значение для преобразования (
np) и указатель на переменную типа long, которая должна содержать результат операции (lngp).При успешном выполнении возвращается 0, а в случае ошибки - отрицательное значение. Если произошло переполнение, возвращается значение
ECPG_INFORMIX_NUM_OVERFLOW.Обратите внимание, что реализация ECPG отличается от реализации Informix. Informix ограничивает длинное целое число диапазоном от -2,147,483,647 до 2,147,483,647, в то время как ограничения в реализации ECPG зависят от архитектуры (
-LONG_MAX .. LONG_MAX).rdatestr#Преобразует дату в строку типа C char*.
int rdatestr(date d, char *str);
Функция принимает два аргумента: первый - дата для преобразования (
d), а второй - указатель на целевую строку. Формат вывода всегдаyyyy-mm-dd, поэтому необходимо выделить как минимум 11 байт (включая нулевой байт-терминатор) для строки.Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.
Обратите внимание, что реализация ECPG отличается от реализации Informix. В Informix формат может быть изменен путем установки переменных среды. Однако в ECPG вы не можете изменить формат вывода.
rstrdate#Разбор текстового представления даты.
int rstrdate(char *str, date *d);
Функция получает текстовое представление даты для преобразования (
str) и указатель на переменную типа дата (d). Эта функция не позволяет указывать формат маски. Она использует формат маски по умолчанию Informix, который равенmm/dd/yyyy. Внутренне эта функция реализована с помощью функцииrdefmtdate. Поэтомуrstrdateне работает быстрее, и если у вас есть выбор, вы должны выбратьrdefmtdate, который позволяет явно указать формат маски.Функция возвращает те же значения, что и
rdefmtdate.rtoday#Получить текущую дату.
void rtoday(date *d);
Функция получает указатель на переменную типа дата (
d), которую она устанавливает в текущую дату.Внутренне эта функция использует функцию
PGTYPESdate_today.rjulmdy#Извлеките значения для дня, месяца и года из переменной типа date.
int rjulmdy(date d, short mdy[3]);
Функция получает дату
dи указатель на массив из 3 коротких целочисленных значенийmdy. Имя переменной указывает на последовательный порядок:mdy[0]будет содержать номер месяца,mdy[1]будет содержать значение дня, аmdy[2]будет содержать год.Функция в данный момент всегда возвращает 0.
Внутри функция использует функцию
PGTYPESdate_julmdy.rdefmtdate#Используйте маску формата для преобразования символьной строки в значение типа дата.
int rdefmtdate(date *d, char *fmt, char *str);
Функция получает указатель на значение даты, которое должно содержать результат операции (
d), маску формата для разбора даты (fmt) и строку C char*, содержащую текстовое представление даты (str). Ожидается, что текстовое представление будет соответствовать маске формата. Однако не требуется точное соответствие строки маске формата. Функция анализирует только последовательный порядок и ищет литералыyyилиyyyy, указывающие на позицию года,mmдля указания позиции месяца иddдля указания позиции дня.Функция возвращает следующие значения:
0 - Функция успешно завершена.
ECPG_INFORMIX_ENOSHORTDATE- Дата не содержит разделителей между днем, месяцем и годом. В этом случае входная строка должна быть точно 6 или 8 байтовой длины, но она этим не является.ECPG_INFORMIX_ENOTDMY- Форматная строка неправильно указывает последовательный порядок года, месяца и дня.ECPG_INFORMIX_BAD_DAY- Входная строка не содержит допустимого дня.ECPG_INFORMIX_BAD_MONTH- Входная строка не содержит допустимого месяца.ECPG_INFORMIX_BAD_YEAR- Входная строка не содержит допустимый год.
Внутренне эта функция реализована с использованием функции
PGTYPESdate_defmt_asc. См. ссылку там для таблицы примеров ввода.rfmtdate#Преобразование переменной типа date в ее текстовое представление с использованием маски формата.
int rfmtdate(date d, char *fmt, char *str);
Функция получает дату для преобразования (
d), маску формата (fmt) и строку, которая будет содержать текстовое представление даты (str).При успешном выполнении возвращается 0, а в случае ошибки - отрицательное значение.
Внутренне эта функция использует функцию
PGTYPESdate_fmt_asc, см. ссылку на нее для примеров.rmdyjul#Создайте значение даты из массива из 3 коротких целых чисел, которые указывают день, месяц и год даты.
int rmdyjul(short mdy[3], date *d);
Функция получает массив из 3 коротких целых чисел (
mdy) и указатель на переменную типа date, которая должна содержать результат операции.В настоящее время функция всегда возвращает 0.
Внутренне функция реализована с использованием функции
PGTYPESdate_mdyjul.rdayofweek#Возвращает число, представляющее день недели для значения даты.
int rdayofweek(date d);
Функция принимает переменную даты
dв качестве единственного аргумента и возвращает целое число, указывающее день недели для этой даты.0 - Воскресенье
1 - Понедельник
2 - Вторник
3 - Среда
4 - Четверг
5 - Пятница
6 - Суббота
Внутренне функция реализована с использованием функции
PGTYPESdate_dayofweek.dtcurrent#Получить текущую метку времени.
void dtcurrent(timestamp *ts);
Функция извлекает текущую метку времени и сохраняет ее в переменную timestamp, на которую указывает
ts.dtcvasc#Разбирает временную метку из ее текстового представления в переменную типа timestamp.
int dtcvasc(char *str, timestamp *ts);
Функция получает строку для разбора (
str) и указатель на переменную типа timestamp, которая должна содержать результат операции (ts).Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.
Внутренне эта функция использует функцию
PGTYPEStimestamp_from_asc. См. ссылку на справочник для таблицы с примерами входных данных.dtcvfmtasc#Разбирает временную метку из ее текстового представления, используя маску формата, в переменную временной метки.
dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)
Функция получает строку для разбора (
inbuf), маску формата для использования (fmtstr) и указатель на переменную времени, которая должна содержать результат операции (dtvalue).Эта функция реализована с помощью функции
PGTYPEStimestamp_defmt_asc. См. документацию там для списка спецификаторов формата, которые могут быть использованы.Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.
dtsub#Вычтите одну метку времени из другой и верните переменную типа интервал.
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
Функция вычтет значение переменной типа timestamp, на которую указывает
ts2, из значения переменной типа timestamp, на которую указываетts1, и сохранит результат в переменной типа interval, на которую указываетiv.При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
dttoasc#Преобразование переменной типа timestamp в строку типа C char*.
int dttoasc(timestamp *ts, char *output);
Функция получает указатель на переменную типа timestamp для преобразования (
ts) и строку, которая должна содержать результат операции (output). Она преобразуетtsв его текстовое представление в соответствии со стандартом SQL, которое должно бытьYYYY-MM-DD HH:MM:SS.При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
dttofmtasc#Преобразование переменной временной метки в C char* с использованием маски формата.
int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);
Функция получает указатель на временную метку, которую нужно преобразовать, в качестве первого аргумента (
ts), указатель на буфер вывода (output), максимальную длину, выделенную для буфера вывода (str_len), и маску формата, которую нужно использовать для преобразования (fmtstr).При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
Внутренне эта функция использует функцию
PGTYPEStimestamp_fmt_asc. См. ссылку на справку там, чтобы узнать, какие спецификаторы маски формата можно использовать.intoasc#Преобразование переменной интервала в строку типа C char*.
int intoasc(interval *i, char *str);
Функция получает указатель на переменную интервала для преобразования (
i) и строку, которая должна содержать результат операции (str). Она преобразуетiв его текстовое представление в соответствии со стандартом SQL, которое будетYYYY-MM-DD HH:MM:SS.При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
rfmtlong#Преобразование длинного целочисленного значения в его текстовое представление с использованием маски формата.
int rfmtlong(long lng_val, char *fmt, char *outbuf);
Функция получает значение типа long
lng_val, маску форматаfmtи указатель на буфер выводаoutbuf. Она преобразует значение типа long в его текстовое представление в соответствии с маской формата.Формат маски может состоять из следующих символов, указывающих формат:
*(звездочка) - если эта позиция будет пустой, заполните ее звездочкой.&(амперсанд) - если на этой позиции будет пробел, заполните его нулем.#- преобразование ведущих нулей в пробелы.<- выровнять число в строке по левому краю.,(запятая) - группирует числа из четырех или более цифр в группы из трех цифр, разделенных запятой..(точка) - этот символ разделяет целую часть числа от дробной части.-(минус) - знак минуса появляется, если число является отрицательным значением.+(плюс) - знак плюс появляется, если число является положительным значением.(- это заменяет знак минус перед отрицательным числом. Знак минус не будет отображаться.)- этот символ заменяет минус и печатается после отрицательного значения.$- символ валюты.
rupshift#Преобразование строки в верхний регистр.
void rupshift(char *str);
Функция получает указатель на строку и преобразует каждый символ в нижнем регистре в символ в верхнем регистре.
byleng#Вернуть количество символов в строке, не считая конечные пробелы.
int byleng(char *str, int len);
Функция ожидает фиксированную строку в качестве первого аргумента (
str) и ее длину в качестве второго аргумента (len). Она возвращает количество значимых символов, то есть длину строки без завершающих пробелов.ldchar#Скопировать строку фиксированной длины в строку с завершающим нулем.
void ldchar(char *src, int len, char *dest);
Функция получает фиксированную строку для копирования (
src), ее длину (len) и указатель на память назначения (dest). Обратите внимание, что для строки, на которую указываетdest, необходимо зарезервировать как минимумlen+1байт. Функция копирует не болееlenбайт в новое место (меньше, если исходная строка имеет завершающие пробелы) и добавляет нулевой символ-терминатор.rgetmsg#int rgetmsg(int msgnum, char *s, int maxsize);
Эта функция существует, но в данный момент не реализована!
rtypalign#int rtypalign(int offset, int type);
Эта функция существует, но в данный момент не реализована!
rtypmsize#int rtypmsize(int type, int len);
Эта функция существует, но в данный момент не реализована!
rtypwidth#int rtypwidth(int sqltype, int sqllen);
Эта функция существует, но в данный момент не реализована!
rsetnull#Установить переменную в значение NULL.
int rsetnull(int t, char *ptr);
Функция получает целое число, которое указывает тип переменной, и указатель на саму переменную, который приводится к указателю C типа char*.
Существуют следующие типы:
CCHARTYPE- Для переменной типаcharилиchar*CSHORTTYPE- Для переменной типаshort intCINTTYPE- Для переменной типаintCBOOLTYPE- Для переменной типаbooleanCFLOATTYPE- Для переменной типаfloatCLONGTYPE- Для переменной типаlongCDOUBLETYPE- Для переменной типаdoubleCDECIMALTYPE- Для переменной типаdecimalCDATETYPE- Для переменной типаdateCDTIMETYPE- Для переменной типаtimestamp
Вот пример вызова этой функции:
$char c[] = "abc "; $short s = 17; $int i = -74874; rsetnull(CCHARTYPE, (char *) c); rsetnull(CSHORTTYPE, (char *) &s); rsetnull(CINTTYPE, (char *) &i);
risnull#Проверка, является ли переменная NULL.
int risnull(int t, char *ptr);
Функция получает тип переменной для проверки (
t) и указатель на эту переменную (ptr). Обратите внимание, что последний должен быть приведен к типу char*. См. функциюrsetnullдля списка возможных типов переменных.Вот пример использования этой функции:
$char c[] = "abc "; $short s = 17; $int i = -74874; risnull(CCHARTYPE, (char *) c); risnull(CSHORTTYPE, (char *) &s); risnull(CINTTYPE, (char *) &i);
34.15.5. Дополнительные константы #
Обратите внимание, что все константы здесь описывают ошибки и все они определены для представления отрицательных значений. В описаниях различных констант вы также можете найти значение, которое эти константы представляют в текущей реализации. Однако вы не должны полагаться на это число. Однако вы можете полагаться на то, что все они определены для представления отрицательных значений.
ECPG_INFORMIX_NUM_OVERFLOW#Функции возвращают это значение, если произошло переполнение при вычислении. Внутренне оно определено как -1200 (определение Informix).
ECPG_INFORMIX_NUM_UNDERFLOW#Функции возвращают это значение, если произошла потеря значимости при вычислении. Внутренне оно определено как -1201 (определение Informix).
ECPG_INFORMIX_DIVIDE_ZERO#Функции возвращают это значение, если обнаружена попытка деления на ноль. Внутренне оно определено как -1202 (определение Informix).
ECPG_INFORMIX_BAD_YEAR#Функции возвращают это значение, если при разборе даты было обнаружено некорректное значение года. Внутренне оно определено как -1204 (определение Informix).
ECPG_INFORMIX_BAD_MONTH#Функции возвращают это значение, если при разборе даты было обнаружено недопустимое значение для месяца. Внутренне оно определено как -1205 (определение Informix).
ECPG_INFORMIX_BAD_DAY#Функции возвращают это значение, если при разборе даты было обнаружено некорректное значение для дня. Внутренне оно определено как -1206 (определение Informix).
ECPG_INFORMIX_ENOSHORTDATE#Функции возвращают это значение, если процедура разбора требует краткого представления даты, но не получает строку даты правильной длины. Внутренне оно определено как -1209 (определение Informix).
ECPG_INFORMIX_DATE_CONVERT#Функции возвращают это значение, если произошла ошибка при форматировании даты. Внутренне оно определено как -1210 (определение Informix).
ECPG_INFORMIX_OUT_OF_MEMORY#Функции возвращают это значение, если память была исчерпана во время их выполнения. Внутренне оно определено как -1211 (определение Informix).
ECPG_INFORMIX_ENOTDMY#Функции возвращают это значение, если парсер должен был получить маску формата (например,
mmddyy), но не все поля были указаны правильно. Внутренне оно определено как -1212 (определение Informix).ECPG_INFORMIX_BAD_NUMERIC#Функции возвращают это значение, если процедура разбора не может разобрать текстовое представление числового значения из-за наличия ошибок или если процедура не может завершить вычисление, включающее числовые переменные, потому что хотя бы одна из числовых переменных недействительна. Внутренне это определено как -1213 (определение Informix).
ECPG_INFORMIX_BAD_EXPONENT#Функции возвращают это значение, если процедура разбора не может разобрать показатель степени. Внутренне оно определено как -1216 (определение Informix).
ECPG_INFORMIX_BAD_DATE#Функции возвращают это значение, если процедура разбора не может разобрать дату. Внутренне оно определено как -1218 (определение Informix).
ECPG_INFORMIX_EXTRA_CHARS#Функции возвращают это значение, если в процессе разбора передаются дополнительные символы, которые не могут быть разобраны. Внутренне оно определено как -1264 (определение Informix).