postgresql/src/backend/catalog/catalog.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();
}