1010 *
1111 *
1212 * IDENTIFICATION
13- * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.78 2008/08/11 11:05:10 heikki Exp $
13+ * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.79 2008/10/06 14:13:17 heikki Exp $
1414 *
1515 *-------------------------------------------------------------------------
1616 */
4343
4444
4545#define OIDCHARS 10/* max chars printed by %u */
46- #define FORKNUMCHARS 1 /* max chars for a forknumber */
46+ #define FORKNAMECHARS 4 /* max chars for a forkname */
4747
48+ /*
49+ * Lookup table of fork name by fork number.
50+ *
51+ * If you add a new entry, remember to update the errhint below, and the
52+ * documentation for pg_relation_size(). Also keep FORKNAMECHARS above
53+ * up-to-date.
54+ */
55+ const char * forkNames []= {
56+ "main" ,/* MAIN_FORKNUM */
57+ "fsm" /* FSM_FORKNUM */
58+ };
59+
60+ /*
61+ * forkname_to_number - look up fork number by name
62+ */
63+ ForkNumber
64+ forkname_to_number (char * forkName )
65+ {
66+ ForkNumber forkNum ;
67+
68+ for (forkNum = 0 ;forkNum <=MAX_FORKNUM ;forkNum ++ )
69+ if (strcmp (forkNames [forkNum ],forkName )== 0 )
70+ return forkNum ;
71+
72+ ereport (ERROR ,
73+ (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
74+ errmsg ("invalid fork name" ),
75+ errhint ("Valid fork names are 'main' and 'fsm'" )));
76+ return InvalidForkNumber ;/* keep compiler quiet */
77+ }
4878
4979/*
5080 * relpath- construct path to a relation's file
@@ -61,22 +91,22 @@ relpath(RelFileNode rnode, ForkNumber forknum)
6191{
6292/* Shared system relations live in {datadir}/global */
6393Assert (rnode .dbNode == 0 );
64- pathlen = 7 + OIDCHARS + 1 + FORKNUMCHARS + 1 ;
94+ pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
6595path = (char * )palloc (pathlen );
6696if (forknum != MAIN_FORKNUM )
67- snprintf (path ,pathlen ,"global/%u_%u " ,
68- rnode .relNode ,forknum );
97+ snprintf (path ,pathlen ,"global/%u_%s " ,
98+ rnode .relNode ,forkNames [ forknum ] );
6999else
70100snprintf (path ,pathlen ,"global/%u" ,rnode .relNode );
71101}
72102else if (rnode .spcNode == DEFAULTTABLESPACE_OID )
73103{
74104/* The default tablespace is {datadir}/base */
75- pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNUMCHARS + 1 ;
105+ pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
76106path = (char * )palloc (pathlen );
77107if (forknum != MAIN_FORKNUM )
78- snprintf (path ,pathlen ,"base/%u/%u_%u " ,
79- rnode .dbNode ,rnode .relNode ,forknum );
108+ snprintf (path ,pathlen ,"base/%u/%u_%s " ,
109+ rnode .dbNode ,rnode .relNode ,forkNames [ forknum ] );
80110else
81111snprintf (path ,pathlen ,"base/%u/%u" ,
82112rnode .dbNode ,rnode .relNode );
@@ -85,11 +115,12 @@ relpath(RelFileNode rnode, ForkNumber forknum)
85115{
86116/* All other tablespaces are accessed via symlinks */
87117pathlen = 10 + OIDCHARS + 1 + OIDCHARS + 1 + OIDCHARS + 1
88- + FORKNUMCHARS + 1 ;
118+ + FORKNAMECHARS + 1 ;
89119path = (char * )palloc (pathlen );
90120if (forknum != MAIN_FORKNUM )
91- snprintf (path ,pathlen ,"pg_tblspc/%u/%u/%u_%u" ,
92- rnode .spcNode ,rnode .dbNode ,rnode .relNode ,forknum );
121+ snprintf (path ,pathlen ,"pg_tblspc/%u/%u/%u_%s" ,
122+ rnode .spcNode ,rnode .dbNode ,rnode .relNode ,
123+ forkNames [forknum ]);
93124else
94125snprintf (path ,pathlen ,"pg_tblspc/%u/%u/%u" ,
95126rnode .spcNode ,rnode .dbNode ,rnode .relNode );