PostgreSQL の構造とソースツリー(2)

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日公開)