web-dev-qa-db-ja.com

PostgreSQLはどのようにしてテーブルスペースディレクトリに名前を付けるかを決定しますか?

ローカルホストで実行されているPostgreSQL9.6.1サーバーでpsql CLIツールを使用して、新しいテーブルスペースを作成しました。

create tablespace my_tablespace location /tmp/data;

そして、これによりPG_9.6_201608131というディレクトリが作成されたことがわかりました。

9.6がバージョンであることがわかりますが、数字の最後の文字列は何ですか?これを使用してMakefileにデータベースを作成したいので、(単にハードコーディングするのではなく)その番号がどのように導出されるかを知っておくと役に立ちます。

1
shadowtalker

Postgres9.6のソースコードを見てみます。

/* tablespace.c */

create_tablespace_directories(const char *location, const Oid tablespaceoid)
{
    ....
    location_with_version_dir = psprintf("%s/%s", location,TABLESPACE_VERSION_DIRECTORY);
    ....
    if (mkdir(location_with_version_dir, S_IRWXU) < 0)
    {
        ....
    }
}

/* catalog.h */

#define TABLESPACE_VERSION_DIRECTORY    "PG_" PG_MAJORVERSION"_" \
                                CppAsString2(CATALOG_VERSION_NO)

/* catversion.h */

#define CATALOG_VERSION_NO  201608131

PG_9.6_201608131は3つの部分で構成されていることがわかりました。

'PG_' + PG_MAJORVERSION + '_' + CATALOG_VERSION_NO

PostgreSQL9.6の場合

PG_MAJORVERSIONは9.6です

CATALOG_VERSION_NOは201608131です

PG_MAJORVERSIONとCATALOG_VERSION_NOはどちらもcのマクロ定義であり、変更されません。

source code here

2
Jack Geller