[pgsql-jp: 28033] Re: DB FILE (Re: )
Atsuki Ito
atsuki @ pst.fujitsu.com
2002年 11月 19日 (火) 19:34:05 JST
富士通プライムソフトテクノロジの伊藤です。
たまたまソースを読んでいたので。
On Tue, 19 Nov 2002 16:53:15 +0900
Naofumi Kondoh <nkon @ shonan.ne.jp> wrote:
> postgres のソースを読んでないので心配なのは、Work File など
> 一時的に生成されるファイル類と、TOAST 関係です。
>
> TOAST は、pg_class の reltoastrelid で、それは必ず
> pg_toast_* という relname で、reltoastrelid = relfilenode
> になるものと考えていて大丈夫でしょうか?。
TOASTのrelnameは『pg_toast_*』と考えて良いと思います。
src/backend/catalog/catalog.c:99
にあるIsToastRelationName()で杉田さんの考えている判断をしてますので大丈
夫だと思います。
(実際に名前を作成しているのは、src/backend/commands/command.c:1766)
あと、pg_classのreltoastrelidですが以下で設定しています。
src/backend/commands/command.c:1843
ここでtoast_relidなるものを設定していますが、これは同ソースの:1799で作成
したTOASTのOidですのでrelNodeと考えても特に差し支えは無いと思います。
> Work File も base/DB名のOID/ の下にできますね。
> これの命名規則がわからなかったので、ディレクトリ一覧と
> pg_class で取得した relfilenode の両方を付き合わせて
> 表示しています。Work File で、sub directory は作らないものと
> 勝手に想定してしまったけど、まずかったでしょうか?。
私も細かいところまで把握してませんがRelationファイルのパス名作成等は
src/backend/catalog/catalog.c が一手に引き受けているようです。
/*
* relpath - construct path to a relation's file
*
* Result is a palloc'd string.
*/
char *
relpath(RelFileNode rnode)
{
char *path;
if (rnode.tblNode == (Oid) 0) /* "global tablespace" */
{
/* Shared system relations live in {datadir}/global */
path = (char *) palloc(strlen(DataDir) + 8 + sizeof(NameData) + 1);
sprintf(path, "%s/global/%u", DataDir, rnode.relNode);
}
else
{
path = (char *) palloc(strlen(DataDir) + 6 + 2 * sizeof(NameData) + 3);
sprintf(path, "%s/base/%u/%u", DataDir, rnode.tblNode, rnode.relNode);
}
return path;
}
> ソースコードきちんと読まないで質問ばかりで申し訳ない。
いえいえ、たまたま読んでましたので。
私が詰まった時はフォローお願いします。
------------------------------------------------------------
伊藤 淳樹(あつき) atsuki @ pst.fujitsu.com
(株)富士通プライムソフトテクノロジ http://www.pst.fujitsu.com/
pgsql-jp メーリングリストの案内