34.6. Библиотека pgtypes#
34.6. Библиотека pgtypes
Библиотека pgtypes отображает типы базы данных Tantor SEна эквиваленты на языке C, которые могут быть использованы в программах на языке C. Она также предлагает функции для выполнения базовых вычислений с этими типами на языке C, то есть без помощи сервера Tantor SE. См. следующий пример:
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);
34.6.1. Символьные строки
Некоторые функции, такие как PGTYPESnumeric_to_asc, возвращают указатель на свеже выделенную строку символов. Эти результаты следует освобождать с помощью функции PGTYPESchar_free, а не free. (Это важно только в Windows, где выделение и освобождение памяти иногда должны выполняться одной и той же библиотекой).
34.6.2. Тип данных numeric
Тип numeric предлагает выполнение вычислений с произвольной точностью. См. Раздел 8.1 для эквивалентного типа в сервере Tantor SE. Из-за произвольной точности этой переменной она должна иметь возможность динамического расширения и сжатия. Поэтому вы можете создавать числовые переменные только в куче, с помощью функций 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меньше, чемvar20, если
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, переполнение при этом преобразовании невозможно.
34.6.3. Тип данных date
Тип данных date в C позволяет вашим программам работать с данными типа SQL date. См. Раздел 8.5 для эквивалентного типа в сервере Tantor SE.
Следующие функции могут быть использованы для работы с типом данных дата:
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.
Таблица 34.2 показывает допустимые форматы ввода.
Таблица 34.2. Допустимые форматы ввода для
PGTYPESdate_from_ascВвод Результат January 8, 1999January 8, 19991999-01-08January 8, 19991/8/1999January 8, 19991/18/1999January 18, 199901/02/031 февраля 2003 года1999-Jan-088 января 199908-янв-19998 января 199908-Янв-19998 Января, 199999-Jan-08January 8, 199908-Jan-998 января 199908-Янв-068 января 2006Jan-08-99January 8, 199919990108ISO 8601; January 8, 1999990108ISO 8601; January 8, 19991999.008year and day of yearJ2451187Julian day8 января 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 в выходную строку.
Таблица 34.3 указывает на несколько возможных форматов. Это даст вам представление о том, как использовать эту функцию. Все строки вывода основаны на одной и той же дате: 23 ноября 1959 года.
Таблица 34.3. Допустимые форматы ввода для
PGTYPESdate_fmt_ascФормат Результат mmddyy112359ddmmyy231159yymmdd591123yy/mm/dd59/11/23yy mm dd59 11 23yy.mm.dd59.11.23.мм.гггг.дд..11.1959.23.mmm. dd, yyyyNov. 23, 1959mmm dd yyyyNov 23 1959yyyy dd mm1959 23 11ddd, mmm. dd, yyyyMon, Nov. 23, 1959(ddd) mmm. dd, yyyy(Mon) Nov. 23, 1959PGTYPESdate_defmt_ascИспользуйте маску формата для преобразования строки C
char*в значение типа date.int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
Функция получает указатель на значение даты, которое должно содержать результат операции (
d), маску формата для разбора даты (fmt) и строку C char*, содержащую текстовое представление даты (str). Ожидается, что текстовое представление будет соответствовать маске формата. Однако не требуется точное соответствие строки маске формата. Функция анализирует только последовательный порядок и ищет литералыyyилиyyyy, указывающие на позицию года,mmдля указания позиции месяца иddдля указания позиции дня.Таблица 34.4 указывает на несколько возможных форматов. Это даст вам представление о том, как использовать эту функцию.
Таблица 34.4. Допустимые форматы ввода для
rdefmtdateФормат Строка Результат ddmmyy21-2-541954-02-21ddmmyy2-12-541954-12-02ddmmyy201119541954-11-20ddmmyy1304641964-04-13mmm.dd.yyyyMAR-12-19671967-03-12yy/mm/dd1954, February 3rd1954-02-03mmm.dd.yyyy0412691969-04-12yy/mm/ddIn the year 2525, in the month of July, mankind will be alive on the 28th day2525-07-28dd-mm-yyI said on the 28th of July in the year 25252525-07-28mmm.dd.yyyy9/14/581958-09-14yy/mm/dd47/03/291947-03-29mmm.dd.yyyyoct 28 19751975-10-28mmddyyNov 14th, 19851985-11-14
34.6.4. Тип timestamp
Тип timestamp в C позволяет вашим программам работать с данными типа timestamp в SQL. См. Раздел 8.5 для эквивалентного типа в сервере Tantor SE.
Следующие функции могут быть использованы для работы с типом 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 SE, например. Спецификаторы часовых поясов молча отбрасываются.
Таблица 34.5 содержит несколько примеров для входных строк.
Таблица 34.5. Допустимые форматы ввода для
PGTYPEStimestamp_from_ascВвод Результат 1999-01-08 04:05:061999-01-08 04:05:06January 8 04:05:06 1999 PST1999-01-08 04:05:061999-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и указатель на переменную типа intervalspan. Она добавляет интервал к метке времени и сохраняет полученную метку времени в переменной, на которую указываетtout.При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
PGTYPEStimestamp_sub_intervalВычтите интервальную переменную из переменной типа timestamp.
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
Функция вычитает интервальную переменную, на которую указывает
span, из временной переменной, на которую указываетtin, и сохраняет результат в переменную, на которую указываетtout.При успешном выполнении функция возвращает 0, а при возникновении ошибки - отрицательное значение.
34.6.5. Тип интервалов
Тип интервала в C позволяет вашим программам работать с данными типа интервал в SQL. См. Раздел 8.5 для эквивалентного типа в сервере Tantor SE.
Следующие функции могут быть использованы для работы с типом интервал:
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. Обратите внимание, что перед этим необходимо выделить память для переменной назначения.
34.6.6. Тип decimal
Тип decimal похож на тип numeric. Однако он ограничен максимальной точностью в 30 значащих цифр. В отличие от типа numeric, который может быть создан только на куче, тип decimal может быть создан как на стеке, так и на куче (с помощью функций PGTYPESdecimal_new и PGTYPESdecimal_free). В режиме совместимости с Informix описано множество других функций, работающих с типом decimal, см. Раздел 34.15.
Следующие функции могут использоваться для работы с десятичным типом и не содержатся только в библиотеке libcompat.
PGTYPESdecimal_newЗапросите указатель на вновь выделенную десятичную переменную.
decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_freeОсвободить десятичный тип, освободить всю его память.
void PGTYPESdecimal_free(decimal *var);
34.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В контексте, который не может справиться с бесконечным значением временной метки, было обнаружено бесконечное значение временной метки.
34.6.8. Специальные константы pgtypeslib
PGTYPESInvalidTimestampЗначение типа timestamp, представляющее недопустимую метку времени. Это возвращается функцией
PGTYPEStimestamp_from_ascпри ошибке разбора. Обратите внимание, что из-за внутреннего представления типа данныхtimestamp,PGTYPESInvalidTimestampтакже является допустимой меткой времени одновременно. Она установлена в значение1899-12-31 23:59:59. Чтобы обнаружить ошибки, убедитесь, что ваше приложение проверяет не только наличиеPGTYPESInvalidTimestamp, но иerrno != 0после каждого вызова функцииPGTYPEStimestamp_from_asc.