職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

起動せずにバージョンを調べる方法

PostgreSQLを1つのマシンに沢山インストールしていると、どれが何のバージョンだかわからなくなることがあります。もちろん起動していればpgAdminやpsql等の各種ツールで接続すれば簡単に調べることができますが、それが面倒である状況もしばしばあります。この記事では起動せずに調べることを検討してみます。

includeファイルを見てみる

インストールディレクトリには「bin」や「lib」など、いくつかのディレクトリが含まれていますが、一緒に「include」というディレクトリが含まれることが多いです。この中身はPostgreSQLをビルドするときに使用したC言語のヘッダファイル達です。
バージョン番号が含まれるのは「pg_config.h」の中身で、以下のような部分を見つけることができます。

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "PostgreSQL 9.1.2"

/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "postgresql"

/* Define to the version of this package. */
#define PACKAGE_VERSION "9.1.2"

/* Define to the name of the default PostgreSQL service principal in Kerberos.
   (--with-krb-srvnam=NAME) */
#define PG_KRB_SRVNAM "postgres"

/* PostgreSQL major version as a string */
#define PG_MAJORVERSION "9.1"

/* PostgreSQL version as a string */
#define PG_VERSION "9.1.2"

/* PostgreSQL version as a number */
#define PG_VERSION_NUM 90102

/* A string containing the version number, platform, and C compiler */
#define PG_VERSION_STR "PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48), 64-bit"

これだけの情報があれば十分ですね。
※このpg_config.hは、9.1.2をCentOS上でビルドしたときのものです。

バイナリの内部を見てみる

前述の「include」ディレクトリが無い場合や、誰かが色々とイタズラしている可能性がある場合は、バイナリの中身を見るのが良いでしょう。バイナリにイタズラされてたらどうしようもないですがね(笑)
「bin」ディレクトリにある「postgres」、Windows版なら「postgres.exe」をお好みのエディタで開いてみましょう。もちろんバイナリエディタが望ましいですが、こういったバージョン番号などはASCII文字でそのまま格納されるケースがほとんどなので、テキストエディタで開いても今回の目的を達成できる可能性は高いです。
実際に筆者の環境で「postgres」実行ファイルをテキストエディタで開き、「PostgreSQL」で検索してみると30件近くヒットしました。その中には

PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48), 64-bit

といった文字列を見つけることができました。そんなに手間取らなかったことから、実用性?は十分あると思います。ただ、この時に誤って上書き保存などしないように気をつけなければなりません。これは先ほどのヘッダファイルについても同様です。

そもそも

PostgreSQLを沢山インストールするのであれば、インストールディレクトリにはバージョン番号を含める等の適切な名前を予め付けておきたいところですね。