diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/version.c | 3 | ||||
-rw-r--r-- | src/backend/utils/init/miscinit.c | 51 | ||||
-rw-r--r-- | src/backend/utils/init/postinit.c | 11 |
3 files changed, 54 insertions, 11 deletions
diff --git a/src/backend/utils/adt/version.c b/src/backend/utils/adt/version.c index 2d4dd5cf273..4914acc8e35 100644 --- a/src/backend/utils/adt/version.c +++ b/src/backend/utils/adt/version.c @@ -5,14 +5,13 @@ * * IDENTIFICATION * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.9 1999/07/17 20:18:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.10 2000/07/02 15:20:51 petere Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include "version.h" text *version(void); diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index eaee59d81fe..2b63ace0eca 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.50 2000/06/14 18:17:46 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.51 2000/07/02 15:20:56 petere Exp $ * *------------------------------------------------------------------------- */ @@ -24,6 +24,7 @@ #include <grp.h> #include <pwd.h> #include <stdlib.h> +#include <errno.h> #include "catalog/catname.h" #include "catalog/pg_shadow.h" @@ -520,3 +521,51 @@ SetPidFile(pid_t pid) return (0); } + + + +/* + * Determine whether the PG_VERSION file in directory `path' indicates + * a data version compatible with the version of this program. + * + * If compatible, return. Otherwise, elog(FATAL). + */ +void +ValidatePgVersion(const char *path) +{ + char full_path[MAXPGPATH]; + FILE *file; + int ret; + long file_major, file_minor; + long my_major = 0, my_minor = 0; + char *endptr; + const char *version_string = PG_VERSION; + + my_major = strtol(version_string, &endptr, 10); + if (*endptr == '.') + my_minor = strtol(endptr+1, NULL, 10); + + snprintf(full_path, MAXPGPATH, "%s/PG_VERSION", path); + + file = AllocateFile(full_path, "r"); + if (!file) + { + if (errno == ENOENT) + elog(FATAL, "File %s is missing. This is not a valid data directory.", full_path); + else + elog(FATAL, "cannot open %s: %s", full_path, strerror(errno)); + } + + ret = fscanf(file, "%ld.%ld", &file_major, &file_minor); + if (ret == EOF) + elog(FATAL, "cannot read %s: %s", full_path, strerror(errno)); + else if (ret != 2) + elog(FATAL, "`%s' does not have a valid format. You need to initdb.", full_path); + + FreeFile(file); + + if (my_major != file_major || my_minor != file_minor) + elog(FATAL, "The data directory was initalized by PostgreSQL version %ld.%ld, " + "which is not compatible with this verion %s.", + file_major, file_minor, version_string); +} diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index f2a5864666c..813eb131174 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.60 2000/06/28 03:32:43 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.61 2000/07/02 15:20:56 petere Exp $ * * *------------------------------------------------------------------------- @@ -34,7 +34,6 @@ #include "utils/portal.h" #include "utils/relcache.h" #include "utils/syscache.h" -#include "version.h" #ifdef MULTIBYTE #include "mb/pg_wchar.h" @@ -267,9 +266,7 @@ InitPostgres(const char *dbname) elog(FATAL, "Database system not found. Data directory '%s' does not exist.", DataDir); - ValidatePgVersion(DataDir, &reason); - if (reason != NULL) - elog(FATAL, reason); + ValidatePgVersion(DataDir); /*----------------- * Find oid and path of the database we're about to open. Since we're @@ -300,9 +297,7 @@ InitPostgres(const char *dbname) elog(FATAL, "Database \"%s\" does not exist. The data directory '%s' is missing.", dbname, fullpath); - ValidatePgVersion(fullpath, &reason); - if (reason != NULL) - elog(FATAL, "%s", reason); + ValidatePgVersion(fullpath); if (chdir(fullpath) == -1) elog(FATAL, "Unable to change directory to '%s': %s", fullpath, strerror(errno)); |