34.15. Режим совместимости с Informix#

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.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.

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, меньше значения, на которое указывает 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);

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).