loops/storage/migration/tracking.py

49 lines
1.8 KiB
Python

# 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 cco.storage.common
from cco.storage.common import getEngine, sessionFactory
from cco.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('cco.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()