mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Move pg_controldata from /contrib to src/bin.
This commit is contained in:
@ -1,32 +0,0 @@
|
||||
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 output like this:
|
||||
|
||||
$ pg_controldata
|
||||
pg_control version number: 71
|
||||
Catalog version number: 200101061
|
||||
Database state: IN_PRODUCTION
|
||||
pg_control last modified: Sat Mar 10 00:07:55 2001
|
||||
Current log file id: 0
|
||||
Next log file segment: 9
|
||||
Latest checkpoint location: 0/88CAA20
|
||||
Prior checkpoint location: 0/70A5D48
|
||||
Latest checkpoint's REDO location: 0/88CAA20
|
||||
Latest checkpoint's UNDO location: 0/0
|
||||
Latest checkpoint's StartUpID: 22
|
||||
Latest checkpoint's NextXID: 4711
|
||||
Latest checkpoint's NextOID: 444704
|
||||
Time of latest checkpoint: Sat Mar 10 00:07:52 2001
|
||||
Database block size: 8192
|
||||
Blocks per segment of large relation: 131072
|
||||
LC_COLLATE: C
|
||||
LC_CTYPE: C
|
||||
|
||||
|
||||
To access the pg_control file, the program must be run as the Postgres user,
|
||||
and PGDATA must be set correctly in its environment.
|
||||
|
||||
--
|
||||
Oliver Elphick <olly@lfix.co.uk>
|
@ -1,147 +0,0 @@
|
||||
/*
|
||||
* pg_controldata
|
||||
*
|
||||
* reads the data from $PGDATA/global/pg_control
|
||||
*
|
||||
* copyright (c) Oliver Elphick <olly@lfix.co.uk>, 2001;
|
||||
* licence: BSD
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/contrib/pg_controldata/Attic/pg_controldata.c,v 1.7 2002/08/14 03:01:43 momjian Exp $
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "catalog/pg_control.h"
|
||||
|
||||
|
||||
static const char *
|
||||
dbState(DBState state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case DB_STARTUP:
|
||||
return "STARTUP";
|
||||
case DB_SHUTDOWNED:
|
||||
return "SHUTDOWNED";
|
||||
case DB_SHUTDOWNING:
|
||||
return "SHUTDOWNING";
|
||||
case DB_IN_RECOVERY:
|
||||
return "IN_RECOVERY";
|
||||
case DB_IN_PRODUCTION:
|
||||
return "IN_PRODUCTION";
|
||||
}
|
||||
return "unrecognized status code";
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
ControlFileData ControlFile;
|
||||
int fd;
|
||||
char ControlFilePath[MAXPGPATH];
|
||||
char *DataDir;
|
||||
crc64 crc;
|
||||
char pgctime_str[32];
|
||||
char ckpttime_str[32];
|
||||
|
||||
if (argc > 1)
|
||||
DataDir = argv[1];
|
||||
else
|
||||
DataDir = getenv("PGDATA");
|
||||
if (DataDir == NULL)
|
||||
{
|
||||
fprintf(stderr, "no data directory specified\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);
|
||||
}
|
||||
|
||||
if (read(fd, &ControlFile, sizeof(ControlFileData)) != sizeof(ControlFileData))
|
||||
{
|
||||
perror("Failed to read $PGDATA/global/pg_control");
|
||||
exit(2);
|
||||
}
|
||||
close(fd);
|
||||
|
||||
/* Check the CRC. */
|
||||
INIT_CRC64(crc);
|
||||
COMP_CRC64(crc,
|
||||
(char *) &ControlFile + sizeof(crc64),
|
||||
sizeof(ControlFileData) - sizeof(crc64));
|
||||
FIN_CRC64(crc);
|
||||
|
||||
if (!EQ_CRC64(crc, ControlFile.crc))
|
||||
printf("WARNING: Calculated CRC checksum does not match value stored in file.\n"
|
||||
"Either the file is corrupt, or it has a different layout than this program\n"
|
||||
"is expecting. The results below are untrustworthy.\n\n");
|
||||
|
||||
strftime(pgctime_str, 32, "%c",
|
||||
localtime(&(ControlFile.time)));
|
||||
strftime(ckpttime_str, 32, "%c",
|
||||
localtime(&(ControlFile.checkPointCopy.time)));
|
||||
|
||||
printf("pg_control version number: %u\n"
|
||||
"Catalog version number: %u\n"
|
||||
"Database state: %s\n"
|
||||
"pg_control last modified: %s\n"
|
||||
"Current log file id: %u\n"
|
||||
"Next log file segment: %u\n"
|
||||
"Latest checkpoint location: %X/%X\n"
|
||||
"Prior checkpoint location: %X/%X\n"
|
||||
"Latest checkpoint's REDO location: %X/%X\n"
|
||||
"Latest checkpoint's UNDO location: %X/%X\n"
|
||||
"Latest checkpoint's StartUpID: %u\n"
|
||||
"Latest checkpoint's NextXID: %u\n"
|
||||
"Latest checkpoint's NextOID: %u\n"
|
||||
"Time of latest checkpoint: %s\n"
|
||||
"Database block size: %u\n"
|
||||
"Blocks per segment of large relation: %u\n"
|
||||
"Maximum length of names: %u\n"
|
||||
"Maximum number of function arguments: %u\n"
|
||||
"Date/time type storage: %s\n"
|
||||
"Maximum length of locale name: %u\n"
|
||||
"LC_COLLATE: %s\n"
|
||||
"LC_CTYPE: %s\n",
|
||||
|
||||
ControlFile.pg_control_version,
|
||||
ControlFile.catalog_version_no,
|
||||
dbState(ControlFile.state),
|
||||
pgctime_str,
|
||||
ControlFile.logId,
|
||||
ControlFile.logSeg,
|
||||
ControlFile.checkPoint.xlogid,
|
||||
ControlFile.checkPoint.xrecoff,
|
||||
ControlFile.prevCheckPoint.xlogid,
|
||||
ControlFile.prevCheckPoint.xrecoff,
|
||||
ControlFile.checkPointCopy.redo.xlogid,
|
||||
ControlFile.checkPointCopy.redo.xrecoff,
|
||||
ControlFile.checkPointCopy.undo.xlogid,
|
||||
ControlFile.checkPointCopy.undo.xrecoff,
|
||||
ControlFile.checkPointCopy.ThisStartUpID,
|
||||
ControlFile.checkPointCopy.nextXid,
|
||||
ControlFile.checkPointCopy.nextOid,
|
||||
ckpttime_str,
|
||||
ControlFile.blcksz,
|
||||
ControlFile.relseg_size,
|
||||
ControlFile.nameDataLen,
|
||||
ControlFile.funcMaxArgs,
|
||||
(ControlFile.enableIntTimes ?
|
||||
"64-bit integers" : "Floating point"),
|
||||
ControlFile.localeBuflen,
|
||||
ControlFile.lc_collate,
|
||||
ControlFile.lc_ctype);
|
||||
|
||||
return (0);
|
||||
}
|
Reference in New Issue
Block a user