make txn optional

svn: r6102
This commit is contained in:
Don Allingham 2006-03-08 17:22:45 +00:00
parent e5375d15fc
commit de2a6f4d1e
2 changed files with 54 additions and 23 deletions

View File

@ -1,3 +1,6 @@
2006-03-08 Don Allingham <don@gramps-project.org>
* src/GramspDb/_GrampsBSDDB.py: make txn support optional via UseTXN
2006-03-07 Don Allingham <don@gramps-project.org>
* src/AddMedia.py: remove WindowsUtils dependency
* src/WindowUtils.py: remove

View File

@ -120,12 +120,20 @@ class GrampsBSDDB(GrampsDbBase):
"""GRAMPS database object. This object is a base class for other
objects."""
UseTXN = False
def __init__(self):
"""creates a new GrampsDB"""
GrampsDbBase.__init__(self)
self.txn = None
self.secondary_connected = False
def open_flags(self):
if self.UseTXN:
return db.DB_CREATE|db.DB_AUTO_COMMIT
else:
return db.DB_CREATE
def open_table(self,name,dbname,no_txn=False,dbtype=db.DB_HASH):
dbmap = dbshelve.DBShelf(self.env)
dbmap.db.set_pagesize(16384)
@ -134,8 +142,7 @@ class GrampsBSDDB(GrampsDbBase):
elif no_txn:
dbmap.open(name, dbname, dbtype, db.DB_CREATE, 0666)
else:
dbmap.open(name, dbname, dbtype,
db.DB_CREATE|db.DB_AUTO_COMMIT, 0666)
dbmap.open(name, dbname, dbtype, self.open_flags(), 0666)
return dbmap
def _all_handles(self,table):
@ -264,15 +271,21 @@ class GrampsBSDDB(GrampsDbBase):
self.env.set_lk_max_objects(25000)
self.env.set_flags(db.DB_LOG_AUTOREMOVE,1) # clean up unused logs
# The DB_PRIVATE flag must go if we ever move to multi-user setup
if self.UseTXN:
env_flags = db.DB_CREATE|db.DB_RECOVER|db.DB_PRIVATE|\
db.DB_INIT_MPOOL|db.DB_INIT_LOCK|\
db.DB_INIT_LOG|db.DB_INIT_TXN
else:
env_flags = db.DB_CREATE|db.DB_PRIVATE|\
db.DB_INIT_MPOOL|db.DB_INIT_LOG
self.undolog = "%s.undo" % name
env_name = os.path.expanduser(const.bsddbenv_dir)
if not os.path.isdir(env_name):
os.mkdir(env_name)
self.env.open(env_name,env_flags)
if self.UseTXN:
self.env.txn_checkpoint()
callback(25)
@ -349,7 +362,7 @@ class GrampsBSDDB(GrampsDbBase):
if self.readonly:
table_flags = db.DB_RDONLY
else:
table_flags = db.DB_CREATE|db.DB_AUTO_COMMIT
table_flags = self.open_flags()
self.surnames = db.DB(self.env)
self.surnames.set_flags(db.DB_DUP|db.DB_DUPSORT)
@ -443,7 +456,7 @@ class GrampsBSDDB(GrampsDbBase):
if self.readonly:
return
table_flags = db.DB_CREATE|db.DB_AUTO_COMMIT
table_flags = self.open_flags()
# remove existing secondary indices
self.id_trans.close()
@ -784,6 +797,7 @@ class GrampsBSDDB(GrampsDbBase):
self.source_map.close()
self.media_map.close()
self.event_map.close()
if self.UseTXN:
self.env.txn_checkpoint()
self.env.close()
@ -922,9 +936,13 @@ class GrampsBSDDB(GrampsDbBase):
handle = str(obj.handle)
if transaction.batch:
if self.UseTXN:
the_txn = self.env.txn_begin()
else:
the_txn = None
self._update_reference_map(obj,transaction,txn=the_txn)
data_map.put(handle,obj.serialize(),txn=the_txn)
if the_txn:
the_txn.commit()
old_data = None
else:
@ -977,6 +995,7 @@ class GrampsBSDDB(GrampsDbBase):
transaction = BdbTransaction(msg,self.undodb,batch,no_magic)
if transaction.batch:
if self.UseTXN:
self.env.txn_checkpoint()
self.env.set_flags(db.DB_TXN_NOSYNC,1) # async txn
@ -995,7 +1014,10 @@ class GrampsBSDDB(GrampsDbBase):
def transaction_commit(self,transaction,msg):
# Start BSD DB transaction -- DBTxn
if self.UseTXN:
self.txn = self.env.txn_begin()
else:
self.txn = None
GrampsDbBase.transaction_commit(self,transaction,msg)
@ -1006,14 +1028,16 @@ class GrampsBSDDB(GrampsDbBase):
self.reference_map.delete(str(key),txn=self.txn)
# Commit BSD DB transaction -- DBTxn
if self.UseTXN:
self.txn.commit()
if transaction.batch:
if self.UseTXN:
self.env.txn_checkpoint()
self.env.set_flags(db.DB_TXN_NOSYNC,0) # sync txn
if not transaction.no_magic:
# create new secondary indices to replace the ones removed
open_flags = db.DB_CREATE|db.DB_AUTO_COMMIT
open_flags = self.open_flags()
dupe_flags = db.DB_DUP|db.DB_DUPSORT
self.surnames = db.DB(self.env)
@ -1034,15 +1058,19 @@ class GrampsBSDDB(GrampsDbBase):
def undo(self):
print "Undoing it"
if self.UseTXN:
self.txn = self.env.txn_begin()
GrampsDbBase.undo(self)
if self.UseTXN:
self.txn.commit()
self.txn = None
def redo(self):
print "Redoing it"
if self.UseTXN:
self.txn = self.env.txn_begin()
GrampsDbBase.redo(self)
if self.UseTXN:
self.txn.commit()
self.txn = None
@ -1151,7 +1179,7 @@ class GrampsBSDDB(GrampsDbBase):
# Create one secondary index for reference_map
# because every commit will require this to exist
table_flags = db.DB_CREATE|db.DB_AUTO_COMMIT
table_flags = self.open_flags()
self.reference_map_primary_map = db.DB(self.env)
self.reference_map_primary_map.set_flags(db.DB_DUP)
self.reference_map_primary_map.open(self.full_name,
@ -1372,7 +1400,7 @@ class GrampsBSDDB(GrampsDbBase):
# Turns out that a lof ot events have duplicate gramps IDs
# We need to fix this
table_flags = db.DB_CREATE|db.DB_AUTO_COMMIT
table_flags = self.open_flags()
self.eid_trans = db.DB(self.env)
self.eid_trans.set_flags(db.DB_DUP)
self.eid_trans.open(self.full_name, "eidtrans",