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