56 lines
2 KiB
Python
56 lines
2 KiB
Python
# loops.storage.migration.tracking
|
|
|
|
"""Tools for migration of ZODB-/BTree-based tracks to SQL-based records."""
|
|
|
|
from datetime import datetime
|
|
import transaction
|
|
|
|
from scopes.storage import tracking
|
|
from loops.config.base import LoopsOptions
|
|
from loops import util
|
|
|
|
|
|
def migrate(loopsRoot, recFolderName, sourceIds=None, factory=tracking.Container,
|
|
start=0, stop=None, step=10, autoDelete=False):
|
|
rf = loopsRoot.getRecordManager().get(recFolderName)
|
|
if rf is None:
|
|
print('*** ERROR: folder %r not found!' % recFolderName)
|
|
return
|
|
if sourceIds is None:
|
|
trackIds = list(rf.keys()[start:stop])
|
|
else:
|
|
trackIds = sourceIds[start:stop]
|
|
options = LoopsOptions(loopsRoot)
|
|
schema = options('scopes.storage.schema') or None
|
|
if schema is not None:
|
|
schema = schema[0]
|
|
#print('*** schema:', schema)
|
|
storage = util.storageFactory(schema=schema)
|
|
container = storage.create(factory)
|
|
ix = 0
|
|
prefix = factory.itemFactory.prefix
|
|
for ix, id in enumerate(trackIds):
|
|
inTrack = rf[id]
|
|
id = int(id)
|
|
ts = datetime.fromtimestamp(inTrack.timeStamp)
|
|
#print('*** in:', id, inTrack)
|
|
head = [inTrack.metadata[k] for k in container.itemFactory.headFields]
|
|
data = inTrack.data
|
|
#print('*** out:', head, ts)
|
|
for k, v in inTrack.__dict__.items():
|
|
if k[0] == '_' and k[1] != '_':
|
|
print('*** _field!', k, v, head)
|
|
data[k] = v
|
|
track = container.itemFactory(*head, trackId=id,
|
|
timeStamp=ts, data=data)
|
|
container.upsert(track)
|
|
ouid = util.getUidForObject(inTrack)
|
|
storage.storeUid(ouid, prefix, id)
|
|
if autoDelete:
|
|
inTrack.__parent__.removeTrack(inTrack)
|
|
if divmod(ix+1, step)[1] == 0:
|
|
print('*** migrated %d' % (ix + 1 + start))
|
|
transaction.commit()
|
|
transaction.commit()
|
|
print('*** migrated %d' % (ix + 1 + start))
|
|
|