diff options
Diffstat (limited to 'src/backend/utils/adt/dbsize.c')
-rw-r--r-- | src/backend/utils/adt/dbsize.c | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index e85d11c3834..d225b3e7c75 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -5,7 +5,7 @@ * Copyright (c) 2002-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.20 2008/08/11 11:05:11 heikki Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.21 2008/10/03 07:33:09 heikki Exp $ * */ @@ -248,15 +248,14 @@ pg_tablespace_size_name(PG_FUNCTION_ARGS) * calculate size of a relation */ static int64 -calculate_relation_size(RelFileNode *rfn) +calculate_relation_size(RelFileNode *rfn, ForkNumber forknum) { int64 totalsize = 0; char *relationpath; char pathname[MAXPGPATH]; unsigned int segcount = 0; - /* XXX: This ignores the other forks. */ - relationpath = relpath(*rfn, MAIN_FORKNUM); + relationpath = relpath(*rfn, forknum); for (segcount = 0;; segcount++) { @@ -284,34 +283,47 @@ calculate_relation_size(RelFileNode *rfn) return totalsize; } -Datum -pg_relation_size_oid(PG_FUNCTION_ARGS) -{ - Oid relOid = PG_GETARG_OID(0); - Relation rel; - int64 size; - rel = relation_open(relOid, AccessShareLock); +/* + * XXX: Consider making this global and moving elsewhere. But currently + * there's no other users for this. + * + * Remember to also update the errhint below if you add entries, and the + * documentation for pg_relation_size(). + */ +static char *forkNames[] = { + "main", /* MAIN_FORKNUM */ + "fsm" /* FSM_FORKNUM */ +}; - size = calculate_relation_size(&(rel->rd_node)); +static ForkNumber +forkname_to_number(char *forkName) +{ + ForkNumber forkNum; - relation_close(rel, AccessShareLock); + for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++) + if (strcmp(forkNames[forkNum], forkName) == 0) + return forkNum; - PG_RETURN_INT64(size); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid fork name"), + errhint("Valid fork names are 'main' and 'fsm'"))); + return InvalidForkNumber; /* keep compiler quiet */ } Datum -pg_relation_size_name(PG_FUNCTION_ARGS) +pg_relation_size(PG_FUNCTION_ARGS) { - text *relname = PG_GETARG_TEXT_P(0); - RangeVar *relrv; + Oid relOid = PG_GETARG_OID(0); + text *forkName = PG_GETARG_TEXT_P(1); Relation rel; int64 size; - relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); - rel = relation_openrv(relrv, AccessShareLock); + rel = relation_open(relOid, AccessShareLock); - size = calculate_relation_size(&(rel->rd_node)); + size = calculate_relation_size(&(rel->rd_node), + forkname_to_number(text_to_cstring(forkName))); relation_close(rel, AccessShareLock); @@ -330,12 +342,15 @@ calculate_total_relation_size(Oid Relid) Oid toastOid; int64 size; ListCell *cell; + ForkNumber forkNum; heapRel = relation_open(Relid, AccessShareLock); toastOid = heapRel->rd_rel->reltoastrelid; /* Get the heap size */ - size = calculate_relation_size(&(heapRel->rd_node)); + size = 0; + for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++) + size += calculate_relation_size(&(heapRel->rd_node), forkNum); /* Include any dependent indexes */ if (heapRel->rd_rel->relhasindex) @@ -349,7 +364,8 @@ calculate_total_relation_size(Oid Relid) iRel = relation_open(idxOid, AccessShareLock); - size += calculate_relation_size(&(iRel->rd_node)); + for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++) + size += calculate_relation_size(&(iRel->rd_node), forkNum); relation_close(iRel, AccessShareLock); } @@ -367,26 +383,13 @@ calculate_total_relation_size(Oid Relid) } Datum -pg_total_relation_size_oid(PG_FUNCTION_ARGS) +pg_total_relation_size(PG_FUNCTION_ARGS) { Oid relid = PG_GETARG_OID(0); PG_RETURN_INT64(calculate_total_relation_size(relid)); } -Datum -pg_total_relation_size_name(PG_FUNCTION_ARGS) -{ - text *relname = PG_GETARG_TEXT_P(0); - RangeVar *relrv; - Oid relid; - - relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); - relid = RangeVarGetRelid(relrv, false); - - PG_RETURN_INT64(calculate_total_relation_size(relid)); -} - /* * formatting with size units */ |