PostgreSQL Source Code git master
Loading...
Searching...
No Matches
relpath.h File Reference
Include dependency graph for relpath.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  RelPathStr
 

Macros

#define InvalidRelFileNumber   ((RelFileNumber) InvalidOid)
 
#define RelFileNumberIsValid(relnumber)    ((bool) ((relnumber) != InvalidRelFileNumber))
 
#define TABLESPACE_VERSION_DIRECTORY
 
#define PG_TBLSPC_DIR   "pg_tblspc"
 
#define PG_TBLSPC_DIR_SLASH
 
#define OIDCHARS   10 /* max chars printed by %u */
 
#define MAX_FORKNUM   INIT_FORKNUM
 
#define FORKNAMECHARS   4 /* max chars for a fork name */
 
#define PROCNUMBER_CHARS   6
 
#define REL_PATH_STR_MAXLEN
 
#define relpathbackend(rlocator, backend, forknum)
 
#define relpathperm(rlocator, forknum)    relpathbackend(rlocator, INVALID_PROC_NUMBER, forknum)
 
#define relpath(rlocator, forknum)    relpathbackend((rlocator).locator, (rlocator).backend, forknum)
 

Typedefs

typedef Oid RelFileNumber
 
typedef enum ForkNumber ForkNumber
 
typedef struct RelPathStr RelPathStr
 

Enumerations

enum  ForkNumber {
  InvalidForkNumber = -1 , MAIN_FORKNUM = 0 , FSM_FORKNUM , VISIBILITYMAP_FORKNUM ,
  INIT_FORKNUM
}
 

Functions

ForkNumber forkname_to_number (const char *forkName)
 
int forkname_chars (const char *str, ForkNumber *fork)
 
charGetDatabasePath (Oid dbOid, Oid spcOid)
 
RelPathStr GetRelationPath (Oid dbOid, Oid spcOid, RelFileNumber relNumber, int procNumber, ForkNumber forkNumber)
 

Variables

PGDLLIMPORT const char *const forkNames []
 

Macro Definition Documentation

◆ FORKNAMECHARS

#define FORKNAMECHARS   4 /* max chars for a fork name */

Definition at line 72 of file relpath.h.

◆ InvalidRelFileNumber

#define InvalidRelFileNumber   ((RelFileNumber) InvalidOid)

Definition at line 26 of file relpath.h.

◆ MAX_FORKNUM

#define MAX_FORKNUM   INIT_FORKNUM

Definition at line 70 of file relpath.h.

◆ OIDCHARS

#define OIDCHARS   10 /* max chars printed by %u */

Definition at line 45 of file relpath.h.

◆ PG_TBLSPC_DIR

#define PG_TBLSPC_DIR   "pg_tblspc"

Definition at line 41 of file relpath.h.

◆ PG_TBLSPC_DIR_SLASH

#define PG_TBLSPC_DIR_SLASH
Value:
"pg_tblspc/" /* required for strings
* comparisons */

Definition at line 42 of file relpath.h.

57{
59 MAIN_FORKNUM = 0,
63
64 /*
65 * NOTE: if you add a new fork, change MAX_FORKNUM and possibly
66 * FORKNAMECHARS below, and update the forkNames array in
67 * src/common/relpath.c
68 */
70
71#define MAX_FORKNUM INIT_FORKNUM
72
73#define FORKNAMECHARS 4 /* max chars for a fork name */
74
75extern PGDLLIMPORT const char *const forkNames[];
76
77extern ForkNumber forkname_to_number(const char *forkName);
78extern int forkname_chars(const char *str, ForkNumber *fork);
79
80
81/*
82 * Unfortunately, there's no easy way to derive PROCNUMBER_CHARS from
83 * MAX_BACKENDS. MAX_BACKENDS is 2^18-1. Crosschecked in test_relpath().
84 */
85#define PROCNUMBER_CHARS 6
86
87/*
88 * The longest possible relation path lengths is from the following format:
89 * sprintf(rp.path, "%s/%u/%s/%u/t%d_%u",
90 * PG_TBLSPC_DIR, spcOid,
91 * TABLESPACE_VERSION_DIRECTORY,
92 * dbOid, procNumber, relNumber);
93 *
94 * Note this does *not* include the trailing null-byte, to make it easier to
95 * combine it with other lengths.
96 */
97#define REL_PATH_STR_MAXLEN \
98 ( \
99 sizeof(PG_TBLSPC_DIR) - 1 \
100 + sizeof((char)'/') \
101 + OIDCHARS /* spcOid */ \
102 + sizeof((char)'/') \
103 + sizeof(TABLESPACE_VERSION_DIRECTORY) - 1 \
104 + sizeof((char)'/') \
105 + OIDCHARS /* dbOid */ \
106 + sizeof((char)'/') \
107 + sizeof((char)'t') /* temporary table indicator */ \
108 + PROCNUMBER_CHARS /* procNumber */ \
109 + sizeof((char)'_') \
110 + OIDCHARS /* relNumber */ \
111 + sizeof((char)'_') \
112 + FORKNAMECHARS /* forkNames[forkNumber] */ \
113 )
114
115/*
116 * String of the exact length required to represent a relation path. We return
117 * this struct, instead of char[REL_PATH_STR_MAXLEN + 1], as the pointer would
118 * decay to a plain char * too easily, possibly preventing the compiler from
119 * detecting invalid references to the on-stack return value of
120 * GetRelationPath().
121 */
122typedef struct RelPathStr
123{
124 char str[REL_PATH_STR_MAXLEN + 1];
125} RelPathStr;
126
127
128/*
129 * Stuff for computing filesystem pathnames for relations.
130 */
131extern char *GetDatabasePath(Oid dbOid, Oid spcOid);
132
133extern RelPathStr GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber,
134 int procNumber, ForkNumber forkNumber);
135
136/*
137 * Wrapper macros for GetRelationPath. Beware of multiple
138 * evaluation of the RelFileLocator or RelFileLocatorBackend argument!
139 */
140
141/* First argument is a RelFileLocator */
142#define relpathbackend(rlocator, backend, forknum) \
143 GetRelationPath((rlocator).dbOid, (rlocator).spcOid, (rlocator).relNumber, \
144 backend, forknum)
145
146/* First argument is a RelFileLocator */
147#define relpathperm(rlocator, forknum) \
148 relpathbackend(rlocator, INVALID_PROC_NUMBER, forknum)
149
150/* First argument is a RelFileLocatorBackend */
151#define relpath(rlocator, forknum) \
152 relpathbackend((rlocator).locator, (rlocator).backend, forknum)
153
154#endif /* RELPATH_H */
#define PGDLLIMPORT
Definition c.h:1328
const char * str
unsigned int Oid
static int fb(int x)
RelPathStr GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, int procNumber, ForkNumber forkNumber)
Definition relpath.c:143
Oid RelFileNumber
Definition relpath.h:25
#define REL_PATH_STR_MAXLEN
Definition relpath.h:96
PGDLLIMPORT const char *const forkNames[]
Definition relpath.c:33
ForkNumber
Definition relpath.h:56
@ FSM_FORKNUM
Definition relpath.h:59
@ VISIBILITYMAP_FORKNUM
Definition relpath.h:60
@ MAIN_FORKNUM
Definition relpath.h:58
@ InvalidForkNumber
Definition relpath.h:57
@ INIT_FORKNUM
Definition relpath.h:61
int forkname_chars(const char *str, ForkNumber *fork)
Definition relpath.c:81
ForkNumber forkname_to_number(const char *forkName)
Definition relpath.c:50
char * GetDatabasePath(Oid dbOid, Oid spcOid)
Definition relpath.c:110
char str[REL_PATH_STR_MAXLEN+1]
Definition relpath.h:123

◆ PROCNUMBER_CHARS

#define PROCNUMBER_CHARS   6

Definition at line 84 of file relpath.h.

◆ REL_PATH_STR_MAXLEN

#define REL_PATH_STR_MAXLEN
Value:
( \
+ sizeof((char)'/') \
+ OIDCHARS /* spcOid */ \
+ sizeof((char)'/') \
+ sizeof((char)'/') \
+ OIDCHARS /* dbOid */ \
+ sizeof((char)'/') \
+ sizeof((char)'t') /* temporary table indicator */ \
+ PROCNUMBER_CHARS /* procNumber */ \
+ sizeof((char)'_') \
+ OIDCHARS /* relNumber */ \
+ sizeof((char)'_') \
+ FORKNAMECHARS /* forkNames[forkNumber] */ \
)
#define OIDCHARS
Definition relpath.h:45
#define PG_TBLSPC_DIR
Definition relpath.h:41
#define FORKNAMECHARS
Definition relpath.h:72
#define PROCNUMBER_CHARS
Definition relpath.h:84
#define TABLESPACE_VERSION_DIRECTORY
Definition relpath.h:33

Definition at line 96 of file relpath.h.

◆ RelFileNumberIsValid

#define RelFileNumberIsValid (   relnumber)     ((bool) ((relnumber) != InvalidRelFileNumber))

Definition at line 27 of file relpath.h.

◆ relpath

#define relpath (   rlocator,
  forknum 
)     relpathbackend((rlocator).locator, (rlocator).backend, forknum)

Definition at line 150 of file relpath.h.

◆ relpathbackend

#define relpathbackend (   rlocator,
  backend,
  forknum 
)
Value:
GetRelationPath((rlocator).dbOid, (rlocator).spcOid, (rlocator).relNumber, \
backend, forknum)

Definition at line 141 of file relpath.h.

◆ relpathperm

#define relpathperm (   rlocator,
  forknum 
)     relpathbackend(rlocator, INVALID_PROC_NUMBER, forknum)

Definition at line 146 of file relpath.h.

◆ TABLESPACE_VERSION_DIRECTORY

#define TABLESPACE_VERSION_DIRECTORY
Value:

Definition at line 33 of file relpath.h.

Typedef Documentation

◆ ForkNumber

◆ RelFileNumber

Definition at line 25 of file relpath.h.

◆ RelPathStr

Enumeration Type Documentation

◆ ForkNumber

Enumerator
InvalidForkNumber 
MAIN_FORKNUM 
FSM_FORKNUM 
VISIBILITYMAP_FORKNUM 
INIT_FORKNUM 

Definition at line 55 of file relpath.h.

57{
59 MAIN_FORKNUM = 0,
63
64 /*
65 * NOTE: if you add a new fork, change MAX_FORKNUM and possibly
66 * FORKNAMECHARS below, and update the forkNames array in
67 * src/common/relpath.c
68 */

Function Documentation

◆ forkname_chars()

int forkname_chars ( const char str,
ForkNumber fork 
)
extern

Definition at line 81 of file relpath.c.

82{
83 ForkNumber forkNum;
84
85 for (forkNum = 1; forkNum <= MAX_FORKNUM; forkNum++)
86 {
87 int len = strlen(forkNames[forkNum]);
88
89 if (strncmp(forkNames[forkNum], str, len) == 0)
90 {
91 if (fork)
92 *fork = forkNum;
93 return len;
94 }
95 }
96 if (fork)
98 return 0;
99}
const void size_t len
const char *const forkNames[]
Definition relpath.c:33
#define MAX_FORKNUM
Definition relpath.h:70

References fb(), forkNames, InvalidForkNumber, len, MAX_FORKNUM, and str.

Referenced by looks_like_temp_rel_name(), and parse_filename_for_nontemp_relation().

◆ forkname_to_number()

ForkNumber forkname_to_number ( const char forkName)
extern

Definition at line 50 of file relpath.c.

51{
52 ForkNumber forkNum;
53
54 for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
55 if (strcmp(forkNames[forkNum], forkName) == 0)
56 return forkNum;
57
58#ifndef FRONTEND
61 errmsg("invalid fork name"),
62 errhint("Valid fork names are \"main\", \"fsm\", "
63 "\"vm\", and \"init\".")));
64#endif
65
66 return InvalidForkNumber;
67}
int errhint(const char *fmt,...)
Definition elog.c:1330
int errcode(int sqlerrcode)
Definition elog.c:863
int errmsg(const char *fmt,...)
Definition elog.c:1080
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150

References ereport, errcode(), errhint(), errmsg(), ERROR, fb(), forkNames, InvalidForkNumber, and MAX_FORKNUM.

Referenced by get_raw_page_fork(), get_raw_page_fork_1_9(), main(), pg_prewarm(), and pg_relation_size().

◆ GetDatabasePath()

char * GetDatabasePath ( Oid  dbOid,
Oid  spcOid 
)
extern

Definition at line 110 of file relpath.c.

111{
112 if (spcOid == GLOBALTABLESPACE_OID)
113 {
114 /* Shared system relations live in {datadir}/global */
115 Assert(dbOid == 0);
116 return pstrdup("global");
117 }
118 else if (spcOid == DEFAULTTABLESPACE_OID)
119 {
120 /* The default tablespace is {datadir}/base */
121 return psprintf("base/%u", dbOid);
122 }
123 else
124 {
125 /* All other tablespaces are accessed via symlinks */
126 return psprintf("%s/%u/%s/%u",
127 PG_TBLSPC_DIR, spcOid,
129 }
130}
#define Assert(condition)
Definition c.h:883
char * pstrdup(const char *in)
Definition mcxt.c:1781
char * psprintf(const char *fmt,...)
Definition psprintf.c:43

References Assert, fb(), PG_TBLSPC_DIR, psprintf(), pstrdup(), and TABLESPACE_VERSION_DIRECTORY.

Referenced by check_db_file_conflict(), CreateDatabaseUsingFileCopy(), CreateDatabaseUsingWalLog(), createdb(), dbase_redo(), InitPostgres(), movedb(), movedb_failure_callback(), ProcessCommittedInvalidationMessages(), relmap_redo(), remove_dbtablespaces(), and TablespaceCreateDbspace().

◆ GetRelationPath()

RelPathStr GetRelationPath ( Oid  dbOid,
Oid  spcOid,
RelFileNumber  relNumber,
int  procNumber,
ForkNumber  forkNumber 
)
extern

Definition at line 143 of file relpath.c.

145{
147
148 if (spcOid == GLOBALTABLESPACE_OID)
149 {
150 /* Shared system relations live in {datadir}/global */
151 Assert(dbOid == 0);
152 Assert(procNumber == INVALID_PROC_NUMBER);
154 sprintf(rp.str, "global/%u_%s",
155 relNumber, forkNames[forkNumber]);
156 else
157 sprintf(rp.str, "global/%u",
158 relNumber);
159 }
160 else if (spcOid == DEFAULTTABLESPACE_OID)
161 {
162 /* The default tablespace is {datadir}/base */
163 if (procNumber == INVALID_PROC_NUMBER)
164 {
166 {
167 sprintf(rp.str, "base/%u/%u_%s",
168 dbOid, relNumber,
170 }
171 else
172 sprintf(rp.str, "base/%u/%u",
173 dbOid, relNumber);
174 }
175 else
176 {
178 sprintf(rp.str, "base/%u/t%d_%u_%s",
179 dbOid, procNumber, relNumber,
181 else
182 sprintf(rp.str, "base/%u/t%d_%u",
183 dbOid, procNumber, relNumber);
184 }
185 }
186 else
187 {
188 /* All other tablespaces are accessed via symlinks */
189 if (procNumber == INVALID_PROC_NUMBER)
190 {
192 sprintf(rp.str, "%s/%u/%s/%u/%u_%s",
193 PG_TBLSPC_DIR, spcOid,
195 dbOid, relNumber,
197 else
198 sprintf(rp.str, "%s/%u/%s/%u/%u",
199 PG_TBLSPC_DIR, spcOid,
201 dbOid, relNumber);
202 }
203 else
204 {
206 sprintf(rp.str, "%s/%u/%s/%u/t%d_%u_%s",
207 PG_TBLSPC_DIR, spcOid,
209 dbOid, procNumber, relNumber,
211 else
212 sprintf(rp.str, "%s/%u/%s/%u/t%d_%u",
213 PG_TBLSPC_DIR, spcOid,
215 dbOid, procNumber, relNumber);
216 }
217 }
218
220
221 return rp;
222}
#define sprintf
Definition port.h:262
#define INVALID_PROC_NUMBER
Definition procnumber.h:26

References Assert, fb(), forkNames, INVALID_PROC_NUMBER, MAIN_FORKNUM, PG_TBLSPC_DIR, REL_PATH_STR_MAXLEN, sprintf, and TABLESPACE_VERSION_DIRECTORY.

Referenced by GetIncrementalFilePath(), and test_relpath().

Variable Documentation

◆ forkNames

PGDLLIMPORT const char* const forkNames[]
extern

Definition at line 33 of file relpath.c.

33 {
34 [MAIN_FORKNUM] = "main",
35 [FSM_FORKNUM] = "fsm",
36 [VISIBILITYMAP_FORKNUM] = "vm",
37 [INIT_FORKNUM] = "init",
38};

Referenced by dump_one_relation(), forkname_chars(), forkname_to_number(), GetRelationPath(), XLogRecGetBlockRefInfo(), and XLogRecordSaveFPWs().