ユーザ定義関数を作成し、登録すれば、作業は終ったようなも のです。 しかし、Postgresはあなたの関数が実装さ れているオブジェクトコード(すなわち、.o ファ イル、もしくは共有ライブラリ)をロードしなくてはなりません。 前に述べたとおり、Postgres は あなたのコードを実行時に、必要に応じてロードします。 コードが動的にロードされるようにするためには、 特別な方法でコンパイルとリンクをしなくてはなりません。 この節では、実行中のPostgresサーバがあ なたのユーザ定義関数をロードできるようにするために、どのようにコ ンパイルとリンクをするかについて説明します。 この作業手順はバージョン 4.2 のときとは、変わっていることに注意し て下さい。
Tip: 古いPostgresの動的ローディング機構は、動的ロー ダを書く人が持つような、実行プログラムの形式やメモリ内での配置やアライ メントに関する深い知識を必要としていました。 そのようなローダは遅くて、バグが多くなりがちでした。 バージョン 4.2 において、Postgres 動的ロー ディング機構はオペレーティングシステムが提供する動的ローディング機構を 使うように書き直されました。 このアプローチにより、以前に我々が書いた動的ローディング機構に比べると、 全体に速く、堅牢で、移植性の良いものになりました。 その理由は、最近のバージョンのUNIXが共有ライブラリを実装するために動的 ローディング機構を使っており、それゆえに速くて堅牢な機構でなくてはなら ないからです。 他方、オブジェクトファイルはPostgresにロー ドされる前に、ちょっとした後処理をしなくてはなりません。 使い勝手がわずかに落ちることは、スピードと堅牢さの大幅なアップにより 埋め合わせできるのではないかと思います。
何か疑問が生じたら、Cコンパイラ cc(1) と、リンカ ld(1) の マニュアルページを(何度も何度も)読むべきです。 また、ディレクトリPGROOT/src/regress に入っている regression test 一式には、この処理に関して 動作する例がいくつか入っています。 これらのテストがしていることを真似れば、なにも問題は無いでしょう。 以下、次のような用語が使われます。
動的ローディング とは Postgres がオブジェクトファ イルに対して行なうことです。 オブジェクトファイルは実行中の Postgres サーバの中にコピーされ、ファイル中の関数と変数は Postgres プロセス中の 関数として使えるようになります。 Postgres は、オペレーティングシステムが提供する動的ローディング機 構を使って、これを行ないます。
ローディングとリンク処理 とは、なにか他の種類のオブジェクトファイル(たとえば、実行モ ジュールや共有ライブラリ)を作るために、オブジェクトファイル に対して行なうことです。 これはリンカ ld(1) を使って行ないます。
次に述べる一般的な制限や注意事項は、後述する説明においても適用されます。
関数作成コマンドのパスは Postgres サーバの走るマシンから 見えるディレクトリを参照する 絶対パス(すなわち "/" で始まる)でなくてはなりません。
Tip: 相対パスも実際には使えますが、データベースがあるディレクトリ(ふつうフ ロントエンドアプリケーションからは見えません)に対して相対的なものになります。 サーバは全く別のマシンで実行することもできるのですから、 ユーザがフロントエンドアプリケーションを起動したディレクトリ に対して相対的なパスを定義することは、明らかに無意味です。
Postgres ユーザ [1] は関数生成 コマンドのパスにアクセス可能であり、オブジェクトファイルが読み込み 可能でなくてはなりません。 なぜなら、Postgres サーバは Postgres ユーザとして実行するのであ って、フロントエンドプロセスの起動ユーザとしてではないからです。 (ファイルやその上のレベルのディレクトリを Postgres ユーザから読み込み不可もし くは実行不可にしてしまうのは、非常に良くあるミスです。)
オブジェクトファイル内のシンボル名は、互いに、かつ Postgres が定義したシンボルとも 衝突してはいけません。
GNU C コンパイラは、通常はオペレーティングシステムの動的ローデ ィングインターフェースを使うための特別なオプションがありません。 そのような場合には、オペレーティングシステムが提供する C コン パイラーを使って下さい。
ULTRIXで動的ロード可能なオブジェクトファイルを作るのは、とても簡 単です。 ULTRIXは共有メモリ機構を持っていませんが、それゆえ、動的ローディ ングインターフェースに対して、なにも制約を設けていません。 一方、我々は移植性の無いダイナミックローダを我々自身で(再度)書か ねばならなかったし、本当の共有ライブラリを使うこともできませんで した。 ULTRIXにおいて、唯一の制限はオブジェクトファイルを作成する時に オプション -G 0 を使わなれけばならないということです。 (数字の ``0'' であり、文字の ``O''ではないことに注意)。 例えば、
# simple ULTRIX example % cc -G 0 -c foo.cこれは、foo.o という名前で Postgresに動的ロ ーディングできるオブジェクトファイルを生成します。 この他に追加のローディングやリンク処理をする必要はありません。
[1] | (訳註)このPostgres ユーザとは、サー バを起動するユーザ(通常は postgres )のことです。 |