diff options
author | Bruce Momjian | 2005-07-29 14:47:04 +0000 |
---|---|---|
committer | Bruce Momjian | 2005-07-29 14:47:04 +0000 |
commit | 358a897fa1d7ff49c350f2cb7a0372c0f67dfb88 (patch) | |
tree | 3430a9317a4bbe48d2ac93b8c786694e7c13f3a6 /contrib/dbsize/dbsize.c | |
parent | b05801c828e74bd5d03183cd970edcd11d62c347 (diff) |
Move dbsize functions into the backend. New functions:
pg_tablespace_size
pg_database_size
pg_relation_size
pg_complete_relation_size
pg_size_pretty
Remove /contrib/dbsize.
Dave Page
Diffstat (limited to 'contrib/dbsize/dbsize.c')
-rw-r--r-- | contrib/dbsize/dbsize.c | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/contrib/dbsize/dbsize.c b/contrib/dbsize/dbsize.c deleted file mode 100644 index ac5e4c74ea8..00000000000 --- a/contrib/dbsize/dbsize.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - * dbsize.c - * object size functions - * - * Copyright (c) 2002-2005, PostgreSQL Global Development Group - * - * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/dbsize/dbsize.c,v 1.19 2005/07/04 04:51:43 tgl Exp $ - * - */ - -#include "postgres.h" - -#include <sys/types.h> -#include <sys/stat.h> - -#include "access/heapam.h" -#include "catalog/namespace.h" -#include "catalog/pg_tablespace.h" -#include "commands/dbcommands.h" -#include "miscadmin.h" -#include "storage/fd.h" -#include "utils/builtins.h" -#include "utils/syscache.h" - - -Datum pg_tablespace_size(PG_FUNCTION_ARGS); -Datum pg_database_size(PG_FUNCTION_ARGS); -Datum pg_relation_size(PG_FUNCTION_ARGS); -Datum pg_size_pretty(PG_FUNCTION_ARGS); - -Datum database_size(PG_FUNCTION_ARGS); -Datum relation_size(PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tablespace_size); -PG_FUNCTION_INFO_V1(pg_database_size); -PG_FUNCTION_INFO_V1(pg_relation_size); -PG_FUNCTION_INFO_V1(pg_size_pretty); - -PG_FUNCTION_INFO_V1(database_size); -PG_FUNCTION_INFO_V1(relation_size); - - -/* Return physical size of directory contents, or 0 if dir doesn't exist */ -static int64 -db_dir_size(const char *path) -{ - int64 dirsize = 0; - struct dirent *direntry; - DIR *dirdesc; - char filename[MAXPGPATH]; - - dirdesc = AllocateDir(path); - - if (!dirdesc) - return 0; - - while ((direntry = ReadDir(dirdesc, path)) != NULL) - { - struct stat fst; - - if (strcmp(direntry->d_name, ".") == 0 || - strcmp(direntry->d_name, "..") == 0) - continue; - - snprintf(filename, MAXPGPATH, "%s/%s", path, direntry->d_name); - - if (stat(filename, &fst) < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat \"%s\": %m", filename))); - dirsize += fst.st_size; - } - - FreeDir(dirdesc); - return dirsize; -} - - -static int64 -calculate_database_size(Oid dbOid) -{ - int64 totalsize = 0; - DIR *dirdesc; - struct dirent *direntry; - char pathname[MAXPGPATH]; - - /* Shared storage in pg_global is not counted */ - - /* Include pg_default storage */ - snprintf(pathname, MAXPGPATH, "base/%u", dbOid); - totalsize += db_dir_size(pathname); - - /* Scan the non-default tablespaces */ - snprintf(pathname, MAXPGPATH, "pg_tblspc"); - dirdesc = AllocateDir(pathname); - - while ((direntry = ReadDir(dirdesc, pathname)) != NULL) - { - if (strcmp(direntry->d_name, ".") == 0 || - strcmp(direntry->d_name, "..") == 0) - continue; - - snprintf(pathname, MAXPGPATH, "pg_tblspc/%s/%u", - direntry->d_name, dbOid); - totalsize += db_dir_size(pathname); - } - - FreeDir(dirdesc); - - /* Complain if we found no trace of the DB at all */ - if (!totalsize) - ereport(ERROR, - (ERRCODE_UNDEFINED_DATABASE, - errmsg("database with OID %u does not exist", dbOid))); - - return totalsize; -} - -/* - * calculate total size of tablespace - */ -Datum -pg_tablespace_size(PG_FUNCTION_ARGS) -{ - Oid tblspcOid = PG_GETARG_OID(0); - char tblspcPath[MAXPGPATH]; - char pathname[MAXPGPATH]; - int64 totalsize=0; - DIR *dirdesc; - struct dirent *direntry; - - if (tblspcOid == DEFAULTTABLESPACE_OID) - snprintf(tblspcPath, MAXPGPATH, "base"); - else if (tblspcOid == GLOBALTABLESPACE_OID) - snprintf(tblspcPath, MAXPGPATH, "global"); - else - snprintf(tblspcPath, MAXPGPATH, "pg_tblspc/%u", tblspcOid); - - dirdesc = AllocateDir(tblspcPath); - - while ((direntry = ReadDir(dirdesc, tblspcPath)) != NULL) - { - struct stat fst; - - if (strcmp(direntry->d_name, ".") == 0 || - strcmp(direntry->d_name, "..") == 0) - continue; - - snprintf(pathname, MAXPGPATH, "%s/%s", tblspcPath, direntry->d_name); - - if (stat(pathname, &fst) < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat \"%s\": %m", pathname))); - totalsize += fst.st_size; - - if (fst.st_mode & S_IFDIR) - totalsize += db_dir_size(pathname); - } - - FreeDir(dirdesc); - - PG_RETURN_INT64(totalsize); -} - - -/* - * calculate size of database in all tablespaces - */ -Datum -pg_database_size(PG_FUNCTION_ARGS) -{ - Oid dbOid = PG_GETARG_OID(0); - - PG_RETURN_INT64(calculate_database_size(dbOid)); -} - -Datum -database_size(PG_FUNCTION_ARGS) -{ - Name dbName = PG_GETARG_NAME(0); - Oid dbOid = get_database_oid(NameStr(*dbName)); - - if (!OidIsValid(dbOid)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("database \"%s\" does not exist", - NameStr(*dbName)))); - - PG_RETURN_INT64(calculate_database_size(dbOid)); -} - - -/* Calculate relation size given tablespace and relation OIDs */ -static int64 -calculate_relation_size(Oid tblspcOid, Oid relnodeOid) -{ - int64 totalsize=0; - unsigned int segcount=0; - char dirpath[MAXPGPATH]; - char pathname[MAXPGPATH]; - - if (!tblspcOid) - tblspcOid = MyDatabaseTableSpace; - - if (tblspcOid == DEFAULTTABLESPACE_OID) - snprintf(dirpath, MAXPGPATH, "base/%u", MyDatabaseId); - else if (tblspcOid == GLOBALTABLESPACE_OID) - snprintf(dirpath, MAXPGPATH, "global"); - else - snprintf(dirpath, MAXPGPATH, "pg_tblspc/%u/%u", - tblspcOid, MyDatabaseId); - - for (segcount = 0 ;; segcount++) - { - struct stat fst; - - if (segcount == 0) - snprintf(pathname, MAXPGPATH, "%s/%u", - dirpath, relnodeOid); - else - snprintf(pathname, MAXPGPATH, "%s/%u.%u", - dirpath, relnodeOid, segcount); - - if (stat(pathname, &fst) < 0) - { - if (errno == ENOENT) - break; - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat \"%s\": %m", pathname))); - } - totalsize += fst.st_size; - } - - return totalsize; -} - -/* - * calculate size of relation - */ -Datum -pg_relation_size(PG_FUNCTION_ARGS) -{ - Oid relOid=PG_GETARG_OID(0); - HeapTuple tuple; - Form_pg_class pg_class; - Oid relnodeOid; - Oid tblspcOid; - - tuple = SearchSysCache(RELOID, - ObjectIdGetDatum(relOid), - 0, 0, 0); - if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (ERRCODE_UNDEFINED_TABLE, - errmsg("relation with OID %u does not exist", relOid))); - - pg_class = (Form_pg_class) GETSTRUCT(tuple); - relnodeOid = pg_class->relfilenode; - tblspcOid = pg_class->reltablespace; - - ReleaseSysCache(tuple); - - PG_RETURN_INT64(calculate_relation_size(tblspcOid, relnodeOid)); -} - -Datum -relation_size(PG_FUNCTION_ARGS) -{ - text *relname = PG_GETARG_TEXT_P(0); - RangeVar *relrv; - Relation relation; - Oid relnodeOid; - Oid tblspcOid; - - relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); - relation = relation_openrv(relrv, AccessShareLock); - - tblspcOid = relation->rd_rel->reltablespace; - relnodeOid = relation->rd_rel->relfilenode; - - relation_close(relation, AccessShareLock); - - PG_RETURN_INT64(calculate_relation_size(tblspcOid, relnodeOid)); -} - -/* - * formatting with size units - */ -Datum -pg_size_pretty(PG_FUNCTION_ARGS) -{ - int64 size=PG_GETARG_INT64(0); - char *result=palloc(50+VARHDRSZ); - int64 limit = 10*1024; - int64 mult=1; - - if (size < limit*mult) - snprintf(VARDATA(result), 50, INT64_FORMAT" bytes", - size); - else - { - mult *= 1024; - if (size < limit*mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " kB", - (size+mult/2) / mult); - else - { - mult *= 1024; - if (size < limit*mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " MB", - (size+mult/2) / mult); - else - { - mult *= 1024; - if (size < limit*mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " GB", - (size+mult/2) / mult); - else - { - mult *= 1024; - snprintf(VARDATA(result), 50, INT64_FORMAT " TB", - (size+mult/2) / mult); - } - } - } - } - - VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ; - - PG_RETURN_TEXT_P(result); -} |