33.15. Режим совместимости с Informix#
33.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-1C не знают о диапазонах, таких как, например, YEAR TO MINUTE
, поэтому в ECPG вы не найдете поддержки для этого.
33.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;
33.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
.
33.15.3. Дескрипторы областей SQLDA, совместимые с Informix #
Режим совместимости с Informix поддерживает другую структуру, отличную от описанной в Раздел 33.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.h
sqllen
#Длина данных поля.
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
.sqltypename
sqltypelen
sqlownerlen
sqlsourcetype
sqlownername
sqlsourceid
sqlflags
sqlreserved
#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
.
33.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
, меньше значения, на которое указываетarg2
0, если значение, на которое указывает
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 int
CINTTYPE
- Для переменной типаint
CBOOLTYPE
- Для переменной типаboolean
CFLOATTYPE
- Для переменной типаfloat
CLONGTYPE
- Для переменной типаlong
CDOUBLETYPE
- Для переменной типаdouble
CDECIMALTYPE
- Для переменной типаdecimal
CDATETYPE
- Для переменной типаdate
CDTIMETYPE
- Для переменной типа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);
33.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).