pgtypesライブラリはPostgreSQLデータベースの型をCプログラムで使用できるようにC言語に対応させます。 また、これらの型を使用したCの基本的な計算を行う関数も提供します。 この計算には、PostgreSQLサーバを使用しません。 以下の例を参照してください。
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
のような一部の関数は新たに割り当てられた文字列へのポインタを返します。
この結果はfree
の代わりにPGTYPESchar_free
で解放することが必要です。
(これはWindows上でのみ重要です。Windowsではメモリの割り当てと解放は同じライブラリで実施されることが必要な場合があります。)
numeric 型では任意の精度での計算機能を提供します。
PostgreSQLサーバにおける対応する型については8.1を参照してください。
任意の精度を持つために、この変数は動的に拡張、縮小できなければなりません。
これが、PGTYPESnumeric_new
やPGTYPESnumeric_free
関数では、ヒープ領域上にのみしか numeric 変数を作成できない理由です。
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
numeric 型num
の文字列表現を持つ、malloc
で割り当てられた文字列へのポインタを返します。
char *PGTYPESnumeric_to_asc(numeric *num, int dscale);
numeric の値は、必要に応じて四捨五入され、dscale
桁の十進数で出力されます。
結果はPGTYPESchar_free()
で解放しなければなりません。
PGTYPESnumeric_add
2つの numeric 変数を加算し、3番目の numeric 変数に格納します。
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
この関数は変数var1
と変数var2
を加算し、その結果をresult
に格納します。
成功時0を、エラー時-1を返します。
PGTYPESnumeric_sub
2つの numeric 型変数を減算し、3番目の numeric 型変数に結果を格納します。
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
この関数は変数var1
から変数var2
を差し引きます。
演算結果を変数result
に格納します。
成功時0を、エラー時-1を返します。
PGTYPESnumeric_mul
2つの numeric 型変数を乗算し、3番目の numeric 型変数に結果を格納します。
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
この関数は変数var1
と変数var2
を掛け合わせます。
演算結果を変数result
に格納します。
成功時0を、エラー時-1を返します。
PGTYPESnumeric_div
2つの numeric 型変数で除算し、3番目の numeric 型変数に結果を格納します。
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
この関数は変数var1
を変数var2
で割ります。
演算結果を変数result
に格納します。
成功時0を、エラー時-1を返します。
PGTYPESnumeric_cmp
2つのnumeric型変数を比較します。
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
この関数は2つのnumeric型変数を比較します。
エラーの場合INT_MAX
が返ります。
成功時、この関数は以下のいずれかを返します:
var1
がvar2
より大きければ1。
var1
がvar2
より小さければ-1。
var1
がvar2
と等しければ0。
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);
この関数は符号付long int型の変数を受付け、numeric 型変数var
内に格納します。
成功時0、失敗時-1が返ります。
PGTYPESnumeric_copy
numeric 型変数を他の 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)
この関数はnv
が指し示す numeric 型変数の値をdp
が指し示すdouble型変数に変換します。
成功時0、オーバーフローを含むエラーが発生した時-1が返ります。
オーバーフローが発生した場合はさらに、グローバル変数errno
はPGTYPES_NUM_OVERFLOW
に設定されます。
PGTYPESnumeric_to_int
numeric 型変数をint型に変換します。
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
この関数はnv
が指し示す numeric 型変数の値をip
が指し示す整数型変数に変換します。
成功時0、オーバーフローを含むエラーが発生した時-1が返ります。
オーバーフローが発生した場合はさらに、グローバル変数errno
はPGTYPES_NUM_OVERFLOW
に設定されます。
PGTYPESnumeric_to_long
numeric 型変数をlong型に変換します。
int PGTYPESnumeric_to_long(numeric *nv, long *lp);
この関数はnv
が指し示す numeric 型変数の値をlp
が指し示すlong変数に変換します。
成功時0、オーバーフローを含むエラーが発生した時-1が返ります。
オーバーフローが発生した場合はさらに、グローバル変数errno
はPGTYPES_NUM_OVERFLOW
に設定されます。
PGTYPESnumeric_to_decimal
numeric 型変数を decimal 型に変換します。
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
この関数はsrc
が指し示す numeric 型変数の値をdst
が指し示す decimal 型変数に変換します。
成功時0、オーバーフローを含むエラーが発生した時-1が返ります。
オーバーフローが発生した場合はさらに、グローバル変数errno
はPGTYPES_NUM_OVERFLOW
に設定されます。
PGTYPESnumeric_from_decimal
decimal 型変数を numeric 型に変換します。
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);
この関数はsrc
が指し示す decimal 型変数の値をdst
が指し示す numeric 型変数に変換します。
成功時0、エラーが発生した時-1が返ります。
decimal 型は制限付の numeric 型として実装されていますので、この変換ではオーバーフローは起きません。
Cの日付型を使用して、プログラムからSQLの日付型を取り扱うことができます。 PostgreSQLサーバにおける対応する型については8.5を参照してください。
日付型を操作するために以下の関数を使用することができます:
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にはこれを変更するための変数がありません。
表 36.2に許される入力書式を示します。
表36.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 | February 1, 2003 |
1999-Jan-08 | January 8, 1999 |
Jan-08-1999 | January 8, 1999 |
08-Jan-1999 | January 8, 1999 |
99-Jan-08 | January 8, 1999 |
08-Jan-99 | January 8, 1999 |
08-Jan-06 | January 8, 2006 |
Jan-08-99 | January 8, 1999 |
19990108 | ISO 8601; January 8, 1999 |
990108 | ISO 8601; January 8, 1999 |
1999.008 | 年と年内日数 |
J2451187 | Jユリウス日 |
January 8, 99 BC | 紀元前99年 |
PGTYPESdate_to_asc
日付型変数のテキスト表現を返します。
char *PGTYPESdate_to_asc(date dDate);
この関数は唯一の引数として日付型dDate
を受付けます。
この関数は1999-01-18
、つまりYYYY-MM-DD
書式で日付を出力します。
結果はPGTYPESchar_free()
で解放しなければなりません。
PGTYPESdate_julmdy
日付型の変数から、日、月、年の値を取り出します。
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);
この関数は、1番目の引数として3つの整数からなる配列(mdy
)、2番目の引数として処理結果を格納する日付型の変数へのポインタを受付けます。
PGTYPESdate_dayofweek
日付値から週内日数を表す数を返します。
int PGTYPESdate_dayofweek(date d);
この関数は唯一の引数としてdate型変数d
を受付け、その日付の週内日数を表す整数を返します。
0 - 日曜
1 - 月曜
2 - 火曜
3 - 水曜
4 - 木曜
5 - 金曜
6 - 土曜
PGTYPESdate_today
現在の日付を取得します。
void PGTYPESdate_today(date *d);
この関数は現在の日付に設定されるdate型変数(d
)を指し示すポインタを受付けます。
PGTYPESdate_fmt_asc
date型変数を書式マスクを使用したテキスト表現に変換します。
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
この関数は変換対象のdate型(dDate
)、書式マスク(fmtstring
)、日付のテキスト表現を格納するための文字列(outbuf
)を受付けます。
成功時に0、エラーが発生した場合は負の値が返ります。
以下のリテラルを使用して、フィールドを指定することができます。
dd
- 月内の日数。
mm
- 年内の月数。
yy
- 二桁表記の年数
yyyy
- 四桁表記の年数
ddd
- 曜日の名前(省略形)
mmm
- 月の名前(省略形)
他の文字はすべて出力文字列にそのままコピーされます。
表 36.3にいくつかの可能性のある書式を示します。 この関数の使用方法に関するアイディアを提供しています。 出力行はすべて同じ日付、1959年11月23日に基づいています。
表36.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. |
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
)を受付けます。
テキスト表現は書式マスクに合った表現であることが仮定されています。
しかし、文字列と書式マスクを1:1に対応付けする必要はありません。
この関数は並んだ順番に解析し、年の位置を表すyy
またはyyyy
を、月の位置を表すmm
を、日の位置を表すdd
を検索します。
表 36.4はいくつかの可能性のある書式を示します。 これはこの関数の使用方法に関するアイディアを提供します。
表36.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 |
Cのタイムスタンプ型を使用してプログラムからSQLのタイムスタンプ型データを扱うことができます。 PostgreSQLにおける対応する型については8.5を参照してください。
以下の関数を使用してタイムスタンプ型を扱うことができます:
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でサポートされていない点に注意してください。 変換することはできますが、例えばPostgreSQLサーバが行うような計算を行うことはできません。 時間帯指定は警告無しに無視されます。
表 36.5に入力文字列の例をいくつか示します。
表36.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
date型をC char*文字列に変換します。
char *PGTYPEStimestamp_to_asc(timestamp tstamp);
この関数はtimestamp型のtstamp
を唯一の引数として受付け、timestamp型のテキスト表現を含む割り当てられた文字列を返します。
結果はPGTYPESchar_free()
で解放しなければなりません。
PGTYPEStimestamp_current
現在のタイムスタンプを取り出します。
void PGTYPEStimestamp_current(timestamp *ts);
この関数は現在のタイムスタンプを取り出し、ts
が指し示すtimestamp型変数に格納します。
PGTYPEStimestamp_fmt_asc
書式マスクを使用してtimestamp型変数をC char*に変換します。
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
この関数は、最初の引数として変換対象のtimestamp型 (ts
)を、出力バッファのポインタ(output
)、出力バッファで割当て可能な最大長 (str_len
)、変換に使用する書式マスク(fmtstr
)を受付けます。
成功するとこの関数は0を返します。 エラーが発生した場合は負の値が返ります。
書式マスクには以下の書式指定を使用することができます。
書式指定はlibcのstrftime
関数で使用されるものと同じです。
書式指定以外は出力バッファにコピーされます。
%A
- 各言語の曜日名称に置換されます。
%a
- 各言語の曜日略称に置換されます。
%B
- 各言語の月名称に置換されます。
%b
- 各言語の月略称に置換されます。
%C
- 年を100で割った10進数に置換されます。1桁の場合は先頭に0が付与されます。
%c
- 各言語の日付時刻表現に置換されます。
%D
- %m/%d/%y
と同じです。
%d
- 月内の10進日数(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
- 月内10進日数(1–31)に置換されます。1桁の場合は前に空白が付けられます。
%F
- %Y-%m-%d
と同じです。
%G
- 世紀付の10進数として年に置換されます。
この年は週の部分がより多く含まれます。(月曜が週の最初の日です。)
%g
-%G
同様に年に置換されますが、世紀の部分を除く10進数(00–99)になります。
%H
- 10進の時間(24時間単位)に置換されます(00–23)。
%h
- %b
と同じです。
%I
- 10進の時間(12時間単位)に置換されます(01–12)。
%j
- 10進の年内日数に置換されます(001–366)。
%k
- 10進の時間(24時間単位)に置換されます(0–23)。1桁の場合は先頭に空白が付けられます。
%l
- 10進の時間(12時間単位)に置換されます(1–12)。1桁の場合は先頭に空白が付けられます。
%M
- 10進の分数に置換されます(00–59)。
%m
-10進の月数に置換されます(01–12)。
%n
- 改行に置換されます。
%O*
- %E*
と同じです。
%p
- 各言語の「午前」または「午後」に適切に置換されます。
%R
- %H:%M
と同じです。
%r
- %I:%M:%S %p
と同じです。
%S
- 10進の秒数に置換されます(00–60)。
%s
- エポック、UTCからの秒数に置換されます。
%T
- %H:%M:%S
と同じです。
%t
- タブに置換されます。
%U
- 10進の週番号(日曜が週の先頭です)に置換されます(00–53)。
%u
- 10進の週番号(月曜が週の先頭です)に置換されます(1–7)。
%V
- 10進の年内の週番号(月曜が週の先頭です)に置換されます(01–53)。
新しい年で、1月1日を含む週が4日以上存在する場合、その週が1となります。
さもなくば、この週は前年の週となり、次の週が1となります。
%v
- %e-%b-%Y
と同じです。
%W
- 10進の年内の週番号(月曜が週の先頭です)に置換されます(00–53)。
%w
- 10進の週内日数(日曜が週の先頭です)に置換されます(0–6)。
%X
- 各言語の時間表現に置換されます。
%x
- 各言語の日付表現に置換されます。
%Y
- 10進の世紀付年に置換されます。
%y
- 10進の世紀なし年に置換されます(00–99)。
%Z
- 時間帯名称に置換されます。
%z
- UTCからの時間帯オフセットに置換されます。
UTCより東では正符号が先頭に付き、西では負符号が付きます。
それぞれ2桁の時間と分がその後に続きますが、その区切りはありません。(この形式はRFC 822の日付ヘッダでよく使用されます。)
%+
- 各言語の日付時刻表現に置換されます。
%-*
- GNU libc拡張です。数値出力を行う際に何も文字を詰めません。
$_* - GNU libcの拡張です。明示的に空白文字を使用して文字を詰めます。
%0*
- GNU libcの拡張です。明示的に0を使用して文字を詰めます。
%%
- %
に置換されます。
PGTYPEStimestamp_sub
タイムスタンプの減算を行い、その結果をinterval型の変数に格納します。
int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);
この関数はts1
が指し示すタイムスタンプ型変数からts2
が指し示すタイムスタンプ型変数を差し引き、iv
が指し示すinterval型変数に結果を格納します。
成功すると、この関数は0を返し、エラーが発生した場合は負の値を返します。
PGTYPEStimestamp_defmt_asc
書式マスクを使用して、テキスト表現からtimestamp値へ変換します。
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
timestamp型変数にinterval型変数を加算します。
int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
この関数はtimestamp型変数tin
へのポインタとinterval型変数span
へのポインタを受付けます。
これは、interval値をtimestamp値に加算し、その結果のtimestamp値をtout
が指し示す変数に格納します。
成功するとこの関数は0を返します。 エラーが発生した場合は負の値を返します。
PGTYPEStimestamp_sub_interval
timestamp型変数からinterval型変数の値を引きます。
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
この関数はtin
が指し示すtimestamp型変数からspan
が指し示すinterval型変数を引きます。
結果はtout
が指し示す変数に保存されます。
成功するとこの関数は0を、エラーが発生した場合は負の値を返します。
Cにおけるinterval型を用いることにより、プログラムからSQLのinterval型のデータを扱うことができます。 PostgreSQLサーバにおける対応する型については8.5を参照してください。
以下の関数を使用して、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);
この関数はspan
が指し示すinterval型変数をC char*に変換します。
出力は@ 1 day 12 hours 59 mins 10 secs
のようになります。
結果はPGTYPESchar_free()
で解放しなければなりません。
PGTYPESinterval_copy
interval型変数をコピーします。
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
この関数は、intvlsrc
が指し示すinterval型変数を intvldest
が指し示す変数にコピーします。
事前に格納先の変数用のメモリを割り当てる必要があることに注意してください。
decimal型はnumeric型に似ています。
しかし、その最大精度は30有効桁に制限されています。
ヒープ上にしか作成できないnumeric型と比べ、decimal型はスタックまたはヒープ上に作成することができます。
(このためにはPGTYPESdecimal_new
およびPGTYPESdecimal_free
関数を使用します。)
36.15で説明するInformix互換モードではdecimal型を扱う関数がより多く存在します。
以下の関数を使用してdecimal型を扱うことができます。
これらはlibcompat
ライブラリに含まれるものだけではありません。
PGTYPESdecimal_new
新しく割り当てられたdecimal型変数へのポインタを要求します。
decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free
decimal型を解放し、そのメモリをすべて解放します。
void PGTYPESdecimal_free(decimal *var);
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
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
関数に無効なtimestamp値が渡されました。
PGTYPES_TS_ERR_EINFTIME
コンテキスト内で扱うことができない、無限なタイムスタンプ値がありました。
PGTYPESInvalidTimestamp
無効なタイムスタンプを表すtimestamp型の値です。
これは解析エラーの場合にPGTYPEStimestamp_from_asc
関数によって返されます。
timestamp
データ型の内部表現のため、PGTYPESInvalidTimestamp
はまた同時に有効なタイムスタンプでもあります。
これは1899-12-31 23:59:59
に設定されます。
エラーを検知するためには、PGTYPEStimestamp_from_asc
を呼び出す度にその後、PGTYPESInvalidTimestamp
を試験するだけではなく、errno != 0
も試験してください。