Библиотека pgtypes сопоставляет Digital Q.DataBase типы данных базы данных с эквивалентами языка C, которые могут использоваться в программах на языке C. Она также предоставляет функции для выполнения базовых вычислений с этими типами данных непосредственно в коде на языке C, т. е. без помощи Digital Q.DataBase сервер. См. следующий пример:
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);
Некоторые функции, такие как PGTYPESnumeric_to_asc возвращают указатель на только что выделенную символьную строку. Эти результаты должны быть
освобождены с помощью функции PGTYPESchar_free вместо функции
free. (Это важно только для ОС Windows, где выделение и освобождение памяти иногда должны выполняться одной и той же библиотекой.)
Тип numeric позволяет выполнять вычисления с произвольной точностью. См.
Раздел 2.5.1 для эквивалентного типа в
Digital Q.DataBase сервер. В связи с произвольной точностью данная переменная должна иметь возможность динамически расширяться и уменьшаться в размере. По этой причине создавать переменные типа numeric можно только в куче с помощью
PGTYPESnumeric_new и PGTYPESnumeric_free
функций. Тип данных decimal, который аналогичен предыдущему, но обладает ограниченной точностью, может быть создан как в стеке, так и в куче.
Для работы с типом numeric могут использоваться следующие функции:
PGTYPESnumeric_new #Запросить указатель на вновь выделенную переменную типа numeric.
numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free #Освободить переменную типа numeric и высвободить всю занимаемую ей память.
void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc #Выполнить синтаксический разбор типа numeric из его строкового представления.
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 , которая содержит строковое
представление значения типа numeric num.
char *PGTYPESnumeric_to_asc(numeric *num, int dscale);
Значение типа numeric будет выведено с количеством десятичных знаков dscale тип данных decimal
цифр, с применением округления при необходимости.
Результат должен быть освобожден с помощью функции PGTYPESchar_free().
PGTYPESnumeric_add #Сложение двух переменных типа numeric и сохранение результата в третью.
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
Функция складывает значения переменных var1 и
var2 в результирующую переменную
result.
Функция возвращает 0 при успешном выполнении и -1 в случае ошибки.
PGTYPESnumeric_sub #Вычитание одной переменной типа numeric из другой с возвратом результата в третью переменную.
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
Функция вычитает значение переменной var2 из
значения переменной var1. Результатом операции является
сохраняется в переменной result.
Функция возвращает 0 при успешном выполнении и -1 в случае ошибки.
PGTYPESnumeric_mul #Умножает две переменные типа numeric и возвращает результат в третьей переменной.
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
Данная функция перемножает значения переменных var1 и
var2. Результат операции сохраняется в переменной
переменная result.
Функция возвращает 0 при успешном выполнении и -1 в случае ошибки.
PGTYPESnumeric_div #Делит две переменные типа numeric и возвращает результат в третьей переменной.
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
Данная функция делит значение переменной var1 на
var2. Результат операции сохраняется в переменной
переменная result.
Функция возвращает 0 при успешном выполнении и -1 в случае ошибки.
PGTYPESnumeric_cmp #Сравнивает две переменные типа numeric.
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
Данная функция сравнивает две переменные типа numeric. В случае ошибки
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 и сохраняет её значение
в переменную типа numeric var. При успешном выполнении возвращается 0, а
-1 — в случае ошибки.
PGTYPESnumeric_from_long #Преобразование переменной типа long int в переменную типа numeric.
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
Эта функция принимает переменную типа signed long int и сохраняет её значение
в переменную типа numeric var. При успешном выполнении возвращается 0, а
-1 — в случае ошибки.
PGTYPESnumeric_copy #Копирование одной переменной типа numeric в другую.
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
Эта функция копирует значение переменной
src указывает на переменную, в которую dst
указывает. Функция возвращает 0 в случае успеха и -1 при возникновении ошибки.
PGTYPESnumeric_from_double #Преобразование переменной типа данных double в тип numeric.
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)
Функция преобразует значение типа numeric из переменной, на которую
nv указывает, в переменную типа данных double, на которую dp указывает
параметр. Функция возвращает 0 в случае успеха и -1 при возникновении ошибки, включая
переполнение. При переполнении глобальная переменная errno принимает значение
в PGTYPES_NUM_OVERFLOW дополнительно.
PGTYPESnumeric_to_int #Преобразование переменной типа тип numeric в тип int.
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
Функция преобразует значение типа numeric из переменной, на которую
nv указывает, в целочисленную переменную, на которую указывает параметр ip
. Функция возвращает 0 в случае успеха и -1 при возникновении ошибки, включая
переполнение. При переполнении глобальная переменная errno принимает значение
в PGTYPES_NUM_OVERFLOW дополнительно.
PGTYPESnumeric_to_long #Преобразование переменной типа тип numeric в тип long.
int PGTYPESnumeric_to_long(numeric *nv, long *lp);
Функция преобразует значение типа numeric из переменной, на которую
nv указывает, в переменную типа long integer, на которую указывает параметр
lp . Функция возвращает 0 в случае успеха и -1 при возникновении ошибки,
включая переполнение и потерю значимости. При переполнении глобальная переменная
errno будет установлено в PGTYPES_NUM_OVERFLOW
и при потере значимости errno будет установлено в
PGTYPES_NUM_UNDERFLOW.
PGTYPESnumeric_to_decimal #Преобразование переменной типа numeric в тип данных decimal.
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
Функция преобразует значение типа numeric из переменной, на которую
src указывает на переменную типа данных decimal, в которую
dst . Функция возвращает 0 в случае успеха и -1 при возникновении ошибки,
происходит, включая переполнение. При переполнении глобальная переменная
errno будет установлено в PGTYPES_NUM_OVERFLOW
дополнительно.
PGTYPESnumeric_from_decimal #Преобразование переменной типа данных decimal в тип numeric.
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);
Данная функция преобразует значение типа данных decimal из переменной, на которую
src указывает указатель, в переменную типа numeric, на которую
dst . Функция возвращает 0 в случае успеха и -1 при возникновении ошибки,
происходит. Поскольку тип данных decimal реализован как ограниченная версия
типа numeric, переполнение при данном преобразовании невозможно.
Тип данных date в языке C позволяет программам обрабатывать данные SQL-типа date. См. Раздел 2.5.5 для эквивалентного типа в Digital Q.DataBase сервер.
Для работы с типом данных date могут использоваться следующие функции:
PGTYPESdate_from_timestamp #Извлечение даты из значения типа timestamp.
date PGTYPESdate_from_timestamp(timestamp dt);
Функция принимает значение timestamp в качестве единственного аргумента и возвращает извлеченную дату из этого значения.
PGTYPESdate_from_asc #Разбор даты из ее текстового представления.
date PGTYPESdate_from_asc(char *str, char **endptr);
Функция принимает строку (тип char* в языке C) str и указатель на
строку (тип char* в языке C) endptr. В настоящий момент препроцессор ECPG всегда выполняет разбор
всей строки целиком, поэтому сейчас он не поддерживает сохранение
адреса первого недопустимого символа в *endptr.
Вы можете безопасно установить параметр endptr в значение NULL.
Обратите внимание, что функция всегда предполагает использование формата даты MDY, и в настоящее время в препроцессоре ECPG нет переменной для изменения этой настройки.
Таблица 4.3.2 показывает допустимые форматы ввода.
Таблица 4.3.2. Допустимые форматы ввода для PGTYPESdate_from_asc
| Входные данные | Результат |
|---|---|
8 января 1999 г. | 8 января 1999 г. |
1999-01-08 | 8 января 1999 г. |
1/8/1999 | 8 января 1999 г. |
1/18/1999 | 18 января 1999 г. |
01/02/03 | 1 февраля 2003 г. |
1999-Jan-08 | 8 января 1999 г. |
Jan-08-1999 | 8 января 1999 г. |
08-Jan-1999 | 8 января 1999 г. |
99-Jan-08 | 8 января 1999 г. |
08-Jan-99 | 8 января 1999 г. |
08-Jan-06 | 8 января 2006 г. |
Jan-08-99 | 8 января 1999 г. |
19990108 | ISO 8601; 8 января 1999 г. |
990108 | ISO 8601; 8 января 1999 г. |
1999.008 | год и день года |
J2451187 | Юлианская дата |
8 января 99 г. до н. э. | 99 год до нашей эры |
PGTYPESdate_to_asc #Возврат текстового представления переменной типа date.
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 и указатель на массив
из трех целочисленных значений 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);
Функция принимает переменную типа date d в качестве единственного
аргумента и возвращает целое число, обозначающее день недели для
этой даты.
0 — воскресенье
1 — понедельник
2 — вторник
3 — среда
4 — четверг
5 — пятница
6 — суббота
PGTYPESdate_today #Получение текущей даты.
void PGTYPESdate_today(date *d);
Функция PGTYPESdate_today принимает указатель на переменную типа date (d)
которую она устанавливает равной текущей дате.
PGTYPESdate_fmt_asc #Преобразование переменной типа date в её текстовое представление с использованием маска формата.
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
Функция принимает дату для преобразования (dDate), the
маску формата (fmtstring) и строку, которая будет содержать
текстовое представление даты (outbuf).
При успешном завершении возвращается 0, при возникновении ошибки — отрицательное значение.
Для спецификации полей можно использовать следующие литералы:
dd — порядковый номер дня в месяце.
mm — порядковый номер месяца в году.
yy — номер года в виде двузначного числа.
yyyy - Год в виде четырехзначного числа.
ddd - Сокращенное название дня недели.
mmm - Сокращенное название месяца.
Все остальные символы копируются в выходную строку без изменений (1:1).
Таблица 4.3.3 указывает несколько возможных форматов. Это даст представление о том, как использовать данную функцию. Все выходные строки сформированы на основе одной и той же даты: 23 ноября 1959 года.
Таблица 4.3.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 |
.mm.yyyy.dd. | .11.1959.23. |
ммм. дд, гггг | Ноя. 23, 1959 |
ммм дд гггг | Ноя 23 1959 |
гггг дд мм | 1959 23 11 |
ддд, ммм. дд, гггг | Пнд, Ноя. 23, 1959 |
(ддд) ммм. дд, гггг | (Пнд) Ноя. 23, 1959 |
PGTYPESdate_defmt_asc #
Используйте маску формата для преобразования строки C char* в значение типа данных
date.
int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
Функция принимает указатель на значение даты, которое должно содержать
результат операции (d), маску формата, используемую для
разбора даты (fmt) и строку типа char* в языке C, содержащую
текстовое представление даты (str). Текстовое
представление должно соответствовать маске формата. При этом нет
необходимости в строгом соответствии 1:1 строки и маски формата. Данная
функция анализирует только последовательность и ищет литералы,
yy или yyyy которые определяют
позицию года, mm для указания позиции
месяца и dd для указания позиции
дня.
Таблица 4.3.4 указывает несколько возможных форматов. Это даст вам представление о том, как использовать данную функцию.
Таблица 4.3.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 | 3 февраля 1954 г. | 1954-02-03 |
mmm.dd.yyyy | 041269 | 1969-04-12 |
yy/mm/dd | В 2525 году, в июле месяце, человечество будет живо в 28-й день | 2525-07-28 |
дд-мм-гг | Я сказал 28 июля 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 | 28 окт 1975 | 1975-10-28 |
mmddyy | 14 ноя 1985 | 1985-11-14 |
Тип данных timestamp в языке C позволяет программам обрабатывать данные SQL-типа timestamp. См. Раздел 2.5.5 для получения информации об эквивалентном типе в Digital Q.DataBase сервер.
Для работы с типом данных timestamp могут использоваться следующие функции:
PGTYPEStimestamp_from_asc #Выполняет синтаксический анализ метки времени из её текстового представления в переменную типа timestamp.
timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);
Функция принимает строку для анализа (str) и
указатель на тип char* в языке C (endptr).
В настоящий момент препроцессор ECPG всегда выполняет разбор
всей строки целиком, поэтому сейчас он не поддерживает сохранение
адреса первого недопустимого символа в *endptr.
Вы можете безопасно установить параметр endptr в значение NULL.
В случае успешного выполнения функция возвращает полученную метку времени. В случае ошибки возвращается
PGTYPESInvalidTimestamp возвращается, а параметр errno принимает значение
устанавливается в PGTYPES_TS_BAD_TIMESTAMP. См. раздел PGTYPESInvalidTimestamp для ознакомления с важными примечаниями по данному значению.
В общем случае входная строка может содержать любую комбинацию допустимой спецификации даты, пробельного символа и допустимой спецификации времени. Обратите внимание, что препроцессор ECPG не поддерживает часовые пояса. Он может выполнять их синтаксический анализ, но не производит никаких вычислений, которые, Digital Q.DataBase например, выполняет сервер. Спецификаторы часовых поясов игнорируются без вывода предупреждений.
Таблица 4.3.5 содержит несколько примеров входных строк.
Таблица 4.3.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 (спецификатор часового пояса проигнорирован) |
J2451187 04:05-08:00 | 1999-01-08 04:05:00 (спецификатор часового пояса проигнорирован) |
PGTYPEStimestamp_to_asc #Преобразует дату в строку типа char* в языке C.
char *PGTYPEStimestamp_to_asc(timestamp tstamp);
Функция принимает временную метку tstamp в качестве
единственного аргумента и возвращает выделенную строку, содержащую
текстовое представление временной метки.
Результат должен быть освобожден с помощью функции PGTYPESchar_free().
PGTYPEStimestamp_current #Получение текущей временной метки.
void PGTYPEStimestamp_current(timestamp *ts);
Функция считывает текущую временную метку и сохраняет её в
переменную типа timestamp, на которую ts указывает.
PGTYPEStimestamp_fmt_asc #Преобразование переменной типа timestamp в строку типа char* в языке C с использованием маски формата.
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
Функция принимает указатель на преобразуемую временную метку в качестве
первого аргумента (ts), указатель на выходной буфер
(вывод), максимальная длина, выделенная для
выходного буфера (str_len) и маска формата для
использования при преобразовании (fmtstr).
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
Для маски формата можно использовать следующие спецификаторы формата. Эти
спецификаторы формата идентичны тем, что используются в
strftime функции из libc. Любой
символ, не являющийся спецификатором формата, будет скопирован в выходной буфер.
%A — заменяется национальным представлением
полного названия дня недели.
%a — заменяется национальным представлением
сокращенное название дня недели.
%B — заменяется национальным представлением
полное название месяца.
%b — заменяется национальным представлением
сокращенное название месяца.
%C — заменяется значением (year / 100) как
число типа данных decimal; перед однозначными числами ставится ведущий ноль.
%c — заменяется национальным представлением
время и дата.
%D — эквивалентно строке
%m/%d/%y.
%d — заменяется на номер дня месяца как
число типа данных decimal (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 — заменяется днем месяца в виде значения типа данных decimal
числом (1–31); однозначные числа предваряются пробелом.
%F — эквивалентно %Y-%m-%d.
%G — заменяется на год, представленный как тип данных decimal
с веком. Этот год — тот год, который содержит большую часть
недели (понедельник считается первым днем недели).
%g — заменяется на тот же год, что и в параметре
%G, но представленный как тип данных decimal без указания века
(00–99).
%H — заменяется на час (в 24-часовом формате), представленный как
тип данных decimal (00–23).
%h — то же самое, что и параметр %b.
%I — заменяется на час (в 12-часовом формате), представленный как
тип данных decimal (01–12).
%j — заменяется на порядковый день года, представленный как
число в формате decimal (001–366).
%k — заменяется на час (в 24-часовом формате), представленный как
число в формате decimal (0–23); однозначные числа предваряются пробелом.
%l — заменяется на час (в 12-часовом формате), представленный как
число в формате decimal (1–12); однозначные числа предваряются пробелом.
%M — заменяется на значение минут в виде числа
(00–59) типа данных decimal.
%m — заменяется на значение месяца в виде числа
(01–12) типа данных decimal.
%n — заменяется на символ новой строки.
%O* — то же самое, что и параметр %E*.
%p — заменяется национальным представлением
либо «ante meridiem» или «post meridiem» соответствующим образом.
%R — эквивалентно %H:%M.
%r — эквивалентно %I:%M:%S
%p.
%S — заменяется секундами в виде десятичного числа
number (00–60).
%s — заменяется количеством секунд, прошедших с
начала эпохи (Epoch), 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 #Вычитает одно значение timestamp из другого и сохраняет результат в переменную типа данных interval.
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 #Прибавляет значение переменной типа данных interval к переменной метки времени.
int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
Функция получает указатель на переменную метки времени tin
и указатель на переменную типа данных interval span. Она добавляет значение
типа данных interval к значению типа timestamp и сохраняет полученный результат в
переменную, на которую указывает параметр tout указывает.
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
PGTYPEStimestamp_sub_interval #Вычитание значения переменной типа данных interval из значения переменной типа timestamp.
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
Данная функция вычитает значение переменной типа данных interval, на которую указывает параметр span
указывает параметр, из значения переменной типа timestamp, на которую tin указывает параметр,
и сохраняет результат в переменную, на которую указывает параметр tout указывает
указывает параметр.
В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.
Тип данных interval в языке C позволяет программам обрабатывать данные SQL-типа interval. См. Раздел 2.5.5 для получения информации об эквивалентном типе в Digital Q.DataBase сервер.
Для работы с типом данных interval можно использовать следующие функции:
PGTYPESinterval_new #Возвращает указатель на новую выделенную переменную типа данных interval.
interval *PGTYPESinterval_new(void);
PGTYPESinterval_free #Освобождает память, ранее выделенную для переменной типа данных interval.
void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc #Выполняет разбор значения типа данных interval из его текстового представления.
interval *PGTYPESinterval_from_asc(char *str, char **endptr);
Функция анализирует входную строку str и возвращает
указатель на выделенную переменную типа данных interval.
В настоящий момент препроцессор ECPG всегда выполняет разбор
всей строки целиком, поэтому сейчас он не поддерживает сохранение
адреса первого недопустимого символа в *endptr.
Вы можете безопасно установить параметр endptr в значение NULL.
PGTYPESinterval_to_asc #Преобразует переменную типа данных interval в её текстовое представление.
char *PGTYPESinterval_to_asc(interval *span);
Функция преобразует переменную типа данных interval, на которую span
указывает параметр, в тип char* в языке C. Выходные данные выглядят как в этом примере:
@ 1 day 12 hours 59 mins 10 secs.
Результат должен быть освобожден с помощью функции PGTYPESchar_free().
PGTYPESinterval_copy #Копирует переменную типа данных interval.
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
Функция копирует переменную типа данных interval, на которую intvlsrc
указывает, в переменную, на которую intvldest указывает. Примечание
что необходимо выделить память для целевой переменной
заранее.
Тип данных decimal аналогичен типу numeric. Однако его максимальная точность ограничена 30 значащими цифрами. В отличие от типа numeric, который может быть создан только в куче, тип данных decimal может быть создан как в стеке, так и в куче (с помощью функций
PGTYPESdecimal_new и
PGTYPESdecimal_free).
Существует множество других функций для работы с типом данных decimal в режиме совместимости с
Informix , описанном в Раздел 4.3.15.
Следующие функции могут использоваться для работы с типом данных decimal и
входят в состав не только библиотеки libcompat library.
PGTYPES_NUM_BAD_NUMERIC #Аргумент должен содержать переменную типа numeric (или указывать на переменную типа numeric), но её фактическое представление в памяти оказалось недопустимым.
PGTYPES_NUM_OVERFLOW #Произошло переполнение. Поскольку тип numeric позволяет работать с практически произвольной точностью, преобразование переменной типа numeric в другие типы может привести к переполнению.
PGTYPES_NUM_UNDERFLOW #Произошло антипереполнение. Поскольку тип numeric позволяет работать с практически произвольной точностью, преобразование переменной типа numeric в другие типы может привести к антипереполнению.
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 #
В функцию была передана недопустимая строка типа данных interval, либо
PGTYPESinterval_from_asc в функцию было передано
недопустимое значение типа данных interval.
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 #Обнаружено бесконечное значение метки времени в контексте, который не может его обработать.
PGTYPESInvalidTimestamp #
Значение типа timestamp, представляющее недопустимую метку времени. Оно
возвращается функцией PGTYPEStimestamp_from_asc при
ошибке разбора.
Обратите внимание, что из-за внутреннего представления timestamp типа данных,
PGTYPESInvalidTimestamp также является допустимой меткой времени
в то же время. Оно установлено в 1899-12-31 23:59:59. Чтобы
обнаружить ошибки, убедитесь, что ваше приложение проверяет не только
для PGTYPESInvalidTimestamp но также и для
errno != 0 после каждого вызова функции
PGTYPEStimestamp_from_asc.