Header And Logo

PostgreSQL
| The world's most advanced open source database.

Defines | Functions | Variables

relpath.h File Reference

#include "catalog/catversion.h"
#include "storage/relfilenode.h"
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.

Defines

#define OIDCHARS   10
#define TABLESPACE_VERSION_DIRECTORY
#define relpath(rnode, forknum)   relpathbackend((rnode).node, (rnode).backend, (forknum))
#define relpathperm(rnode, forknum)   relpathbackend((rnode), InvalidBackendId, (forknum))

Functions

int forkname_chars (const char *str, ForkNumber *fork)
char * relpathbackend (RelFileNode rnode, BackendId backend, ForkNumber forknum)

Variables

const char * forkNames []

Define Documentation

#define OIDCHARS   10
#define relpath (   rnode,
  forknum 
)    relpathbackend((rnode).node, (rnode).backend, (forknum))
#define relpathperm (   rnode,
  forknum 
)    relpathbackend((rnode), InvalidBackendId, (forknum))
#define TABLESPACE_VERSION_DIRECTORY

Function Documentation

int forkname_chars ( const char *  str,
ForkNumber fork 
)

Definition at line 51 of file relpath.c.

References forkNames.

Referenced by looks_like_temp_rel_name(), and parse_filename_for_nontemp_relation().

{
    ForkNumber  forkNum;

    for (forkNum = 1; forkNum <= MAX_FORKNUM; forkNum++)
    {
        int         len = strlen(forkNames[forkNum]);

        if (strncmp(forkNames[forkNum], str, len) == 0)
        {
            if (fork)
                *fork = forkNum;
            return len;
        }
    }
    return 0;
}

char* relpathbackend ( RelFileNode  rnode,
BackendId  backend,
ForkNumber  forknum 
)

Definition at line 75 of file relpath.c.

References Assert, RelFileNode::dbNode, DEFAULTTABLESPACE_OID, FORKNAMECHARS, forkNames, GLOBALTABLESPACE_OID, InvalidBackendId, MAIN_FORKNUM, OIDCHARS, palloc(), RelFileNode::relNode, snprintf(), RelFileNode::spcNode, and TABLESPACE_VERSION_DIRECTORY.

Referenced by calculate_relation_size(), copy_relation_data(), DropRelFileNodeAllLocalBuffers(), DropRelFileNodeLocalBuffers(), local_buffer_write_error_callback(), pg_relation_filepath(), and PrintBufferLeakWarning().

{
    int         pathlen;
    char       *path;

    if (rnode.spcNode == GLOBALTABLESPACE_OID)
    {
        /* Shared system relations live in {datadir}/global */
        Assert(rnode.dbNode == 0);
        Assert(backend == InvalidBackendId);
        pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1;
        path = (char *) palloc(pathlen);
        if (forknum != MAIN_FORKNUM)
            snprintf(path, pathlen, "global/%u_%s",
                     rnode.relNode, forkNames[forknum]);
        else
            snprintf(path, pathlen, "global/%u", rnode.relNode);
    }
    else if (rnode.spcNode == DEFAULTTABLESPACE_OID)
    {
        /* The default tablespace is {datadir}/base */
        if (backend == InvalidBackendId)
        {
            pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1;
            path = (char *) palloc(pathlen);
            if (forknum != MAIN_FORKNUM)
                snprintf(path, pathlen, "base/%u/%u_%s",
                         rnode.dbNode, rnode.relNode,
                         forkNames[forknum]);
            else
                snprintf(path, pathlen, "base/%u/%u",
                         rnode.dbNode, rnode.relNode);
        }
        else
        {
            /* OIDCHARS will suffice for an integer, too */
            pathlen = 5 + OIDCHARS + 2 + OIDCHARS + 1 + OIDCHARS + 1
                + FORKNAMECHARS + 1;
            path = (char *) palloc(pathlen);
            if (forknum != MAIN_FORKNUM)
                snprintf(path, pathlen, "base/%u/t%d_%u_%s",
                         rnode.dbNode, backend, rnode.relNode,
                         forkNames[forknum]);
            else
                snprintf(path, pathlen, "base/%u/t%d_%u",
                         rnode.dbNode, backend, rnode.relNode);
        }
    }
    else
    {
        /* All other tablespaces are accessed via symlinks */
        if (backend == InvalidBackendId)
        {
            pathlen = 9 + 1 + OIDCHARS + 1
                + strlen(TABLESPACE_VERSION_DIRECTORY) + 1 + OIDCHARS + 1
                + OIDCHARS + 1 + FORKNAMECHARS + 1;
            path = (char *) palloc(pathlen);
            if (forknum != MAIN_FORKNUM)
                snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/%u_%s",
                         rnode.spcNode, TABLESPACE_VERSION_DIRECTORY,
                         rnode.dbNode, rnode.relNode,
                         forkNames[forknum]);
            else
                snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/%u",
                         rnode.spcNode, TABLESPACE_VERSION_DIRECTORY,
                         rnode.dbNode, rnode.relNode);
        }
        else
        {
            /* OIDCHARS will suffice for an integer, too */
            pathlen = 9 + 1 + OIDCHARS + 1
                + strlen(TABLESPACE_VERSION_DIRECTORY) + 1 + OIDCHARS + 2
                + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1;
            path = (char *) palloc(pathlen);
            if (forknum != MAIN_FORKNUM)
                snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/t%d_%u_%s",
                         rnode.spcNode, TABLESPACE_VERSION_DIRECTORY,
                         rnode.dbNode, backend, rnode.relNode,
                         forkNames[forknum]);
            else
                snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/t%d_%u",
                         rnode.spcNode, TABLESPACE_VERSION_DIRECTORY,
                         rnode.dbNode, backend, rnode.relNode);
        }
    }
    return path;
}


Variable Documentation

const char* forkNames[]