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, 1999
January 8, 1999
1999-01-08
January 8, 1999
1/8/1999
January 8, 1999
1/18/1999
January 18, 1999
01/02/03
1 февраля 2003 года
1999-Jan-08
8 января 1999
08-янв-1999
8 января 1999
08-Янв-1999
8 Января, 1999
99-Jan-08
January 8, 1999
08-Jan-99
8 января 1999
08-Янв-06
8 января 2006
Jan-08-99
January 8, 1999
19990108
ISO 8601; January 8, 1999
990108
ISO 8601; January 8, 1999
1999.008
year and day of year
J2451187
Julian 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
Формат Результат mmddyy
112359
ddmmyy
231159
yymmdd
591123
yy/mm/dd
59/11/23
yy mm dd
59 11 23
yy.mm.dd
59.11.23
.мм.гггг.дд.
.11.1959.23.
mmm. dd, yyyy
Nov. 23, 1959
mmm dd yyyy
Nov 23 1959
yyyy dd mm
1959 23 11
ddd, mmm. dd, yyyy
Mon, 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
Формат Строка Результат ddmmyy
21-2-54
1954-02-21
ddmmyy
2-12-54
1954-12-02
ddmmyy
20111954
1954-11-20
ddmmyy
130464
1964-04-13
mmm.dd.yyyy
MAR-12-1967
1967-03-12
yy/mm/dd
1954, February 3rd
1954-02-03
mmm.dd.yyyy
041269
1969-04-12
yy/mm/dd
In the year 2525, in the month of July, mankind will be alive on the 28th day
2525-07-28
dd-mm-yy
I said on the 28th of July in the year 2525
2525-07-28
mmm.dd.yyyy
9/14/58
1958-09-14
yy/mm/dd
47/03/29
1947-03-29
mmm.dd.yyyy
oct 28 1975
1975-10-28
mmddyy
Nov 14th, 1985
1985-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:06
1999-01-08 04:05:06
January 8 04:05:06 1999 PST
1999-01-08 04:05:06
1999-Jan-08 04:05:06.789-8
1999-01-08 04:05:06.789 (time zone specifier ignored)
J2451187 04:05-08:00
1999-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, а при возникновении ошибки - отрицательное значение.
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
.
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
.