head	1.3;
access;
symbols
	REL9_0_0:1.3
	REL9_1_ALPHA1:1.3
	REL9_0_RC1:1.3
	REL9_0_BETA4:1.3
	REL9_0_STABLE:1.3.0.16
	REL9_0_BETA3:1.3
	REL9_0_BETA2:1.3
	REL7_4_29:1.2
	REL8_0_25:1.2
	REL8_1_21:1.2
	REL8_2_17:1.2
	REL8_3_11:1.3
	REL8_4_4:1.3
	REL9_0_BETA1:1.3
	REL9_0_ALPHA5_BRANCH:1.3.0.14
	REL9_0_ALPHA5:1.3
	REL7_4_28:1.2
	REL8_0_24:1.2
	REL8_1_20:1.2
	REL8_2_16:1.2
	REL8_3_10:1.3
	REL8_4_3:1.3
	REL9_0_ALPHA4:1.3
	REL9_0_ALPHA4_BRANCH:1.3.0.12
	REL8_5_ALPHA3:1.3
	REL8_5_ALPHA3_BRANCH:1.3.0.10
	REL7_4_27:1.2
	REL8_0_23:1.2
	REL8_1_19:1.2
	REL8_2_15:1.2
	REL8_3_9:1.3
	REL8_4_2:1.3
	REL8_5_ALPHA2:1.3
	REL8_5_ALPHA2_BRANCH:1.3.0.8
	REL7_4_26:1.2
	REL8_0_22:1.2
	REL8_1_18:1.2
	REL8_2_14:1.2
	REL8_3_8:1.3
	REL8_4_1:1.3
	REL8_5_ALPHA1:1.3
	REL8_5_ALPHA1_BRANCH:1.3.0.6
	REL8_4_STABLE:1.3.0.4
	REL8_4_0:1.3
	REL8_4_RC2:1.3
	REL8_4_RC1:1.3
	REL8_4_BETA2:1.3
	REL8_4_BETA1:1.3
	REL7_4_25:1.2
	REL8_0_21:1.2
	REL8_1_17:1.2
	REL8_2_13:1.2
	REL8_3_7:1.3
	REL7_4_24:1.2
	REL8_0_20:1.2
	REL8_1_16:1.2
	REL8_2_12:1.2
	REL8_3_6:1.3
	REL7_4_23:1.2
	REL8_0_19:1.2
	REL8_1_15:1.2
	REL8_2_11:1.2
	REL8_3_5:1.3
	REL7_4_22:1.2
	REL8_0_18:1.2
	REL8_1_14:1.2
	REL8_2_10:1.2
	REL8_3_4:1.3
	REL7_4_21:1.2
	REL8_0_17:1.2
	REL8_1_13:1.2
	REL8_2_9:1.2
	REL8_3_3:1.3
	REL7_4_20:1.2
	REL8_0_16:1.2
	REL8_1_12:1.2
	REL8_2_8:1.2
	REL8_3_2:1.3
	REL8_2_7:1.2
	REL8_3_1:1.3
	REL8_3_STABLE:1.3.0.2
	REL8_3_0:1.3
	REL8_3_RC2:1.3
	REL7_3_21:1.2
	REL7_4_19:1.2
	REL8_0_15:1.2
	REL8_1_11:1.2
	REL8_2_6:1.2
	REL8_3_RC1:1.3
	REL8_3_BETA4:1.3
	REL8_3_BETA3:1.3
	REL8_3_BETA2:1.3
	REL8_3_BETA1:1.3
	REL7_3_20:1.2
	REL7_4_18:1.2
	REL8_0_14:1.2
	REL8_1_10:1.2
	REL8_2_5:1.2
	REL7_3_19:1.2
	REL7_4_17:1.2
	REL8_0_13:1.2
	REL8_1_9:1.2
	REL8_2_4:1.2
	REL8_0_12:1.2
	REL8_1_8:1.2
	REL8_2_3:1.2
	REL7_3_18:1.2
	REL7_4_16:1.2
	REL8_0_11:1.2
	REL8_1_7:1.2
	REL8_2_2:1.2
	REL8_0_10:1.2
	REL8_1_6:1.2
	REL8_2_1:1.2
	REL7_4_15:1.2
	REL7_3_17:1.2
	REL8_2_STABLE:1.2.0.14
	REL8_2_0:1.2
	REL8_2_RC1:1.2
	REL8_2_BETA3:1.2
	REL8_2_BETA2:1.2
	REL8_1_5:1.2
	REL8_0_9:1.2
	REL7_4_14:1.2
	REL7_3_16:1.2
	REL8_2_BETA1:1.2
	REL7_3_15:1.2
	REL7_4_13:1.2
	REL8_0_8:1.2
	REL8_1_4:1.2
	REL7_3_14:1.2
	REL7_4_12:1.2
	REL8_0_7:1.2
	REL8_1_3:1.2
	REL7_3_13:1.2
	REL7_4_11:1.2
	REL8_0_6:1.2
	REL8_1_2:1.2
	REL7_3_12:1.2
	REL7_4_10:1.2
	REL8_0_5:1.2
	REL8_1_1:1.2
	REL8_1_STABLE:1.2.0.12
	REL8_1_0:1.2
	REL8_1_0RC1:1.2
	REL8_1_0BETA4:1.2
	REL8_1_0BETA3:1.2
	REL7_3_11:1.2
	REL7_4_9:1.2
	REL8_0_4:1.2
	REL8_1_0BETA2:1.2
	REL8_1_0BETA1:1.2
	REL7_3_10:1.2
	REL7_4_8:1.2
	REL8_0_3:1.2
	REL8_0_2:1.2
	REL7_3_9:1.2
	REL7_4_7:1.2
	REL8_0_1:1.2
	REL8_0_STABLE:1.2.0.10
	REL8_0_0:1.2.0.8
	REL8_0_0RC5:1.2
	REL8_0_0RC4:1.2
	REL8_0_0RC3:1.2
	REL8_0_0RC2:1.2
	REL8_0_0RC1:1.2
	REL8_0_0BETA5:1.2
	REL8_0_0BETA4:1.2
	REL7_4_6:1.2
	REL7_3_8:1.2
	REL8_0_0BETA3:1.2
	REL8_0_0BETA2:1.2
	REL7_4_5:1.2
	REL7_3_7:1.2
	REL7_4_4:1.2
	REL8_0_0BETA1:1.2
	REL7_4_3:1.2
	REL7_4_2:1.2
	REL7_3_6:1.2
	REL7_4_1:1.2
	REL7_3_5:1.2
	REL7_4:1.2
	REL7_4_RC2:1.2
	REL7_4_STABLE:1.2.0.6
	REL7_4_RC1:1.2
	REL7_4_BETA5:1.2
	REL7_4_BETA4:1.2
	REL7_4_BETA3:1.2
	REL7_4_BETA2:1.2
	WIN32_DEV:1.2.0.4
	REL7_4_BETA1:1.2
	REL7_3_4:1.2
	REL7_3_2:1.2
	REL7_3_STABLE:1.2.0.2;
locks; strict;
comment	@# @;


1.3
date	2007.04.15.10.49.26;	author ishii;	state Exp;
branches;
next	1.2;

1.2
date	2002.09.18.01.21.28;	author ishii;	state Exp;
branches;
next	1.1;

1.1
date	2002.07.24.07.05.41;	author ishii;	state Exp;
branches;
next	;


desc
@@


1.3
log
@Fix description how to create conversion function.
@
text
@新しいエンコーディング変換関数の追加方法

	2006/04/15 Tatsuo Ishii

はじめに

PostgreSQLには，データベースとフロントエンドのエンコーディングが異なる
ときに，自動的にエンコーディングの変換を行う機能があります．このディレ
クトリには，そのときに使われる関数が登録されています．これらの関数はユー
ザ定義C関数として，initdbの中で登録されます．具体的には，
/usr/local/pgsql/share/conversion_create.sql の中で登録されます(このファ
イルはこのディレクトリでmakeしたときに自動生成されます)．

また，これらの関数はconvert()関数からも呼び出されることもあります．

このREADMEでは，C関数を定義する方法と，それをMakefileなどに追加する方
法を説明します．

o C関数の呼び出し形式

  エンコーディング変換関数の呼び出し形式は次のようになります．

  conv_proc(
	INTEGER,	-- source encoding id
	INTEGER,	-- destination encoding id
	CSTRING,	-- source string (null terminated C string)
	INTERNAL,	-- destination string (null terminated C string)
	INTEGER		-- source string length
  ) returns VOID;

  唯一の出力引数は4番目のdestination stringです．ユーザ定義関数は必要
  なメモリをpallocし，そこに変換結果をNULLターミネートされたC文字列と
  して出力しなければなりません．また，適切な大きさのメモリを確保するの
  は，このC関数の責任です．というのは，一般に変換された文字列の長さは
  ソース文字列の長さ(5番目の引数で指定されます．単位はNULLターミネート
  を含まないバイト数です)とは一致しないからです．

  エンコーディングIDはinclude/mb/pg_wchar.hのtypedef enum pg_encで定義
  されています．

o 関数の登録とコンパイル

  作ったC関数はサブディレクトリを作り，その中に納めます．その中に
  Makefileも必要になりますが，他のディレクトリにあるMakefileを参考にす
  れば簡単に作成できるでしょう．

  次にメインのMakefile(このファイルが置いてある同じディレクトリにあり
  ます)に関数に関する記述を追加します．

  (1) DIRS=の後にサブディレクトリ名を追加します．

  (2) @@set \ で始まる項目に記述を追加します．1関数につき1行の追加が必要
    です．

    コンバージョンの名前
    ソースエンコーディング名
    デスティネーションエンコーディング名
    関数名
    オブジェクトファイル名

    を1行の中にスペースで区切って追加します．

o テスト

  以上が終わったら，このファイルがあるディレクトリでmakeし，すべてがう
  まくいくことを確認します．特に，create_conversion.sqlがちゃんとした
  内容になっているかどうか確認しましょう．良さそうだったら，テスト用に
  新しいデータベースを作り，そこでこのスクリプトを実行します．

  $ psql -e -f create_conversion.sql test

  これも正常だったら，最後にregression test suiteにテスト項目を追加し
  てください．具体的には，src/test/regress/sql/conversion.sqlに追加し，
  regression testを行います．

o 注意事項

  デフォルトのエンコーディング変換として使用できるためには，ソースエン
  コーディングとデスティネーションエンコーディングの間で双方向の変換が
  できることが必要です．すなわち，あるエンコーディングのペアに付き，2
  個の関数の作成が必要です．これらの関数は別々のサブディレクトリに登録
  しても良いですが，通常は一つのソースファイル中に2個の関数を書くこと
  が多いでしょう．
@


1.2
log
@Update Japanese README so that it reflects the changes made to the
conversion function interface.
@
text
@d3 1
a3 1
	2002/09/18 Tatsuo Ishii
d27 1
a27 1
	CSTRING,	-- destination string (null terminated C string)
@


1.1
log
@Add Japanese README explaining how to add new conversion.
English README will come soon...
@
text
@d3 1
a3 1
	2002/07/24 Tatsuo Ishii
d26 2
a27 2
	OPAQUE,		-- source string (null terminated C string)
	OPAQUE,		-- destination string (null terminated C string)
d29 1
a29 1
  ) returns INTEGER;	-- dummy. returns nothing, actually.
d80 4
a83 4
  できることが必要ですすなわち，あるエンコーディングのペアに付き，2個
  の関数の作成が必要です．これらの関数は別々のサブディレクトリに登録し
  ても良いですが，通常は一つのソースファイル中に2個の関数を書くことが
  多いでしょう．
@
