3975: Accessing an incompatible database corrupts the database

svn: r16234
This commit is contained in:
Doug Blank
2010-11-24 03:27:37 +00:00
parent 5705dfe107
commit 7244448c51
3 changed files with 38 additions and 7 deletions

View File

@ -67,6 +67,29 @@ class DbVersionError(Exception):
"Gramps.\nPlease upgrade to the corresponding version or use "
"XML for porting data between different database versions.")
class DbEnvironmentError(Exception):
"""
Error used to report that the database 'environment' could not be opened.
Most likely, the database was created by a different version of the underlying database engine.
"""
def __init__(self, msg):
Exception.__init__(self)
self.msg = msg
def __str__(self):
return (_("Gramps has detected an problem in opening the 'environment' "
"of the underlying Berkeley database. The most likely cause "
"is that the database was created with an old version "
"of the Berkeley database, and you are now using a new version. "
"It is quite likely that your database has not been "
"changed by Gramps.\nIf possible, you could revert to your "
"old version of Gramps and its support software; export "
"your database to XML; close the database; then upgrade again "
"to this version "
"and import the XML file. Alternatively, it may be possible "
"to upgrade your database.")
+ '\n\n' + str(self.msg))
class DbUpgradeRequiredError(Exception):
"""
Error used to report that a database needs to be upgraded before it can be

View File

@ -52,7 +52,7 @@ from gen.lib import (GenderStats, Person, Family, Event, Place, Source,
MediaObject, Repository, Note)
from gen.db import (DbBsddbRead, DbWriteBase, BSDDBTxn,
DbTxn, GrampsCursor, DbVersionError,
DbUpgradeRequiredError,
DbUpgradeRequiredError, DbEnvironmentError,
DbUndoBSDDB as DbUndo)
from gen.db.dbconst import *
from gen.utils.callback import Callback
@ -398,13 +398,17 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
db.DB_INIT_MPOOL | db.DB_INIT_LOCK |\
db.DB_INIT_LOG | db.DB_INIT_TXN | db.DB_THREAD
# As opposed to before, we always try recovery on databases
env_flags |= db.DB_RECOVER
# Environment name is now based on the filename
env_name = name
try:
self.env.open(env_name, env_flags)
except Exception, msg:
try:
self.__close_early()
except:
pass
raise DbEnvironmentError(msg)
self.env.txn_checkpoint()
if callback:
@ -1671,7 +1675,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
import upgrade
upgrade.gramps_upgrade_14(self)
print "Upgrade time:", int(time.time()-t), "seconds"
_LOG.debug("Upgrade time: %d seconds" % int(time.time()-t))
def set_auto_remove(self):
"""

View File

@ -305,6 +305,10 @@ class DbLoader(CLIDbLoader):
except gen.db.exceptions.DbVersionError, msg:
self.dbstate.no_database()
self._errordialog( _("Cannot open database"), str(msg))
except gen.db.exceptions.DbEnvironmentError, msg:
_LOG.error("dbloader: read_file: DbEnvironmentError detected")
self.dbstate.no_database()
self._errordialog( _("Cannot open database"), str(msg))
except OSError, msg:
self.dbstate.no_database()
self._errordialog(