3975: Accessing an incompatible database corrupts the database
svn: r16234
This commit is contained in:
parent
5705dfe107
commit
7244448c51
@ -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
|
||||
|
@ -51,8 +51,8 @@ from sys import maxint
|
||||
from gen.lib import (GenderStats, Person, Family, Event, Place, Source,
|
||||
MediaObject, Repository, Note)
|
||||
from gen.db import (DbBsddbRead, DbWriteBase, BSDDBTxn,
|
||||
DbTxn, GrampsCursor,DbVersionError,
|
||||
DbUpgradeRequiredError,
|
||||
DbTxn, GrampsCursor, DbVersionError,
|
||||
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
|
||||
|
||||
self.env.open(env_name, env_flags)
|
||||
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):
|
||||
"""
|
||||
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user