PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
relpath.c File Reference
#include "postgres.h"
#include "catalog/pg_tablespace_d.h"
#include "common/relpath.h"
#include "storage/procnumber.h"
Include dependency graph for relpath.c:

Go to the source code of this file.

Functions

 StaticAssertDecl (lengthof(forkNames)==(MAX_FORKNUM+1), "array length mismatch")
 
ForkNumber forkname_to_number (const char *forkName)
 
int forkname_chars (const char *str, ForkNumber *fork)
 
char * GetDatabasePath (Oid dbOid, Oid spcOid)
 
RelPathStr GetRelationPath (Oid dbOid, Oid spcOid, RelFileNumber relNumber, int procNumber, ForkNumber forkNumber)
 

Variables

const char *const forkNames []
 

Function Documentation

◆ forkname_chars()

int forkname_chars ( const char *  str,
ForkNumber fork 
)

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)
97 *fork = InvalidForkNumber;
98 return 0;
99}
const char * str
const void size_t len
const char *const forkNames[]
Definition: relpath.c:33
ForkNumber
Definition: relpath.h:56
@ InvalidForkNumber
Definition: relpath.h:57
#define MAX_FORKNUM
Definition: relpath.h:70

References 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)

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
60 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
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:1318
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149

References ereport, errcode(), errhint(), errmsg(), ERROR, 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 
)

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}
Assert(PointerIsAligned(start, uint64))
char * pstrdup(const char *in)
Definition: mcxt.c:2322
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
#define PG_TBLSPC_DIR
Definition: relpath.h:41
#define TABLESPACE_VERSION_DIRECTORY
Definition: relpath.h:33

References Assert(), 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 
)

Definition at line 143 of file relpath.c.

145{
146 RelPathStr rp;
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);
153 if (forkNumber != MAIN_FORKNUM)
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 {
165 if (forkNumber != MAIN_FORKNUM)
166 {
167 sprintf(rp.str, "base/%u/%u_%s",
168 dbOid, relNumber,
169 forkNames[forkNumber]);
170 }
171 else
172 sprintf(rp.str, "base/%u/%u",
173 dbOid, relNumber);
174 }
175 else
176 {
177 if (forkNumber != MAIN_FORKNUM)
178 sprintf(rp.str, "base/%u/t%d_%u_%s",
179 dbOid, procNumber, relNumber,
180 forkNames[forkNumber]);
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 {
191 if (forkNumber != MAIN_FORKNUM)
192 sprintf(rp.str, "%s/%u/%s/%u/%u_%s",
193 PG_TBLSPC_DIR, spcOid,
195 dbOid, relNumber,
196 forkNames[forkNumber]);
197 else
198 sprintf(rp.str, "%s/%u/%s/%u/%u",
199 PG_TBLSPC_DIR, spcOid,
201 dbOid, relNumber);
202 }
203 else
204 {
205 if (forkNumber != MAIN_FORKNUM)
206 sprintf(rp.str, "%s/%u/%s/%u/t%d_%u_%s",
207 PG_TBLSPC_DIR, spcOid,
209 dbOid, procNumber, relNumber,
210 forkNames[forkNumber]);
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:241
size_t strnlen(const char *str, size_t maxlen)
Definition: strnlen.c:26
#define INVALID_PROC_NUMBER
Definition: procnumber.h:26
#define REL_PATH_STR_MAXLEN
Definition: relpath.h:96
@ MAIN_FORKNUM
Definition: relpath.h:58
char str[REL_PATH_STR_MAXLEN+1]
Definition: relpath.h:123

References Assert(), forkNames, INVALID_PROC_NUMBER, MAIN_FORKNUM, PG_TBLSPC_DIR, REL_PATH_STR_MAXLEN, sprintf, RelPathStr::str, strnlen(), and TABLESPACE_VERSION_DIRECTORY.

Referenced by GetIncrementalFilePath(), and test_relpath().

◆ StaticAssertDecl()

StaticAssertDecl ( lengthof(forkNames = =(MAX_FORKNUM+1),
"array length mismatch"   
)

Variable Documentation

◆ forkNames

const char* const forkNames[]
Initial value:
= {
[MAIN_FORKNUM] = "main",
[FSM_FORKNUM] = "fsm",
[INIT_FORKNUM] = "init",
}
@ FSM_FORKNUM
Definition: relpath.h:59
@ VISIBILITYMAP_FORKNUM
Definition: relpath.h:60
@ INIT_FORKNUM
Definition: relpath.h:61

Definition at line 33 of file relpath.c.

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