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

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