無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

33.6. pgtypes ライブラリ

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);
free(out);

33.6.1. numeric 型

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 桁の十進数で出力されます。

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);

この関数は符号付整数型の変数を受付け、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 型として実装されていますので、この変換ではオーバーフローは起きません。

33.6.2. 日付型

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にはこれを変更するための変数がありません。

表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 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 書式で日付を出力します。

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 - 月の名前(省略形)

他の文字はすべて出力文字列にそのままコピーされます。

表33-3 にいくつかの可能性のある書式を示します。 この関数の使用法に関するアイディアを提供しています。 出力行はすべて同じ日付、1959年11月23日に基づいています。

表 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
.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 を検索します。

表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.3. timestamp型

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 サーバが行うような計算を行うことはできません。 時間帯指定は警告無しに無視されます。

表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 (時間帯指定は無視されます。)
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型のテキスト表現を含む割り当てられた文字列を返します。

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進の週番号(日曜が週の先頭です)に置換されます。

  • %u - 10進の週番号(月曜が週の先頭です)に置換されます。

  • %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を、エラーが発生した場合は負の値を返します。

33.6.4. interval型

Cにおけるinterval型を用いることにより、プログラムからSQLのinterval型のデータを扱うことができます。 PostgreSQL サーバにおける対応する型については 項8.5 を参照してください。

以下の関数を使用して、interval型を扱うことができます。

PGTYPESinterval_new

新しく割り当てたinterval型変数へのポインタを返します。

interval *PGTYPESinterval_new(void);

PGTYPESinterval_free

以前に割り当てられたinterval型変数のメモリを解放します。

void PGTYPESinterval_new(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 のようになります。

PGTYPESinterval_copy

interval型変数をコピーします。

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

この関数は、 intvlsrc が指し示すinterval型変数を intvldest が指し示す変数にコピーします。 事前に格納先の変数用のメモリを割り当てる必要があることに注意してください。

33.6.5. decimal型

decimal型はnumeric型に似ています。 しかし、その最大精度は30有効桁に制限されています。 ヒープ上にしか作成できないnumeric型と比べ、decimal型はスタックまたはヒープ上に作成することができます。 (このためには PGTYPESdecimal_new および PGTYPESdecimal_free 関数を使用します。) 項33.15 で説明する Informix 互換モードではdecimal型を扱う関数がより多く存在します。

以下の関数を使用してdecimal型を扱うことができます。 これらは libcompat ライブラリに含まれるものだけではありません。

PGTYPESdecimal_new

新しく割り当てられたdecimal型変数へのポインタを要求します。

decimal *PGTYPESdecimal_new(void);

PGTYPESdecimal_free

decimal型を解放し、そのメモリをすべて解放します。

void PGTYPESdecimal_free(decimal *var);

33.6.6. pgtypeslibのerrno値

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

コンテキスト内で扱うことができない、無限なタイムスタンプ値がありました。

33.6.7. pgtypeslibの特殊な定数

PGTYPESInvalidTimestamp

無効なタイムスタンプを表すtimestamp型の値です。 これは解析エラーの場合に PGTYPEStimestamp_from_asc 関数によって返されます。 timestamp データ型の内部表現のため、 PGTYPESInvalidTimestamp はまた同時に有効なタイムスタンプでもあります。 これは 1899-12-31 23:59:59 に設定されます。 エラーを検知するためには、 PGTYPEStimestamp_from_asc を呼び出す度にその後、 PGTYPESInvalidTimestamp を試験するだけではなく、 errno != 0 も試験してください。


powered by SEO.CUG.NET