From b25e60d8874e5a32faa43493f95027ff85fcee76 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 23 Feb 2001 20:38:35 +0000 Subject: [PATCH] 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 --- contrib/README | 4 + contrib/pg_controldata/Makefile | 36 ++++++ contrib/pg_controldata/README.pg_controldata | 19 +++ contrib/pg_controldata/pg_controldata | Bin 0 -> 11795 bytes contrib/pg_controldata/pg_controldata.c | 123 +++++++++++++++++++ contrib/pg_controldata/pg_controldata.o | Bin 0 -> 8368 bytes 6 files changed, 182 insertions(+) create mode 100644 contrib/pg_controldata/Makefile create mode 100644 contrib/pg_controldata/README.pg_controldata create mode 100755 contrib/pg_controldata/pg_controldata create mode 100644 contrib/pg_controldata/pg_controldata.c create mode 100644 contrib/pg_controldata/pg_controldata.o 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 +pg_controldata - + Dump internal database site structures + by Oliver Elphick + pg_dumplo - Dump large objects by Karel Zak 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 diff --git a/contrib/pg_controldata/pg_controldata b/contrib/pg_controldata/pg_controldata new file mode 100755 index 0000000000000000000000000000000000000000..59f2e4d14d0b877646722b816dbfb54fd0d1815a GIT binary patch literal 11795 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 NG5WG2_%n, 2001; + * licence: BSD + * +*/ + +#include +#include +#include +#include +#include +#include +#include + + +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 new file mode 100644 index 0000000000000000000000000000000000000000..fd6b532b940f4cd363d9733eb1aac48e0702a0b5 GIT binary patch literal 8368 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 literal 0 Hc-jL100001 -- 2.39.5