33.6. Библиотека pgtypes#

33.6. Библиотека pgtypes

33.6. Библиотека pgtypes #

Библиотека pgtypes отображает типы базы данных Tantor BEна эквиваленты на языке C, которые могут быть использованы в программах на языке C. Она также предлагает функции для выполнения базовых вычислений с этими типами на языке C, то есть без помощи сервера Tantor BE. См. следующий пример:

EXEC SQL BEGIN DECLARE SECTION;
   date date1;
   timestamp ts1, tsout;
   interval iv1;
   char *out;
EXEC SQL END DECLARE SECTION;

PGTYPESdate_today(&date1);
EXEC SQL SELECT started, duration INTO :ts1, :iv1 FROM datetbl WHERE d=:date1;
PGTYPEStimestamp_add_interval(&ts1, &iv1, &tsout);
out = PGTYPEStimestamp_to_asc(&tsout);
printf("Started + duration: %s\n", out);
PGTYPESchar_free(out);

33.6.1. Символьные строки #

Некоторые функции, такие как PGTYPESnumeric_to_asc, возвращают указатель на свеже выделенную строку символов. Эти результаты следует освобождать с помощью функции PGTYPESchar_free, а не free. (Это важно только в Windows, где выделение и освобождение памяти иногда должны выполняться одной и той же библиотекой).

33.6.2. Тип данных numeric #

Тип numeric предлагает выполнение вычислений с произвольной точностью. См. Раздел 8.1 для эквивалентного типа в сервере Tantor BE. Из-за произвольной точности этой переменной она должна иметь возможность динамического расширения и сжатия. Поэтому вы можете создавать числовые переменные только в куче, с помощью функций PGTYPESnumeric_new и PGTYPESnumeric_free. Тип decimal, который похож, но ограничен по точности, может быть создан как в стеке, так и в куче.

Следующие функции могут быть использованы для работы с числовым типом:

PGTYPESnumeric_new #

Запросите указатель на новую выделенную числовую переменную.

numeric *PGTYPESnumeric_new(void);

PGTYPESnumeric_free #

Освобождает числовой тип, освобождая всю его память.

void PGTYPESnumeric_free(numeric *var);

PGTYPESnumeric_from_asc #

Разбор числового типа из его строковой нотации.

numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);

Допустимыми форматами являются, например: -2, .794, +3.44, 592.49E07 или -32.84e-4. Если значение может быть успешно разобрано, возвращается действительный указатель, в противном случае - указатель NULL. В настоящее время ECPG всегда разбирает полную строку, поэтому в настоящее время не поддерживается возможность сохранения адреса первого недопустимого символа в *endptr. Вы можете безопасно установить endptr в NULL.

PGTYPESnumeric_to_asc #

Возвращает указатель на строку, выделенную с помощью функции malloc, которая содержит строковое представление числового типа num.

char *PGTYPESnumeric_to_asc(numeric *num, int dscale);

Числовое значение будет выведено с dscale десятичными цифрами, с применением округления при необходимости. Результат должен быть освобожден с помощью PGTYPESchar_free().

PGTYPESnumeric_add #

Добавьте две числовые переменные в третью.

int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);

Функция добавляет переменные var1 и var2 в переменную результата result. Функция возвращает 0 в случае успеха и -1 в случае ошибки.

PGTYPESnumeric_sub #

Вычтите две числовые переменные и верните результат в третьей переменной.

int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);

Функция вычитает переменную var2 из переменной var1. Результат операции сохраняется в переменной result. Функция возвращает 0 в случае успеха и -1 в случае ошибки.

PGTYPESnumeric_mul #

Умножьте две числовые переменные и верните результат в третьей переменной.

int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);

Функция умножает переменные var1 и var2. Результат операции сохраняется в переменной result. Функция возвращает 0 в случае успеха и -1 в случае ошибки.

PGTYPESnumeric_div #

Разделите две числовые переменные и верните результат в третью переменную.

int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);

Функция делит переменные var1 на var2. Результат операции сохраняется в переменной result. Функция возвращает 0 в случае успеха и -1 в случае ошибки.

PGTYPESnumeric_cmp #

Сравните две числовые переменные.

int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)

Эта функция сравнивает две числовые переменные. В случае ошибки возвращается значение INT_MAX. В случае успеха функция возвращает один из трех возможных результатов:

  • 1, если var1 больше, чем var2

  • -1, если var1 меньше, чем var2

  • 0, если var1 и var2 равны

PGTYPESnumeric_from_int #

Преобразование переменной типа int в переменную типа numeric.

int PGTYPESnumeric_from_int(signed int int_val, numeric *var);

Эта функция принимает переменную типа signed int и сохраняет ее в числовой переменной var. В случае успешного выполнения возвращается 0, а в случае ошибки -1.

PGTYPESnumeric_from_long #

Преобразование переменной типа long int в переменную типа numeric.

int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);

Эта функция принимает переменную типа signed long int и сохраняет ее в числовой переменной var. В случае успешного выполнения возвращается 0, а в случае ошибки -1.

PGTYPESnumeric_copy #

Скопировать одну числовую переменную в другую.

int PGTYPESnumeric_copy(numeric *src, numeric *dst);

Эта функция копирует значение переменной, на которую указывает src, в переменную, на которую указывает dst. Она возвращает 0 в случае успеха и -1, если произошла ошибка.

PGTYPESnumeric_from_double #

Преобразование переменной типа double в числовой тип.

int  PGTYPESnumeric_from_double(double d, numeric *dst);

Эта функция принимает переменную типа double и сохраняет результат в переменной, на которую указывает dst. Она возвращает 0 в случае успеха и -1, если произошла ошибка.

PGTYPESnumeric_to_double #

Преобразование переменной типа numeric в double.

int PGTYPESnumeric_to_double(numeric *nv, double *dp)

Функция преобразует числовое значение из переменной, на которую указывает nv, в переменную типа double, на которую указывает dp. Она возвращает 0 в случае успеха и -1, если произошла ошибка, включая переполнение. При переполнении значение глобальнаой переменной errno будет дополнительно установлено как PGTYPES_NUM_OVERFLOW.

PGTYPESnumeric_to_int #

Преобразование переменной типа numeric в int.

int PGTYPESnumeric_to_int(numeric *nv, int *ip);

Функция преобразует числовое значение из переменной, на которую указывает nv, в целочисленную переменную, на которую указывает ip. Она возвращает 0 в случае успеха и -1, если произошла ошибка, включая переполнение. При переполнении глобальная переменная errno будет установлена в значение PGTYPES_NUM_OVERFLOW дополнительно.

PGTYPESnumeric_to_long #

Преобразование переменной типа numeric в long.

int PGTYPESnumeric_to_long(numeric *nv, long *lp);

Функция преобразует числовое значение из переменной, на которую указывает nv, в переменную длинного целого числа, на которую указывает lp. Она возвращает 0 в случае успеха и -1, если произошла ошибка, включая переполнение. При переполнении глобальная переменная errno будет установлена в значение PGTYPES_NUM_OVERFLOW дополнительно.

PGTYPESnumeric_to_decimal #

Преобразование переменной типа numeric в decimal.

int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);

Функция преобразует числовое значение из переменной, на которую указывает src, в десятичную переменную, на которую указывает dst. Она возвращает 0 в случае успеха и -1, если произошла ошибка, включая переполнение. При переполнении глобальная переменная errno будет установлена в значение PGTYPES_NUM_OVERFLOW.

PGTYPESnumeric_from_decimal #

Преобразование переменной типа decimal в numeric.

int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);

Функция преобразует десятичное значение из переменной, на которую указывает src, в числовую переменную, на которую указывает dst. Она возвращает 0 в случае успеха и -1, если произошла ошибка. Поскольку тип decimal реализован как ограниченная версия типа numeric, переполнение при этом преобразовании невозможно.

33.6.3. Тип данных date #

Тип данных date в C позволяет вашим программам работать с данными типа SQL date. См. Раздел 8.5 для эквивалентного типа в сервере Tantor BE.

Следующие функции могут быть использованы для работы с типом данных дата:

PGTYPESdate_from_timestamp #

Извлечение даты из временной метки.

date PGTYPESdate_from_timestamp(timestamp dt);

Функция принимает временную метку в качестве единственного аргумента и возвращает извлеченную дату из этой временной метки.

PGTYPESdate_from_asc #

Разбор даты из ее текстового представления.

date PGTYPESdate_from_asc(char *str, char **endptr);

Функция принимает строку C char* str и указатель на строку C char* endptr. В настоящее время ECPG всегда разбирает полную строку, поэтому в настоящее время не поддерживается возможность сохранения адреса первого недопустимого символа в *endptr. Вы можете безопасно установить endptr в NULL.

Обратите внимание, что функция всегда предполагает даты в формате MDY, и в настоящее время нет переменной, чтобы изменить это в ECPG.

Таблица 33.2 показывает допустимые форматы ввода.

Таблица 33.2. Допустимые форматы ввода для PGTYPESdate_from_asc

ВводРезультат
January 8, 1999January 8, 1999
1999-01-08January 8, 1999
1/8/1999January 8, 1999
1/18/1999January 18, 1999
01/02/031 февраля 2003 года
1999-Jan-088 января 1999
08-янв-19998 января 1999
08-Янв-19998 Января, 1999
99-Jan-08January 8, 1999
08-Jan-998 января 1999
08-Янв-068 января 2006
Jan-08-99January 8, 1999
19990108ISO 8601; January 8, 1999
990108ISO 8601; January 8, 1999
1999.008year and day of year
J2451187Julian day
8 января 99 г. до н.э.99 год до нашей эры

PGTYPESdate_to_asc #

Вернуть текстовое представление переменной даты.

char *PGTYPESdate_to_asc(date dDate);

Функция принимает дату dDate в качестве единственного параметра. Она будет выводить дату в формате 1999-01-18, то есть в формате YYYY-MM-DD. Результат должен быть освобожден с помощью PGTYPESchar_free().

PGTYPESdate_julmdy #

Извлеките значения для дня, месяца и года из переменной типа date.

void PGTYPESdate_julmdy(date d, int *mdy);

Функция получает дату d и указатель на массив из 3 целочисленных значений mdy. Имя переменной указывает на последовательный порядок: mdy[0] будет содержать номер месяца, mdy[1] будет содержать значение дня, а mdy[2] будет содержать год.

PGTYPESdate_mdyjul #

Создайте значение даты из массива из 3 целых чисел, которые указывают день, месяц и год даты.

void PGTYPESdate_mdyjul(int *mdy, date *jdate);

Функция принимает массив из 3 целых чисел (mdy) в качестве первого аргумента и указатель на переменную типа date в качестве второго аргумента, которая должна содержать результат операции.

PGTYPESdate_dayofweek #

Возвращает число, представляющее день недели для значения даты.

int PGTYPESdate_dayofweek(date d);

Функция принимает переменную даты d в качестве единственного аргумента и возвращает целое число, указывающее день недели для этой даты.

  • 0 - Воскресенье

  • 1 - Понедельник

  • 2 - Вторник

  • 3 - Среда

  • 4 - Четверг

  • 5 - Пятница

  • 6 - Суббота

PGTYPESdate_today #

Получить текущую дату.

void PGTYPESdate_today(date *d);

Функция получает указатель на переменную типа дата (d), которую она устанавливает в текущую дату.

PGTYPESdate_fmt_asc #

Преобразование переменной типа date в ее текстовое представление с использованием маски формата.

int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);

Функция получает дату для преобразования (dDate), маску формата (fmtstring) и строку, которая будет содержать текстовое представление даты (outbuf).

При успешном выполнении возвращается 0, а в случае ошибки - отрицательное значение.

Следующие литералы являются спецификаторами полей, которые вы можете использовать:

  • dd - Номер дня месяца.

  • mm - Номер месяца года.

  • yy - Номер года в виде двухзначного числа.

  • yyyy - Номер года в виде четырехзначного числа.

  • ddd - Название дня (сокращенное).

  • mmm - Название месяца (сокращенное).

Все остальные символы копируются 1:1 в выходную строку.

Таблица 33.3 указывает на несколько возможных форматов. Это даст вам представление о том, как использовать эту функцию. Все строки вывода основаны на одной и той же дате: 23 ноября 1959 года.

Таблица 33.3. Допустимые форматы ввода для PGTYPESdate_fmt_asc

ФорматРезультат
mmddyy112359
ddmmyy231159
yymmdd591123
yy/mm/dd59/11/23
yy mm dd59 11 23
yy.mm.dd59.11.23
.мм.гггг.дд..11.1959.23.
mmm. dd, yyyyNov. 23, 1959
mmm dd yyyyNov 23 1959
yyyy dd mm1959 23 11
ddd, mmm. dd, yyyyMon, Nov. 23, 1959
(ddd) mmm. dd, yyyy(Mon) Nov. 23, 1959

PGTYPESdate_defmt_asc #

Используйте маску формата для преобразования строки C char* в значение типа date.

int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);

Функция получает указатель на значение даты, которое должно содержать результат операции (d), маску формата для разбора даты (fmt) и строку C char*, содержащую текстовое представление даты (str). Ожидается, что текстовое представление будет соответствовать маске формата. Однако не требуется точное соответствие строки маске формата. Функция анализирует только последовательный порядок и ищет литералы yy или yyyy, указывающие на позицию года, mm для указания позиции месяца и dd для указания позиции дня.

Таблица 33.4 указывает на несколько возможных форматов. Это даст вам представление о том, как использовать эту функцию.

Таблица 33.4. Допустимые форматы ввода для rdefmtdate

ФорматСтрокаРезультат
ddmmyy21-2-541954-02-21
ddmmyy2-12-541954-12-02
ddmmyy201119541954-11-20
ddmmyy1304641964-04-13
mmm.dd.yyyyMAR-12-19671967-03-12
yy/mm/dd1954, February 3rd1954-02-03
mmm.dd.yyyy0412691969-04-12
yy/mm/ddIn the year 2525, in the month of July, mankind will be alive on the 28th day2525-07-28
dd-mm-yyI said on the 28th of July in the year 25252525-07-28
mmm.dd.yyyy9/14/581958-09-14
yy/mm/dd47/03/291947-03-29
mmm.dd.yyyyoct 28 19751975-10-28
mmddyyNov 14th, 19851985-11-14

33.6.4. Тип timestamp #

Тип timestamp в C позволяет вашим программам работать с данными типа timestamp в SQL. См. Раздел 8.5 для эквивалентного типа в сервере Tantor BE.

Следующие функции могут быть использованы для работы с типом timestamp:

PGTYPEStimestamp_from_asc #

Разбор временной метки из ее текстового представления в переменную временной метки.

timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);

Функция получает строку для разбора (str) и указатель на C char* (endptr). В настоящее время ECPG всегда разбирает полную строку, поэтому в настоящее время невозможно сохранить адрес первого недопустимого символа в *endptr. Вы можете безопасно установить endptr в NULL.

Функция возвращает разобранную временную метку в случае успеха. В случае ошибки возвращается значение PGTYPESInvalidTimestamp, а errno устанавливается в PGTYPES_TS_BAD_TIMESTAMP. См. PGTYPESInvalidTimestamp для важных замечаний об этом значении.

Обычно, входная строка может содержать любую комбинацию допустимой спецификации даты, пробельного символа и допустимой спецификации времени. Обратите внимание, что часовые пояса не поддерживаются ECPG. Он может их разбирать, но не применяет никаких вычислений, как это делает сервер Tantor BE, например. Спецификаторы часовых поясов молча отбрасываются.

Таблица 33.5 содержит несколько примеров для входных строк.

Таблица 33.5. Допустимые форматы ввода для PGTYPEStimestamp_from_asc

ВводРезультат
1999-01-08 04:05:061999-01-08 04:05:06
January 8 04:05:06 1999 PST1999-01-08 04:05:06
1999-Jan-08 04:05:06.789-81999-01-08 04:05:06.789 (time zone specifier ignored)
J2451187 04:05-08:001999-01-08 04:05:00 (игнорируется указатель часового пояса)

PGTYPEStimestamp_to_asc #

Преобразует дату в строку типа C char*.

char *PGTYPEStimestamp_to_asc(timestamp tstamp);

Функция принимает временную метку tstamp в качестве единственного аргумента и возвращает выделенную строку, содержащую текстовое представление временной метки. Результат должен быть освобожден с помощью PGTYPESchar_free().

PGTYPEStimestamp_current #

Получить текущую метку времени.

void PGTYPEStimestamp_current(timestamp *ts);

Функция извлекает текущую метку времени и сохраняет ее в переменную timestamp, на которую указывает ts.

PGTYPEStimestamp_fmt_asc #

Преобразование переменной временной метки в C char* с использованием маски формата.

int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);

Функция получает указатель на временную метку, которую нужно преобразовать, в качестве первого аргумента (ts), указатель на буфер вывода (output), максимальную длину, выделенную для буфера вывода (str_len), и маску формата, которую нужно использовать для преобразования (fmtstr).

При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.

Вы можете использовать следующие спецификаторы формата для маски формата. Спецификаторы формата являются теми же, что используются в функции strftime в libc. Любой не являющийся спецификатором формата будет скопирован в выходной буфер.

  • %A - заменяется на национальное представление полного названия дня недели.

  • %a - заменяется на национальное представление сокращенного названия дня недели.

  • %B - заменяется на национальное представление полного названия месяца.

  • %b - заменяется на национальное представление сокращенного имени месяца.

  • %C - заменяется на (год / 100) в виде десятичного числа; однозначные числа предваряются нулем.

  • %c - заменяется на национальное представление времени и даты.

  • %D - эквивалентно %m/%d/%y.

  • %d - заменяется на день месяца в виде десятичного числа (01–31).

  • %E* %O* - расширения POSIX локали. Последовательности %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy предполагают предоставление альтернативных представлений.

    Дополнительно %OB реализован для представления альтернативных названий месяцев (используется отдельно, без указания дня).

  • %e - заменяется на день месяца в виде десятичного числа (1–31); перед однозначными числами идет пробел.

  • %F - эквивалентно %Y-%m-%d.

  • %G - заменяется годом в десятичном формате с веком. Этот год является тем, который содержит большую часть недели (понедельник как первый день недели).

  • %g - заменяется тем же годом, что и в %G, но в виде десятичного числа без столетия (00–99).

  • %H - заменяется на час (24-часовой формат) в виде десятичного числа (00–23).

  • %h - то же самое, что и %b.

  • %I - заменяется на час (12-часовой формат) в виде десятичного числа (01–12).

  • %j - заменяется на день года в виде десятичного числа (001–366).

  • %k - заменяется на час (24-часовой формат) в виде десятичного числа (0-23); перед однозначными числами идет пробел.

  • %l - заменяется на час (12-часовой формат) в виде десятичного числа (1-12); перед однозначными числами идет пробел.

  • %M - заменяется минутой в виде десятичного числа (00–59).

  • %m - заменяется на месяц в виде десятичного числа (01–12).

  • %n - заменяется на новую строку.

  • %O* - то же самое, что и %E*.

  • %p - заменяется на национальное представление либо до полудня, либо после полудня, в зависимости от контекста.

  • %R - эквивалентно %H:%M.

  • %r - эквивалентно %I:%M:%S %p.

  • %S - заменяется вторым числом в десятичной форме (00–60).

  • %s - заменяется на количество секунд с начала эпохи, по времени UTC.

  • %T - эквивалентно %H:%M:%S

  • %t - заменяется на табуляцию.

  • %U - заменяется номером недели года (воскресенье в качестве первого дня недели) в десятичном формате (00–53).

  • %u - заменяется на день недели (понедельник как первый день недели) в виде десятичного числа (1-7).

  • %V - заменяется номером недели года (понедельник - первый день недели) в виде десятичного числа (01-53). Если неделя, содержащая 1 января, имеет четыре или более дня в новом году, то это неделя 1; в противном случае это последняя неделя предыдущего года, и следующая неделя будет неделей 1.

  • %v - эквивалентно %e-%b-%Y.

  • %W - заменяется номером недели года (понедельник - первый день недели) в виде десятичного числа (00-53).

  • %w - заменяется на день недели (воскресенье как первый день недели) в виде десятичного числа (0-6).

  • %X - заменяется на национальное представление времени.

  • %x - заменяется на национальное представление даты.

  • %Y - заменяется на год с веком в виде десятичного числа.

  • %y - заменяется годом без столетия в виде десятичного числа (00–99).

  • %Z - заменяется именем часового пояса.

  • %z - заменяется смещением часового пояса от UTC; ведущий знак плюс обозначает восток от UTC, минус - запад от UTC, часы и минуты следуют двумя цифрами каждая и без разделителя между ними (общая форма для RFC 822 заголовков дат).

  • %+ - заменяется на национальное представление даты и времени.

  • %-* - расширение GNU libc. При выполнении числовых выводов не выполнять никакого выравнивания.

  • $_* - расширение GNU libc. Явно указывает пространство для заполнения.

  • %0* - расширение GNU libc. Явно указывает ноль для заполнения.

  • %% - заменяется на %.

PGTYPEStimestamp_sub #

Вычтите одну метку времени из другой и сохраните результат в переменной типа интервал.

int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);

Функция вычтет значение переменной типа timestamp, на которую указывает ts2, из значения переменной типа timestamp, на которую указывает ts1, и сохранит результат в переменной типа interval, на которую указывает iv.

При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.

PGTYPEStimestamp_defmt_asc #

Разбор значения временной метки из его текстового представления с использованием маски форматирования.

int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d);

Функция получает текстовое представление временной метки в переменной str, а также маску форматирования, которую нужно использовать в переменной fmt. Результат будет сохранен в переменной, на которую указывает d.

Если маска форматирования fmt равна NULL, функция будет использовать маску форматирования по умолчанию, которая равна %Y-%m-%d %H:%M:%S.

Это функция обратная функции PGTYPEStimestamp_fmt_asc. См. документацию там, чтобы узнать о возможных записях маски форматирования.

PGTYPEStimestamp_add_interval #

Добавить переменную интервала к переменной временной метки.

int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);

Функция получает указатель на переменную типа timestamp tin и указатель на переменную типа interval span. Она добавляет интервал к метке времени и сохраняет полученную метку времени в переменной, на которую указывает tout.

При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.

PGTYPEStimestamp_sub_interval #

Вычтите интервальную переменную из переменной типа timestamp.

int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);

Функция вычитает интервальную переменную, на которую указывает span, из временной переменной, на которую указывает tin, и сохраняет результат в переменную, на которую указывает tout.

При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.

33.6.5. Тип интервалов #

Тип интервала в C позволяет вашим программам работать с данными типа интервал в SQL. См. Раздел 8.5 для эквивалентного типа в сервере Tantor BE.

Следующие функции могут быть использованы для работы с типом интервал:

PGTYPESinterval_new #

Вернуть указатель на вновь выделенную переменную интервала.

interval *PGTYPESinterval_new(void);

PGTYPESinterval_free #

Освободить память ранее выделенной переменной интервала.

void PGTYPESinterval_free(interval *intvl);

PGTYPESinterval_from_asc #

Разбор интервала из его текстового представления.

interval *PGTYPESinterval_from_asc(char *str, char **endptr);

Функция разбирает входную строку str и возвращает указатель на выделенную переменную интервала. В настоящее время ECPG всегда разбирает полную строку, поэтому в настоящее время не поддерживается возможность сохранения адреса первого недопустимого символа в *endptr. Вы можете безопасно установить endptr в NULL.

PGTYPESinterval_to_asc #

Преобразование переменной типа интервал в ее текстовое представление.

char *PGTYPESinterval_to_asc(interval *span);

Функция преобразует переменную интервала, на которую указывает span, в C char*. Результат выглядит таким образом: @ 1 day 12 hours 59 mins 10 secs. Результат должен быть освобожден с помощью PGTYPESchar_free().

PGTYPESinterval_copy #

Скопировать переменную типа интервал.

int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);

Функция копирует переменную интервала, на которую указывает intvlsrc, в переменную, на которую указывает intvldest. Обратите внимание, что перед этим необходимо выделить память для переменной назначения.

33.6.6. Тип decimal #

Тип decimal похож на тип numeric. Однако он ограничен максимальной точностью в 30 значащих цифр. В отличие от типа numeric, который может быть создан только на куче, тип decimal может быть создан как на стеке, так и на куче (с помощью функций PGTYPESdecimal_new и PGTYPESdecimal_free). В режиме совместимости с Informix описано множество других функций, работающих с типом decimal, см. Раздел 33.15.

Следующие функции могут использоваться для работы с десятичным типом и не содержатся только в библиотеке libcompat.

PGTYPESdecimal_new #

Запросите указатель на вновь выделенную десятичную переменную.

decimal *PGTYPESdecimal_new(void);

PGTYPESdecimal_free #

Освободить десятичный тип, освободить всю его память.

void PGTYPESdecimal_free(decimal *var);

33.6.7. Значения errno в pgtypeslib #

PGTYPES_NUM_BAD_NUMERIC #

Аргумент должен содержать числовую переменную (или указывать на числовую переменную), но на самом деле его внутреннее представление в памяти было недействительным.

PGTYPES_NUM_OVERFLOW #

Произошло переполнение. Поскольку числовой тип может работать с практически произвольной точностью, преобразование числовой переменной в другие типы может вызвать переполнение.

PGTYPES_NUM_UNDERFLOW #

Произошла потеря значимости. Поскольку числовой тип может работать с практически произвольной точностью, преобразование числовой переменной в другие типы может вызвать потерю значимости.

PGTYPES_NUM_DIVIDE_ZERO #

Попытка деления на ноль.

PGTYPES_DATE_BAD_DATE #

Была передана недопустимая строка даты в функцию PGTYPESdate_from_asc.

PGTYPES_DATE_ERR_EARGS #

Были переданы неверные аргументы в функцию PGTYPESdate_defmt_asc.

PGTYPES_DATE_ERR_ENOSHORTDATE #

Неверный компонент во входной строке был обнаружен функцией PGTYPESdate_defmt_asc.

PGTYPES_INTVL_BAD_INTERVAL #

Была передана недопустимая строка интервала в функцию PGTYPESinterval_from_asc, или было передано недопустимое значение интервала в функцию PGTYPESinterval_to_asc.

PGTYPES_DATE_ERR_ENOTDMY #

В функции PGTYPESdate_defmt_asc произошло несоответствие в присвоении дня/месяца/года.

PGTYPES_DATE_BAD_DAY #

Было обнаружено недопустимое значение дня месяца функцией PGTYPESdate_defmt_asc.

PGTYPES_DATE_BAD_MONTH #

Было обнаружено недопустимое значение месяца функцией PGTYPESdate_defmt_asc.

PGTYPES_TS_BAD_TIMESTAMP #

Передана недопустимая строка временной метки в функцию PGTYPEStimestamp_from_asc, или передано недопустимое значение временной метки в функцию PGTYPEStimestamp_to_asc.

PGTYPES_TS_ERR_EINFTIME #

В контексте, который не может справиться с бесконечным значением временной метки, было обнаружено бесконечное значение временной метки.

33.6.8. Специальные константы pgtypeslib #

PGTYPESInvalidTimestamp #

Значение типа timestamp, представляющее недопустимую метку времени. Это возвращается функцией PGTYPEStimestamp_from_asc при ошибке разбора. Обратите внимание, что из-за внутреннего представления типа данных timestamp, PGTYPESInvalidTimestamp также является допустимой меткой времени одновременно. Она установлена в значение 1899-12-31 23:59:59. Чтобы обнаружить ошибки, убедитесь, что ваше приложение проверяет не только наличие PGTYPESInvalidTimestamp, но и errno != 0 после каждого вызова функции PGTYPEStimestamp_from_asc.