diff options
author | Bruce Momjian <bruce@momjian.us> | 2001-02-23 20:38:35 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2001-02-23 20:38:35 +0000 |
commit | b25e60d8874e5a32faa43493f95027ff85fcee76 (patch) | |
tree | c0daf580a7865dae85b7aa8a5697e77f16798564 | |
parent | e74ce0a566bd0b9b9a2d48a27d1f1ac0c422a94a (diff) | |
download | postgresql-b25e60d8874e5a32faa43493f95027ff85fcee76.tar.gz postgresql-b25e60d8874e5a32faa43493f95027ff85fcee76.zip |
I had a need to read such things as the backend locale and the catalog
version number from the current database, and couldn't find any existing
program to do that.
linda:~$ pg_controldata
Log file id: 0
Log file segment: 5
Last modified: Wed Feb 7 19:35:47 2001
Database block size: 8192
Blocks per segment of large relation: 131072
Catalog version number: 200101061
LC_COLLATE: en_GB
LC_CTYPE: en_GB
Log archive directory:
Oliver Elphick Oliver.Elphick@lfix.co.uk
-rw-r--r-- | contrib/README | 4 | ||||
-rw-r--r-- | contrib/pg_controldata/Makefile | 36 | ||||
-rw-r--r-- | contrib/pg_controldata/README.pg_controldata | 19 | ||||
-rwxr-xr-x | contrib/pg_controldata/pg_controldata | bin | 0 -> 11795 bytes | |||
-rw-r--r-- | contrib/pg_controldata/pg_controldata.c | 123 | ||||
-rw-r--r-- | contrib/pg_controldata/pg_controldata.o | bin | 0 -> 8368 bytes |
6 files changed, 182 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README index 1988c068abe..79d95b2e3e1 100644 --- a/contrib/README +++ b/contrib/README @@ -85,6 +85,10 @@ oid2name - maps numeric files to table names by B Palmer <bpalmer@crimelabs.net> +pg_controldata - + Dump internal database site structures + by Oliver Elphick <olly@lfix.co.uk> + pg_dumplo - Dump large objects by Karel Zak <zakkr@zf.jcu.cz> diff --git a/contrib/pg_controldata/Makefile b/contrib/pg_controldata/Makefile new file mode 100644 index 00000000000..fde5ab1e73b --- /dev/null +++ b/contrib/pg_controldata/Makefile @@ -0,0 +1,36 @@ +# +# $Header: /cvsroot/pgsql/contrib/pg_controldata/Attic/Makefile,v 1.1 2001/02/23 20:38:35 momjian Exp $ +# + +subdir = contrib/pg_controldata +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) + +OBJS = pg_controldata.o + +all: pg_controldata + +pg_controldata: $(OBJS) $(libpq_builddir)/libpq.a + $(CC) $(CFLAGS) $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@ + +install: all installdirs + $(INSTALL_PROGRAM) pg_controldata$(X) $(bindir) + $(INSTALL_DATA) README.pg_controldata $(docdir)/contrib + +installdirs: + $(mkinstalldirs) $(bindir) $(docdir)/contrib + +uninstall: + rm -f $(bindir)/pg_controldata$(X) $(docdir)/contrib/README.pg_controldata + +clean distclean maintainer-clean: + rm -f pg_controldata$(X) $(OBJS) + +depend dep: + $(CC) -MM -MG $(CFLAGS) *.c > depend + +ifeq (depend,$(wildcard depend)) +include depend +endif diff --git a/contrib/pg_controldata/README.pg_controldata b/contrib/pg_controldata/README.pg_controldata new file mode 100644 index 00000000000..e1c4192cfea --- /dev/null +++ b/contrib/pg_controldata/README.pg_controldata @@ -0,0 +1,19 @@ +I had a need to read such things as the backend locale and the catalog +version number from the current database, and couldn't find any existing +program to do that. + +The attached utility produces this output: + +linda:~$ pg_controldata +Log file id: 0 +Log file segment: 5 +Last modified: Wed Feb 7 19:35:47 2001 +Database block size: 8192 +Blocks per segment of large relation: 131072 +Catalog version number: 200101061 +LC_COLLATE: en_GB +LC_CTYPE: en_GB +Log archive directory: + +-- +Oliver Elphick <olly@lfix.co.uk> diff --git a/contrib/pg_controldata/pg_controldata b/contrib/pg_controldata/pg_controldata Binary files differnew file mode 100755 index 00000000000..59f2e4d14d0 --- /dev/null +++ b/contrib/pg_controldata/pg_controldata diff --git a/contrib/pg_controldata/pg_controldata.c b/contrib/pg_controldata/pg_controldata.c new file mode 100644 index 00000000000..9cd148f6f48 --- /dev/null +++ b/contrib/pg_controldata/pg_controldata.c @@ -0,0 +1,123 @@ +/* pg_controldata + * + * reads the data from $PGDATA/global/pg_control + * + * copyright (c) Oliver Elphick <olly@lfix.co.uk>, 2001; + * licence: BSD + * +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + + +typedef unsigned int uint32; + +#include "config.h" +#include "access/xlogdefs.h" + +/* + * #include "access/xlog.h" + * #include "c.h" + */ + +/* The following definitions are extracted from access/xlog.h and its + * recursive includes. There is too much initialisation needed if + * they are included direct. Perhaps someone more knowledgeable can + * fix that. + */ +typedef struct crc64 +{ + uint32 crc1; + uint32 crc2; +} crc64; + +#define LOCALE_NAME_BUFLEN 128 + +typedef enum DBState +{ + DB_STARTUP = 0, + DB_SHUTDOWNED, + DB_SHUTDOWNING, + DB_IN_RECOVERY, + DB_IN_PRODUCTION +} DBState; + + +typedef struct ControlFileData +{ + crc64 crc; + uint32 logId; /* current log file id */ + uint32 logSeg; /* current log file segment (1-based) */ + struct + XLogRecPtr checkPoint; /* last check point record ptr */ + time_t time; /* time stamp of last modification */ + DBState state; /* see enum above */ + + /* + * this data is used to make sure that configuration of this DB is + * compatible with the backend executable + */ + uint32 blcksz; /* block size for this DB */ + uint32 relseg_size; /* blocks per segment of large relation */ + uint32 catalog_version_no; /* internal version number */ + /* active locales --- "C" if compiled without USE_LOCALE: */ + char lc_collate[LOCALE_NAME_BUFLEN]; + char lc_ctype[LOCALE_NAME_BUFLEN]; + + /* + * important directory locations + */ + char archdir[MAXPGPATH]; /* where to move offline log files */ +} ControlFileData; + +int main() { + ControlFileData ControlFile; + int fd; + char ControlFilePath[MAXPGPATH]; + char *DataDir; + char tmdt[32]; + + DataDir = getenv("PGDATA"); + if ( DataDir == NULL ) { + fprintf(stderr,"PGDATA is not defined\n"); + exit(1); + } + + snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir); + + if ((fd = open(ControlFilePath, O_RDONLY)) == -1) { + perror("Failed to open $PGDATA/global/pg_control for reading"); + exit(2); + } + + read(fd, &ControlFile, sizeof(ControlFileData)); + strftime(tmdt, 32, "%c", localtime(&(ControlFile.time))); + + printf("Log file id: %u\n" + "Log file segment: %u\n" + "Last modified: %s\n" + "Database block size: %u\n" + "Blocks per segment of large relation: %u\n" + "Catalog version number: %u\n" + "LC_COLLATE: %s\n" + "LC_CTYPE: %s\n" + "Log archive directory: %s\n", + ControlFile.logId, + ControlFile.logSeg, + tmdt, + ControlFile.blcksz, + ControlFile.relseg_size, + ControlFile.catalog_version_no, + ControlFile.lc_collate, + ControlFile.lc_ctype, + ControlFile.archdir); + + return (0); +} + diff --git a/contrib/pg_controldata/pg_controldata.o b/contrib/pg_controldata/pg_controldata.o Binary files differnew file mode 100644 index 00000000000..fd6b532b940 --- /dev/null +++ b/contrib/pg_controldata/pg_controldata.o |