#include "datapagemap.h"
#include "filemap.h"
-#include "util.h"
#include "pg_rewind.h"
#include "catalog/pg_tablespace.h"
#include "storage/fd.h"
filemap_t *filemap = NULL;
static bool isRelDataFile(const char *path);
+static char *datasegpath(RelFileNode rnode, ForkNumber forknum,
+ BlockNumber segno);
static int path_cmp(const void *a, const void *b);
static int final_filemap_cmp(const void *a, const void *b);
static void filemap_list_to_array(void);
isRelDataFile(const char *path)
{
char buf[20 + 1];
- Oid spcNode;
- Oid dbNode;
- Oid relNode;
+ RelFileNode rnode;
unsigned int segNo;
int nmatch;
bool matched;
* And the relation data files themselves have a filename like:
*
* <oid>.<segment number>
- *
*/
- spcNode = InvalidOid;
- dbNode = InvalidOid;
- relNode = InvalidOid;
+ rnode.spcNode = InvalidOid;
+ rnode.dbNode = InvalidOid;
+ rnode.relNode = InvalidOid;
segNo = 0;
matched = false;
- nmatch = sscanf(path, "global/%u.%u", &relNode, &segNo);
+ nmatch = sscanf(path, "global/%u.%u", &rnode.relNode, &segNo);
if (nmatch == 1 || nmatch == 2)
{
- spcNode = GLOBALTABLESPACE_OID;
- dbNode = 0;
+ rnode.spcNode = GLOBALTABLESPACE_OID;
+ rnode.dbNode = 0;
matched = true;
}
else
{
- nmatch = sscanf(path, "base/%u/%u.%u", &dbNode, &relNode, &segNo);
+ nmatch = sscanf(path, "base/%u/%u.%u",
+ &rnode.dbNode, &rnode.relNode, &segNo);
if (nmatch == 2 || nmatch == 3)
{
- spcNode = DEFAULTTABLESPACE_OID;
+ rnode.spcNode = DEFAULTTABLESPACE_OID;
matched = true;
}
else
{
nmatch = sscanf(path, "pg_tblspc/%u/PG_%20s/%u/%u.%u",
- &spcNode, buf, &dbNode, &relNode, &segNo);
+ &rnode.spcNode, buf, &rnode.dbNode, &rnode.relNode,
+ &segNo);
if (nmatch == 4 || nmatch == 5)
matched = true;
}
*/
if (matched)
{
- char *check_path;
- char *check_path_with_seg;
-
- check_path = GetRelationPath(dbNode, spcNode, relNode, InvalidBackendId,
- MAIN_FORKNUM);
- if (segNo != 0)
- {
- check_path_with_seg = psprintf("%s.%u", check_path, segNo);
- pfree(check_path);
- }
- else
- check_path_with_seg = check_path;
+ char *check_path = datasegpath(rnode, MAIN_FORKNUM, segNo);
- if (strcmp(check_path_with_seg, path) != 0)
+ if (strcmp(check_path, path) != 0)
matched = false;
+
+ pfree(check_path);
}
return matched;
}
+/*
+ * A helper function to create the path of a relation file and segment.
+ *
+ * The returned path is palloc'd
+ */
+static char *
+datasegpath(RelFileNode rnode, ForkNumber forknum, BlockNumber segno)
+{
+ char *path = relpathperm(rnode, forknum);
+
+ if (segno > 0)
+ {
+ char *segpath = psprintf("%s.%u", path, segno);
+ pfree(path);
+ return segpath;
+ }
+ else
+ return path;
+}
+
static int
path_cmp(const void *a, const void *b)
{
+++ /dev/null
-/*-------------------------------------------------------------------------
- *
- * util.c
- * Misc utility functions
- *
- * Copyright (c) 2013-2015, PostgreSQL Global Development Group
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres_fe.h"
-
-#include "common/relpath.h"
-#include "catalog/catalog.h"
-#include "catalog/pg_tablespace.h"
-
-#include "pg_rewind.h"
-
-char *
-datasegpath(RelFileNode rnode, ForkNumber forknum, BlockNumber segno)
-{
- char *path = relpathperm(rnode, forknum);
-
- if (segno > 0)
- {
- char *segpath = pg_malloc(strlen(path) + 13);
- sprintf(segpath, "%s.%u", path, segno);
- pg_free(path);
- return segpath;
- }
- else
- return path;
-}