Remember the last version of Berkeley DB that touched the
authorArt Cancro <ajc@citadel.org>
Tue, 27 May 2008 01:43:37 +0000 (01:43 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 27 May 2008 01:43:37 +0000 (01:43 +0000)
database.  Abort execution if someone tries to start up Citadel using
an older version.

citadel/database_sleepycat.c
citadel/server.h
citadel/server_main.c

index 731dc9133cacda5641c0ffb86c4cd8a00470a8af..907a15aff426bd6120010dc0f75914629218afe5 100644 (file)
@@ -52,6 +52,7 @@
 #include "sysdep_decls.h"
 #include "threads.h"
 #include "config.h"
+#include "control.h"
 
 #include "ctdl_module.h"
 
@@ -269,11 +270,30 @@ void open_databases(void)
        int i;
        char dbfilename[SIZ];
        u_int32_t flags = 0;
+       int dbversion_major, dbversion_minor, dbversion_patch;
+       int current_dbversion = 0;
 
        CtdlLogPrintf(CTDL_DEBUG, "cdb_*: open_databases() starting\n");
        CtdlLogPrintf(CTDL_DEBUG, "Compiled db: %s\n", DB_VERSION_STRING);
        CtdlLogPrintf(CTDL_INFO, "  Linked db: %s\n",
-               db_version(NULL, NULL, NULL));
+               db_version(&dbversion_major, &dbversion_minor, &dbversion_patch));
+
+       current_dbversion = (dbversion_major * 1000000) + (dbversion_minor * 1000) + dbversion_patch;
+
+       CtdlLogPrintf(CTDL_DEBUG, "Calculated dbversion: %d\n", current_dbversion);
+       CtdlLogPrintf(CTDL_DEBUG, "  Previous dbversion: %d\n", CitControl.MMdbversion);
+
+       if (CitControl.MMdbversion > current_dbversion) {
+               CtdlLogPrintf(CTDL_EMERG, "You are attempting to run the Citadel server using a version\n"
+                                       "of Berkeley DB that is older than that which last created or\n"
+                                       "updated the database.  Because this would probably cause data\n"
+                                       "corruption or loss, the server is aborting execution now.\n");
+               exit(CTDLEXIT_DB);
+       }
+
+       CitControl.MMdbversion = current_dbversion;
+       put_control();
+
 #ifdef HAVE_ZLIB
        CtdlLogPrintf(CTDL_INFO, "Linked zlib: %s\n", zlibVersion());
 #endif
index e7c2d21a26c60747e446586d29646f208bdd3957..bf3c71f3286c52ed325f9e2d9ea59de6ac3dc1f9 100644 (file)
@@ -185,6 +185,7 @@ struct CitControl {
        int version;                    /* Server-hosted upgrade level      */
        int fulltext_wordbreaker;       /* ID of wordbreaker in use         */
        long MMfulltext;                /* highest message number indexed   */
+       int MMdbversion;                /* Version of Berkeley DB used on previous server run */
 };
 
 extern struct CitContext *ContextList;
index be547e12ee85a36a7152f5004cc816c624368725..cfb7ce64f0a4bbde9b7fc92c2bf6e9d15bf1d033 100644 (file)
@@ -215,6 +215,7 @@ int main(int argc, char **argv)
        get_config();
        config.c_ipgm_secret = rand();
 
+       /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */
        CtdlLogPrintf(CTDL_INFO, "Acquiring control record\n");
        get_control();