PostgreSQL の構造とソースツリー(2)
PostgreSQLのソースコード
PostgreSQL のおおまかな構造がわかったところで、PostgreSQL のソースコードの構造を見ていきましょう。
PostgreSQL が現在の形になったときは 20 万行ほどだったソースコードは、今では 100 万行ほどあります。 これほどの量になると、闇雲にコードを読んでも理解するのは難しいでしょう。 そこでまず本稿で大まかなソースコードの構造を理解していただきたいと思います。
トップレベル
PostgreSQL のソースコードを展開すると、トップレベルには表のようなファイルやディレクトリがあります。 トップレベルで configure; make; make install を行なえば、基本的なインストールはすぐにできるようになっています。 実際には、PostgreSQL のソースからのインストールは極めて容易です。
| ファイル/ディレクトリ | 説明 | 
|---|---|
| COPYRIGHT | 著作権の表示 | 
| GUNMakefile | トップレベルの Makefile | 
| GUNMakefile.in | Makefile の雛形 | 
| HISTORY | 改訂履歴 | 
| INSTALL | インストール方法の概略 | 
| Makefile | ダミーの Makefile | 
| README | 概要の説明 | 
| aclocal.m4 | config 用ファイルの一部 | 
| config/ | config 用ファイルを格納するディレクトリ | 
| configure | configure ファイル | 
| configure.in | configure ファイルの雛形 | 
| contrib/ | contribution プログラム | 
| doc/ | ドキュメントディレクトリ | 
| src/ | ソースディレクトリ | 
PostgreSQL の本体は src 以下にあります。
| ファイル/ディレクトリ | 説明 | 
|---|---|
| DEVELOPERS | 開発者向けの注釈 | 
| Makefile | Makefile 本体 | 
| Makefile.global | make 用の設定値(configure が生成) | 
| Makefile.global.in | configure が使用する Makefile.global の雛型 | 
| Makefile.port | プラットフォーム依存の make 設定値。実際には makefile/Makefile. プラットフォームへのリンク(configure が生成) | 
| Makefile.shlib | 共有ライブラリ用の Makefile | 
| backend/ | バックエンドのソース一式 | 
| bcc32.mak | Win32 ポート用の Makefile (Borland C++ 用) | 
| bin/ | psql などの UNIX コマンドのソース | 
| include/ | ヘッダファイル | 
| interfaces/ | フロントエンドライブラリのソース一式 | 
| makefiles/ | プラットフォーム依存の make 設定値 | 
| nls-global.mk | メッセージカタログ用 Makefile 用ルール | 
| pl/ | プロシージャ言語のソース | 
| port/ | プラットフォーム移植用のソース | 
| template/ | プラットフォーム依存の設定値 | 
| test/ | 各種テストツール | 
| timezone/ | タイムゾーンの実装 | 
| tools/ | 開発用の各種ツール、ドキュメント | 
| tutorial/ | チュートリアル | 
| win32.mak | Win32 ポート用の Makefile (Visual C++ 用) | 
この中で中心となるのは backend, bin, interfaces ディレクトリです。 backend はバックエンドに対応し、bin と interfaces はフロントエンドに対応します。
bin には、psql や initdb, pg_dump などの各種ツールのソースがあります。 interfaces には、PostgreSQL の C 言語ライブラリである libpq、そして C 言語に SQL を埋め込むことができる ecpg コマンドのソースがあります。
backend ディレクトリの構造を示します。
| ファイル/ディレクトリ | 説明 | 
|---|---|
| Makefile | makefile | 
| access/ | 各種アクセスメソッド(以下サブディレクトリ) common (共通関数)、gin (Generalized Inverted Index という汎用的な転置インデックスメソッド)、 gist (Generalized Search Tree という汎用的なインデックスメソッド)、 hash (ハッシュインデックス)、heap (ヒープアクセス関数)、 index (インデックスアクセス関数)、 nbtree (Btree インデックス)、transam (トランザクション処理) | 
| bootstrap/ | データベース初期化(initdb のとき)の処理 | 
| catalog/ | システムカタログのハンドリング | 
| commands/ | SELECT/INSERT/UPDATE/DELETE 以外の SQL 文を実行する処理 | 
| executor/ | エグゼキュータ (問い合わせの実行) | 
| foreign/ | FDW(Foreign Data Wrapper)処理 | 
| lib/ | 共通関数 | 
| libpq/ | フロントエンド/バックエンド通信のバックエンド側処理 | 
| main/ | すべての postgres 用のメイン | 
| nodes/ | パースツリー操作関数 | 
| optimizer/ | 問い合わせオプティマイザ | 
| parser/ | SQL パーサ | 
| port/ | プラットフォーム依存コード | 
| postmaster/ | postmaster (常駐 postgres) のメイン | 
| replication/ | streaming replication | 
| regex/ | 正規表現処理 | 
| rewrite/ | ルールとビュー用の問い合わせ書き換え処理 | 
| snowball/ | 全文検索関連(語幹処理) | 
| storage/ | 共有メモリ、ディスク上のストレージ、バッファなど、すべての1次/2次記憶管理 (以下サブディレクトリ) buffer/(バッファ管理)、 file/(ファイルアクセス)、freespace/(Fee Space Map管理) ipc/(プロセス間通信)、large_object/(ラージオブジェクトアクセス関数)、 lmgr/(ロックマネージャ)、page/(ページアクセス関数)、 smgr/(ストレージマネージャ) | 
| tcop/ | postgres (データベースエンジンプロセス) の主要部分 | 
| tsearch/ | 全文検索 | 
| utils/ | 様々なモジュール (以下サブディレクトリ) adt/(各種組み込みデータ型)、cache/(キャッシュ管理)、 error/(エラー処理関数)、fmgr/(関数管理)、hash/(hash 関数)、 init/(データベースの初期化、postgres の初期処理)、 mb/(マルチバイト処理)、misc/(その他)、mmgr/(メモリ管理関数)、 resowner/(問い合わせの間だけ有効なデータ (バッファピンやテーブルロック) の管理)、 sort/(ソート処理)、time/(トランザクションの MVCC 管理) | 
バックエンドなどのヘッダーファイルはまとめて include にあります。 backend のディレクトリ構造を反映しているのですが、そのままではなく、基本的にサブディレクトリの下に更にサブディレクトリを設けることはしていません。 たとえば、backend ディレクトリの下の utils の下にはさらに adt などのサブディレクトリがありますが、ここではそれは省略され、平坦な構造になっています。
access/ bootstrap/ c.h catalog/ commands/ dynloader.h executor/ fmgr.h foreign/ funcapi.h getaddrinfo.h getopt_long.h lib/ libpq/ mb/ miscadmin.h nodes/ optimizer/ parser/ pg_config.h pg_config.h.in pg_config.h.win32 pg_config_manual.h pg_config_os.h pg_trace.h pgstat.h pgtime.h port/ port.h portability/ postgres.h postgres_ext.h postgres_fe.h postmaster/ regex/ rewrite/ rusagestub.h snowball/ stamp-h storage/ tcop/ tsearch/ utils/ windowapi.h
(2011年11月15日公開)
