Guest User

ZodbFile

a guest
Jan 27th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.03 KB | None | 0 0
  1. import os
  2. import shutil
  3. from tempfile import mkstemp
  4.  
  5. import transaction
  6. from ZODB import FileStorage, DB
  7. from ZODB.broken import find_global
  8. from ZODB.serialize import referencesf
  9. from persistent.list import PersistentList
  10.  
  11.  
  12. class ZodbFile(object):
  13.     def __init__(self, filename):
  14.         self._filename = filename
  15.         fh, self._tempname = mkstemp(prefix="MyPrefix_", suffix=".fs")
  16.         os.close(fh)
  17.         if filename != "":
  18.             shutil.copyfile(self._filename, self._tempname)
  19.         self._zodb_storage = FileStorage.FileStorage(self._tempname)
  20.         self._zodb_db = DB(self._zodb_storage)
  21.         self._zodb_connection = self._zodb_db.open()
  22.         self._zodb_root = self._zodb_connection.root()
  23.         self._bootstrap()
  24.  
  25.  
  26.     def close(self):
  27.         """ close db connection and remove temporary db files """
  28.         transaction.abort()
  29.         self._zodb_connection.close()
  30.         self._zodb_root = None
  31.         # cleanup db files in TMP dir
  32.         for fn in (self._tempname,
  33.                    "%s.index" % self._tempname,
  34.                    "%s.index_tmp" % self._tempname,
  35.                    "%s.lock" % self._tempname,
  36.                    "%s.old" % self._tempname,
  37.                    "%s.pack" % self._tempname,
  38.                    "%s.tmp" % self._tempname):
  39.             try:
  40.                os.unlink(fn)
  41.             except OSError:
  42.                 pass
  43.  
  44.  
  45.     def dbRoot(self):
  46.         """ return zodb root """
  47.         return self._zodb_root
  48.  
  49.  
  50.     def save(self):
  51.         """ save temporary db to original filename """
  52.         self.saveAs(self._filename)
  53.  
  54.  
  55.     def saveAs(self, filename):
  56.         """ save temporary db to given filename """
  57.         transaction.commit()
  58.         self._zodb_storage.pack(time(), referencesf)
  59.         shutil.copyfile(self._tempname, filename)
  60.         self._filename = filename
  61.  
  62.  
  63.     def _bootstrap(self):
  64.         """ setup internal structure of ZODB """
  65.         root = self._zodb_root
  66.         # do your db initialization and schema migration stuff here...
Add Comment
Please, Sign In to add comment