3737#include "catalog/pg_shseclabel.h"
3838#include "catalog/pg_tablespace.h"
3939#include "catalog/toasting.h"
40+ #include "common/relpath.h"
4041#include "miscadmin.h"
4142#include "storage/fd.h"
4243#include "utils/fmgroids.h"
4344#include "utils/rel.h"
4445#include "utils/tqual.h"
4546
4647
47- #define FORKNAMECHARS 4 /* max chars for a fork name */
48-
49- /*
50- * Lookup table of fork name by fork number.
51- *
52- * If you add a new entry, remember to update the errhint below, and the
53- * documentation for pg_relation_size(). Also keep FORKNAMECHARS above
54- * up-to-date.
55- */
56- const char * forkNames [] = {
57- "main" , /* MAIN_FORKNUM */
58- "fsm" , /* FSM_FORKNUM */
59- "vm" , /* VISIBILITYMAP_FORKNUM */
60- "init" /* INIT_FORKNUM */
61- };
6248
6349/*
6450 * forkname_to_number - look up fork number by name
@@ -79,130 +65,6 @@ forkname_to_number(char *forkName)
7965 return InvalidForkNumber ; /* keep compiler quiet */
8066}
8167
82- /*
83- * forkname_chars
84- * We use this to figure out whether a filename could be a relation
85- * fork (as opposed to an oddly named stray file that somehow ended
86- * up in the database directory). If the passed string begins with
87- * a fork name (other than the main fork name), we return its length,
88- * and set *fork (if not NULL) to the fork number. If not, we return 0.
89- *
90- * Note that the present coding assumes that there are no fork names which
91- * are prefixes of other fork names.
92- */
93- int
94- forkname_chars (const char * str , ForkNumber * fork )
95- {
96- ForkNumber forkNum ;
97-
98- for (forkNum = 1 ; forkNum <= MAX_FORKNUM ; forkNum ++ )
99- {
100- int len = strlen (forkNames [forkNum ]);
101-
102- if (strncmp (forkNames [forkNum ], str , len ) == 0 )
103- {
104- if (fork )
105- * fork = forkNum ;
106- return len ;
107- }
108- }
109- return 0 ;
110- }
111-
112- /*
113- * relpathbackend - construct path to a relation's file
114- *
115- * Result is a palloc'd string.
116- */
117- char *
118- relpathbackend (RelFileNode rnode , BackendId backend , ForkNumber forknum )
119- {
120- int pathlen ;
121- char * path ;
122-
123- if (rnode .spcNode == GLOBALTABLESPACE_OID )
124- {
125- /* Shared system relations live in {datadir}/global */
126- Assert (rnode .dbNode == 0 );
127- Assert (backend == InvalidBackendId );
128- pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
129- path = (char * ) palloc (pathlen );
130- if (forknum != MAIN_FORKNUM )
131- snprintf (path , pathlen , "global/%u_%s" ,
132- rnode .relNode , forkNames [forknum ]);
133- else
134- snprintf (path , pathlen , "global/%u" , rnode .relNode );
135- }
136- else if (rnode .spcNode == DEFAULTTABLESPACE_OID )
137- {
138- /* The default tablespace is {datadir}/base */
139- if (backend == InvalidBackendId )
140- {
141- pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
142- path = (char * ) palloc (pathlen );
143- if (forknum != MAIN_FORKNUM )
144- snprintf (path , pathlen , "base/%u/%u_%s" ,
145- rnode .dbNode , rnode .relNode ,
146- forkNames [forknum ]);
147- else
148- snprintf (path , pathlen , "base/%u/%u" ,
149- rnode .dbNode , rnode .relNode );
150- }
151- else
152- {
153- /* OIDCHARS will suffice for an integer, too */
154- pathlen = 5 + OIDCHARS + 2 + OIDCHARS + 1 + OIDCHARS + 1
155- + FORKNAMECHARS + 1 ;
156- path = (char * ) palloc (pathlen );
157- if (forknum != MAIN_FORKNUM )
158- snprintf (path , pathlen , "base/%u/t%d_%u_%s" ,
159- rnode .dbNode , backend , rnode .relNode ,
160- forkNames [forknum ]);
161- else
162- snprintf (path , pathlen , "base/%u/t%d_%u" ,
163- rnode .dbNode , backend , rnode .relNode );
164- }
165- }
166- else
167- {
168- /* All other tablespaces are accessed via symlinks */
169- if (backend == InvalidBackendId )
170- {
171- pathlen = 9 + 1 + OIDCHARS + 1
172- + strlen (TABLESPACE_VERSION_DIRECTORY ) + 1 + OIDCHARS + 1
173- + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
174- path = (char * ) palloc (pathlen );
175- if (forknum != MAIN_FORKNUM )
176- snprintf (path , pathlen , "pg_tblspc/%u/%s/%u/%u_%s" ,
177- rnode .spcNode , TABLESPACE_VERSION_DIRECTORY ,
178- rnode .dbNode , rnode .relNode ,
179- forkNames [forknum ]);
180- else
181- snprintf (path , pathlen , "pg_tblspc/%u/%s/%u/%u" ,
182- rnode .spcNode , TABLESPACE_VERSION_DIRECTORY ,
183- rnode .dbNode , rnode .relNode );
184- }
185- else
186- {
187- /* OIDCHARS will suffice for an integer, too */
188- pathlen = 9 + 1 + OIDCHARS + 1
189- + strlen (TABLESPACE_VERSION_DIRECTORY ) + 1 + OIDCHARS + 2
190- + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1 ;
191- path = (char * ) palloc (pathlen );
192- if (forknum != MAIN_FORKNUM )
193- snprintf (path , pathlen , "pg_tblspc/%u/%s/%u/t%d_%u_%s" ,
194- rnode .spcNode , TABLESPACE_VERSION_DIRECTORY ,
195- rnode .dbNode , backend , rnode .relNode ,
196- forkNames [forknum ]);
197- else
198- snprintf (path , pathlen , "pg_tblspc/%u/%s/%u/t%d_%u" ,
199- rnode .spcNode , TABLESPACE_VERSION_DIRECTORY ,
200- rnode .dbNode , backend , rnode .relNode );
201- }
202- }
203- return path ;
204- }
205-
20668/*
20769 * GetDatabasePath - construct path to a database dir
20870 *
0 commit comments