149 lines
3.2 KiB
C
149 lines
3.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* catalog.c
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.44 2001/11/16 23:30:35 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "access/transam.h"
|
|
#include "catalog/catalog.h"
|
|
#include "catalog/catname.h"
|
|
#include "catalog/pg_type.h"
|
|
#include "miscadmin.h"
|
|
#include "utils/lsyscache.h"
|
|
|
|
/*
|
|
* relpath - construct path to a relation's file
|
|
*
|
|
* Result is a palloc'd string.
|
|
*/
|
|
|
|
char *
|
|
relpath(RelFileNode rnode)
|
|
{
|
|
char *path;
|
|
|
|
if (rnode.tblNode == (Oid) 0) /* "global tablespace" */
|
|
{
|
|
/* Shared system relations live in {datadir}/global */
|
|
path = (char *) palloc(strlen(DataDir) + 8 + sizeof(NameData) + 1);
|
|
sprintf(path, "%s/global/%u", DataDir, rnode.relNode);
|
|
}
|
|
else
|
|
{
|
|
path = (char *) palloc(strlen(DataDir) + 6 + 2 * sizeof(NameData) + 3);
|
|
sprintf(path, "%s/base/%u/%u", DataDir, rnode.tblNode, rnode.relNode);
|
|
}
|
|
return path;
|
|
}
|
|
|
|
/*
|
|
* GetDatabasePath - construct path to a database dir
|
|
*
|
|
* Result is a palloc'd string.
|
|
*/
|
|
|
|
char *
|
|
GetDatabasePath(Oid tblNode)
|
|
{
|
|
char *path;
|
|
|
|
if (tblNode == (Oid) 0) /* "global tablespace" */
|
|
{
|
|
/* Shared system relations live in {datadir}/global */
|
|
path = (char *) palloc(strlen(DataDir) + 8);
|
|
sprintf(path, "%s/global", DataDir);
|
|
}
|
|
else
|
|
{
|
|
path = (char *) palloc(strlen(DataDir) + 6 + sizeof(NameData) + 1);
|
|
sprintf(path, "%s/base/%u", DataDir, tblNode);
|
|
}
|
|
return path;
|
|
}
|
|
|
|
|
|
/*
|
|
* IsSystemRelationName
|
|
* True iff name is the name of a system catalog relation.
|
|
*
|
|
* NB: TOAST relations are considered system relations by this test.
|
|
* This is appropriate in many places but not all. Where it's not,
|
|
* also check IsToastRelationName.
|
|
*
|
|
* We now make a new requirement where system catalog relns must begin
|
|
* with pg_ while user relns are forbidden to do so. Make the test
|
|
* trivial and instantaneous.
|
|
*
|
|
* XXX this is way bogus. -- pma
|
|
*/
|
|
bool
|
|
IsSystemRelationName(const char *relname)
|
|
{
|
|
/* ugly coding for speed */
|
|
return (relname[0] == 'p' &&
|
|
relname[1] == 'g' &&
|
|
relname[2] == '_');
|
|
}
|
|
|
|
/*
|
|
* IsToastRelationName
|
|
* True iff name is the name of a TOAST support relation (or index).
|
|
*/
|
|
bool
|
|
IsToastRelationName(const char *relname)
|
|
{
|
|
return strncmp(relname, "pg_toast_", 9) == 0;
|
|
}
|
|
|
|
/*
|
|
* IsSharedSystemRelationName
|
|
* True iff name is the name of a shared system catalog relation.
|
|
*/
|
|
bool
|
|
IsSharedSystemRelationName(const char *relname)
|
|
{
|
|
int i;
|
|
|
|
/*
|
|
* Quick out: if it's not a system relation, it can't be a shared
|
|
* system relation.
|
|
*/
|
|
if (!IsSystemRelationName(relname))
|
|
return FALSE;
|
|
|
|
i = 0;
|
|
while (SharedSystemRelationNames[i] != NULL)
|
|
{
|
|
if (strcmp(SharedSystemRelationNames[i], relname) == 0)
|
|
return TRUE;
|
|
i++;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* newoid - returns a unique identifier across all catalogs.
|
|
*
|
|
* Object Id allocation is now done by GetNewObjectID in
|
|
* access/transam/varsup.
|
|
*
|
|
* This code probably needs to change to generate OIDs separately
|
|
* for each table.
|
|
*/
|
|
Oid
|
|
newoid(void)
|
|
{
|
|
return GetNewObjectId();
|
|
}
|