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и т. д. В противном случае препроцессор ECPG воспримет этот токен как главную переменную.
Существует два режима совместимости: INFORMIX, INFORMIX_SE
При компоновке программ, использующих этот режим совместимости, не забудьте выполнить компоновку с библиотекой libcompat которая поставляется вместе с препроцессором ECPG.
Помимо описанного выше «синтаксического сахара», данный Informix режим совместимости переносит в препроцессор ECPG некоторые функции ввода, вывода и преобразования данных, а также внедренные операторы SQL, известные из E/SQL.
Informix Режим совместимости тесно связан с библиотекой pgtypeslib препроцессора ECPG. Библиотека pgtypeslib сопоставляет типы данных SQL с типами данных в клиентской программе на языке C; также большинство дополнительных функций Informix режима совместимости позволяют работать с этими типами данных хост-программы на языке C. Однако следует учитывать, что степень совместимости ограничена. В нем не предпринимается попыток полностью скопировать Informix
поведение; он позволяет выполнять практически те же операции и предоставляет функции с аналогичными именами и базовым поведением, но он не является полной заменой, если вы используете Informix в данный момент. Более того,
некоторые типы данных различаются. Например,
Digital Q.DataBaseтипы данных datetime и тип данных interval не поддерживают диапазоны, такие как, например, YEAR TO MINUTE поэтому поддержка данной возможности в препроцессоре ECPG также отсутствует.
Специальный псевдотип Informix "string", предназначенный для хранения строковых данных с обрезанными справа пробелами, теперь поддерживается в режиме Informix без использования typedef. Фактически, в режиме Informix
препроцессор ECPG не обрабатывает исходные файлы, содержащие typedef sometype string;
EXEC SQL BEGIN DECLARE SECTION; string userid; /* эта переменная будет содержать данные с обрезанными пробелами */ EXEC SQL END DECLARE SECTION; EXEC SQL FETCH MYCUR INTO :userid;
CLOSE DATABASE #
Этот оператор закрывает текущее соединение. Фактически он является
синонимом команды препроцессора ECPG DISCONNECT CURRENT:
$CLOSE DATABASE; /* закрыть текущее соединение */ EXEC SQL CLOSE DATABASE;
FREE cursor_name #
Из-за различий в механизмах работы препроцессора ECPG и Informix ESQL/C (а именно, какие этапы
являются чисто грамматическими преобразованиями, а какие полагаются на базовую библиотеку времени выполнения)
отсутствует FREE cursor_name оператор в препроцессоре ECPG. Это связано с тем, что в препроцессоре ECPG
DECLARE CURSOR не преобразуется в вызов функции в
библиотеке времени выполнения, которая использует имя курсора. Это означает, что в библиотеке времени выполнения препроцессора ECPG не ведется
учет SQL-курсоров — он осуществляется только на стороне сервера PostgreSQL.
FREE statement_name #
FREE statement_name является синонимом оператора DEALLOCATE PREPARE statement_name.
В режиме совместимости с Informix поддерживается структура, отличная от описанной в Раздел 4.3.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 descriptor.
sqlvar #Указатель на свойства полей.
desc_name #Не используется, заполнено нулевыми байтами.
desc_occ #Размер выделенной структуры.
desc_next #Указатель на следующую структуру SQLDA, если результирующий набор содержит более одной записи.
зарезервировано #Неиспользуемый указатель, содержит значение 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 #Имя поля. Строка, завершающаяся нулевым символом (0-terminated).
sqlformat #
Зарезервировано в Informix, значение параметра PQfformat для данного поля.
sqlitype #
Тип данных индикатора NULL. При возврате данных с сервера всегда используется тип SQLSMINT.
Когда SQLDA используется для параметризованного запроса, данные обрабатываются
в соответствии с установленным типом.
sqlilen #Длина данных индикатора NULL.
sqlxid #
Расширенный тип поля, результат PQftype.
sqltypenamesqltypelensqlownerlensqlsourcetypesqlownernamesqlsourceidsqlflagssqlreserved #Не используется.
sqlilongdata #
Это значение равно sqldata если sqllen превышает 32 кБ.
Пример:
EXEC SQL INCLUDE sqlda.h;
sqlda_t *sqlda; /* Это не обязательно должно находиться в секции объявлений 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); /* Основная структура должна быть полностью освобождена(),
* структуры sqlda и sqlda->sqlvar находятся в одной выделенной области памяти */
Для получения дополнительной информации см. sqlda.h заголовочный файл и
src/interfaces/ecpg/test/compat_informix/sqlda.pgc регрессионный тест.
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);
Функция принимает указатель на первое значение типа данных decimal
(arg1), указатель на второе значение типа данных decimal
(arg2) и возвращает целое число, указывающее, какое
из значений больше.
1, если значение, на которое arg1 указывает первый параметр, больше, чем
значение, на которое var2 указывает параметр,
-1, если значение, на которое arg1 меньше, чем значение, на которое указывает
значение, на которое arg2 указывает на
0, если значение, на которое arg1 указывает первый указатель, и значение, на которое
arg2 указывает второй указатель, равны
deccopy #Копирование значения типа данных decimal.
void deccopy(decimal *src, decimal *target);
Функция принимает указатель на значение типа данных decimal, которое должно быть
скопировано, в качестве первого аргумента (src) и указатель на
целевую структуру типа данных decimal (target) в качестве второго
параметра.
deccvasc #Преобразование значения из представления ASCII в тип данных decimal.
int deccvasc(char *cp, int len, decimal *np);
Функция принимает указатель на строку, содержащую текстовое представление
строковое представление числа для преобразования (cp), а также
его длина len. np представляет собой указатель на
тип данных decimal, в который сохраняется результат операции.
Допустимыми форматами являются, например:
-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), функция получает указатель на
переменную типа данных decimal, которая должна содержать результат операции.
Функция возвращает 0 в случае успеха и отрицательное значение, если преобразование завершилось ошибкой.
deccvint #Преобразование значения типа int в значение типа данных decimal.
int deccvint(int in, decimal *np);
Функция принимает переменную типа int, которая должна быть
преобразуемое значение в качестве первого аргумента (in). В качестве второго
аргумента (np), функция получает указатель на
переменную типа данных decimal, которая должна содержать результат операции.
Функция возвращает 0 в случае успеха и отрицательное значение, если преобразование завершилось ошибкой.
deccvlong #Преобразование значения типа long в значение типа данных decimal.
int deccvlong(long lng, decimal *np);
Функция принимает переменную типа long, которая должна быть
преобразуемое значение в качестве первого аргумента (lng). В качестве второго
аргумента (np), функция получает указатель на
переменную типа данных decimal, которая должна содержать результат операции.
Функция возвращает 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 #Выполняет умножение двух значений типа данных decimal.
int decmul(decimal *n1, decimal *n2, decimal *result);
Функция принимает указатели на переменные, выступающие в качестве первого
(n1) и второго (n2) операндов и
вычисляет частное. n1*n2. result представляет собой
указатель на переменную, предназначенную для хранения результата операции.
В случае успеха возвращается 0, а в случае ошибки умножения —
отрицательное значение. Если произошло переполнение или потеря точности, функция возвращает
ECPG_INFORMIX_NUM_OVERFLOW или
ECPG_INFORMIX_NUM_UNDERFLOW соответственно.
decsub #Вычитание одного значения типа данных decimal из другого.
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.
returned.
Функция возвращает -1, если размер буфера cp был
недостаточен или ECPG_INFORMIX_OUT_OF_MEMORY если оперативная память была
исчерпана.
dectodbl #Преобразование переменной типа данных decimal в тип данных double.
int dectodbl(decimal *np, double *dblp);
Функция принимает указатель на преобразуемое значение типа данных decimal
(np) и указатель на переменную типа данных double, которая
должна содержать результат операции (dblp).
В случае успеха возвращается 0, а если преобразование завершилось ошибкой — отрицательное значение.
dectoint #Преобразование переменной типа данных decimal в целое число.
int dectoint(decimal *np, int *ip);
Функция принимает указатель на преобразуемое значение типа данных decimal
(np) и указатель на целочисленную переменную, которая
должна содержать результат операции (ip).
В случае успеха возвращается 0, а если преобразование завершилось ошибкой —
отрицательное значение. Если произошло переполнение, ECPG_INFORMIX_NUM_OVERFLOW
возвращается значение.
Обратите внимание, что реализация в препроцессоре ECPG отличается от Informix
информатики. Informix ограничивает целое число диапазоном от -32767 до
32767, в то время как ограничения в реализации препроцессора ECPG зависят от
архитектуры (INT_MIN .. INT_MAX).
dectolong #Преобразование переменной типа данных decimal в длинное целое число (тип long).
int dectolong(decimal *np, long *lngp);
Функция принимает указатель на преобразуемое значение типа данных decimal
(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 #Преобразует дату в строку типа char* в языке C.
int rdatestr(date d, char *str);
Функция принимает два аргумента: первым является дата для
преобразования (d), а вторым — указатель на целевую
строку. Формат вывода всегда yyyy-mm-dd, поэтому необходимо
выделить как минимум 11 байт (включая нулевой байт-терминатор) для
данной строки.
Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.
Обратите внимание, что реализация в препроцессоре ECPG отличается от Informix реализации. В Informix на формат может влиять установка переменных окружения. Однако в препроцессоре ECPG невозможно изменить формат вывода.
rstrdate #Выполняет разбор текстового представления даты.
int rstrdate(char *str, date *d);
Функция принимает текстовое представление даты для преобразования
(str) и указатель на переменную типа date
(d). Данная функция не позволяет указывать маску
формата. Она использует маску формата по умолчанию Informix которая представляет собой
mm/dd/yyyy. Внутренне данная функция реализована
посредством rdefmtdate. Следовательно, rstrdate принимает значение
не быстрее, и при наличии выбора следует отдавать предпочтение
rdefmtdate которая позволяет указывать маску формата
явным образом.
Функция возвращает те же значения, что и rdefmtdate.
rtoday #Получение текущей даты.
void rtoday(date *d);
Функция PGTYPESdate_today принимает указатель на переменную типа date (d)
которую она устанавливает равной текущей дате.
Внутренне данная функция использует функцию PGTYPESdate_today
функция.
rjulmdy #Извлечение значений дня, месяца и года из переменной типа date.
int rjulmdy(date d, short mdy[3]);
Данная функция принимает значение даты d и указатель на массив
из 3 целочисленных значений типа short mdy. Имя переменной указывает на
последовательный порядок: mdy[0] будет содержать
порядковый номер месяца, mdy[1] будет содержать значение
дня, а mdy[2] будет содержать значение года.
На данный момент функция всегда возвращает 0.
На внутреннем уровне функция использует PGTYPESdate_julmdy
функция.
rdefmtdate #Используйте маску формата для преобразования символьной строки в значение типа данных char date.
int rdefmtdate(date *d, char *fmt, char *str);
Функция принимает указатель на значение даты, которое должно содержать
результат операции (d), маску формата, используемую для
разбора даты (fmt) и строку типа char* в языке C, содержащую
текстовое представление даты (str). Текстовое
представление должно соответствовать маске формата. При этом нет
необходимости в строгом соответствии 1:1 строки и маски формата. Данная
функция анализирует только последовательность и ищет литералы,
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 коротких целых чисел (short integer), задающих день, месяц и год даты.
int rmdyjul(short mdy[3], date *d);
Данная функция принимает массив из 3 коротких целых чисел
(mdy) и указатель на переменную типа date, которая должна
содержать результат операции.
В настоящее время функция всегда возвращает 0.
Внутренняя реализация функции использует функцию PGTYPESdate_mdyjul.
rdayofweek #Возвращает число, представляющее день недели для заданного значения даты.
int rdayofweek(date d);
Функция принимает переменную типа date 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 #Преобразует строку из текстового представления в переменную типа timestamp с использованием маски формата.
dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)
Функция принимает строку для анализа (inbuf), the
используемая маска формата (fmtstr) и указатель на переменную типа timestamp
переменная, в которой должен быть сохранен результат операции
(dtvalue).
Данная функция реализована при помощи PGTYPEStimestamp_defmt_asc функция. См. документацию
там приведен список спецификаторов формата, которые можно использовать.
Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.
dtsub #Вычитает одну временную метку из другой и возвращает переменную, имеющую interval.
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
Данная функция вычитает значение переменной типа timestamp, на которую ts2
указывает параметр, из значения переменной типа timestamp, на которую ts1 указывает параметр,
и сохраняет результат в переменной типа данных interval, на которую iv
указывает параметр.
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
dttoasc #Преобразует переменную типа timestamp в строку тип char* в языке C.
int dttoasc(timestamp *ts, char *output);
Данная функция принимает указатель на переменную типа timestamp для преобразования
(ts) и строку, которая должна содержать результат выполнения
операции (вывод). Она преобразует ts в её
текстовое представление в соответствии со стандарт SQL, которым
является YYYY-MM-DD HH:MM:SS.
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
dttofmtasc #Преобразование переменной типа timestamp в строку типа char* в языке C с использованием маски формата.
int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);
Функция принимает указатель на преобразуемую временную метку в качестве
первого аргумента (ts), указатель на выходной буфер
(вывод), максимальная длина, выделенная для
выходного буфера (str_len) и маска формата для
использования при преобразовании (fmtstr).
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
Внутри эта функция использует функцию PGTYPEStimestamp_fmt_asc функцию. См. справочную информацию о том,
какие спецификаторы маски формата можно использовать.
intoasc #Преобразовать переменную типа данных interval в строку типа char* в языке C.
int intoasc(interval *i, char *str);
Функция принимает указатель на переменную типа данных interval для преобразования
(i) и строку, которая должна содержать результат выполнения
операции (str). Она преобразует i в её
текстовое представление в соответствии со стандарт SQL, которым
является YYYY-MM-DD HH:MM:SS.
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
rfmtlong #Преобразовать значение типа long integer в его текстовое представление, используя маска формата.
int rfmtlong(long lng_val, char *fmt, char *outbuf);
Функция принимает значение типа long lng_val, форматную
маску fmt и указатель на выходной буфер
outbuf. Функция преобразует значение типа long в соответствии с форматом
маски в его текстовое представление.
Маска формата может состоять из следующих форматирующих символов:
* (asterisk) — если эта позиция должна быть пустой,
в противном случае заполните её символом «звёздочка».
& (ampersand) — если эта позиция должна быть
пустой, в противном случае заполните её нулем.
# — преобразовывать ведущие нули в пробелы.
< — выравнивать число в строке по левому краю.
, (comma) — группировать числа из четырех и более цифр
в группы по три цифры, разделенные запятой.
. (period) — этот символ отделяет
целую часть числа от дробной части.
- (minus) — знак минуса выводится, если число
является отрицательным.
+ (plus) — знак плюса выводится, если число является
положительным.
( — заменяет знак минуса перед
отрицательным числом. Знак минуса не будет отображаться.
) — этот символ заменяет минус и
выводится после отрицательного значения.
$ — символ валюты.
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). Обратите внимание, что необходимо зарезервировать как
минимум len+1 байт для строки, на которую dest
указывает параметр. Функция копирует не более 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 for a list of possible variable types.
Ниже приведен пример использования данной функции:
$char c[] = "abc "; $short s = 17; $int i = -74874; risnull(CCHARTYPE, (char *) c); risnull(CSHORTTYPE, (char *) &s); risnull(CINTTYPE, (char *) &i);
Обратите внимание, что все константы в данном разделе описывают ошибки и все они определены как отрицательные значения. В описаниях различных констант также приведены значения, которые они принимают в текущей реализации. Однако не следует полагаться на конкретные числовые значения. Вы можете полагаться лишь на тот факт, что все они определены как отрицательные значения.
ECPG_INFORMIX_NUM_OVERFLOW #Функции возвращают данное значение, если при вычислении произошло переполнение. вычислении. На внутреннем уровне значение определено как -1200 (макроопределение Informix definition).
ECPG_INFORMIX_NUM_UNDERFLOW #Функции возвращают данное значение, если при вычислении произошла потеря значимости. На внутреннем уровне значение определено как -1201 (макроопределение Informix определение).
ECPG_INFORMIX_DIVIDE_ZERO #Функции возвращают данное значение, если зафиксирована попытка деления на ноль. На внутреннем уровне оно определено как -1202 (параметр Informix определение).
ECPG_INFORMIX_BAD_YEAR #Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение года. На внутреннем уровне оно определено как -1204 (параметр Informix definition).
ECPG_INFORMIX_BAD_MONTH #Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение месяца. некорректное значение года. На внутреннем уровне оно определено как -1205 (параметр Informix definition).
ECPG_INFORMIX_BAD_DAY #Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение дня. некорректное значение года. На внутреннем уровне оно определено как -1206 (параметр Informix definition).
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 #Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать текстовое представление для типа numeric, так как оно содержит ошибки, или если подпрограмма не может завершить вычисление с участием переменных типа numeric, так как по крайней мере одна из переменных типа numeric недействительна. Внутренне оно определено как -1213 (параметр Informix определение).
ECPG_INFORMIX_BAD_EXPONENT #Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать экспоненту. Внутренне оно определено как -1216 (параметр Informix определение).
ECPG_INFORMIX_BAD_DATE #Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать дату. Внутренне оно определено как -1218 (параметр Informix определение).
ECPG_INFORMIX_EXTRA_CHARS #Функции возвращают это значение, если подпрограмме синтаксического анализа переданы лишние символы, которые он не может разобрать. Внутренне он определен как -1264 (параметр Informix определение).