# loops.storage.migration.tracking """Tools for migration of ZODB-/BTree-based tracks to SQL-based records.""" from datetime import datetime import transaction import config import scopes.storage.common from scopes.storage.common import getEngine, sessionFactory from scopes.storage import tracking from loops.config.base import LoopsOptions from loops.storage.compat.common import Storage from loops import util def migrate(loopsRoot, source, factory=tracking.Container, start=0, stop=None, step=10): if isinstance(source, basestring): rf = loopsRoot.getRecordManager().get(source) if rf is None: print('*** ERROR: folder %r not found!' % recFolderName) return items = rf.items()[start:stop] else: items = [(s.__name__, s) for s in source[start:stop]] options = LoopsOptions(loopsRoot) #print('*** database:', config.dbname, config.dbuser, config.dbpassword) schema = options('scopes.storage.schema') or None if schema is not None: schema = schema[0] #print('*** schema:', schema) storage = Storage(schema=schema) container = storage.create(factory) for ix, (id, inTrack) in enumerate(items): ts = datetime.fromtimestamp(inTrack.timeStamp) #print('*** in:', id, inTrack) head = [inTrack.metadata[k] for k in container.itemFactory.headFields] #print('*** out:', head, ts) track = container.itemFactory(*head, trackId=int(id), timeStamp=ts, data=inTrack.data) container.upsert(track) ouid = util.getUidForObject(inTrack) storage.storeUid(ouid, track.uid) if divmod(ix+1, step)[1] == 0: print('*** migrated %d' % (ix + 1 + start)) transaction.commit() transaction.commit()