10
10
*
11
11
*
12
12
* 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 $
14
14
*
15
15
*-------------------------------------------------------------------------
16
16
*/
43
43
44
44
45
45
#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 */
47
47
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
+ }
48
78
49
79
/*
50
80
* relpath- construct path to a relation's file
@@ -61,22 +91,22 @@ relpath(RelFileNode rnode, ForkNumber forknum)
61
91
{
62
92
/* Shared system relations live in {datadir}/global */
63
93
Assert (rnode .dbNode == 0 );
64
- pathlen = 7 + OIDCHARS + 1 + FORKNUMCHARS + 1 ;
94
+ pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
65
95
path = (char * )palloc (pathlen );
66
96
if (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 ] );
69
99
else
70
100
snprintf (path ,pathlen ,"global/%u" ,rnode .relNode );
71
101
}
72
102
else if (rnode .spcNode == DEFAULTTABLESPACE_OID )
73
103
{
74
104
/* The default tablespace is {datadir}/base */
75
- pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNUMCHARS + 1 ;
105
+ pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
76
106
path = (char * )palloc (pathlen );
77
107
if (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 ] );
80
110
else
81
111
snprintf (path ,pathlen ,"base/%u/%u" ,
82
112
rnode .dbNode ,rnode .relNode );
@@ -85,11 +115,12 @@ relpath(RelFileNode rnode, ForkNumber forknum)
85
115
{
86
116
/* All other tablespaces are accessed via symlinks */
87
117
pathlen = 10 + OIDCHARS + 1 + OIDCHARS + 1 + OIDCHARS + 1
88
- + FORKNUMCHARS + 1 ;
118
+ + FORKNAMECHARS + 1 ;
89
119
path = (char * )palloc (pathlen );
90
120
if (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 ]);
93
124
else
94
125
snprintf (path ,pathlen ,"pg_tblspc/%u/%u/%u" ,
95
126
rnode .spcNode ,rnode .dbNode ,rnode .relNode );