diff --git a/storage/compat/common.py b/storage/compat/common.py index 1177d86..298975f 100644 --- a/storage/compat/common.py +++ b/storage/compat/common.py @@ -2,7 +2,7 @@ """Compatibility layer on scopes.storage: common functionality.""" -from sqlalchemy import Table, Column, BigInteger, Text +from sqlalchemy import Table, Column, Index, BigInteger, Text from zope.sqlalchemy import mark_changed from scopes.storage import common @@ -16,13 +16,13 @@ class Storage(common.Storage): super(Storage, self).__init__(schema) self.uidTable = self.getUidTable(self.schema) - def storeUid(self, ouid, nuid): + def storeUid(self, ouid, prefix, id): ouid = int(ouid) t = self.uidTable - stmt = t.update().values(standard=nuid).where(t.c.legacy == ouid) + stmt = t.update().values(prefix=prefix, id=id).where(t.c.legacy == ouid) n = self.session.execute(stmt).rowcount if n == 0: - stmt = t.insert().values(legacy=ouid, standard=nuid) + stmt = t.insert().values(legacy=ouid, prefix=prefix, id=id) self.session.execute(stmt) mark_changed(self.session) @@ -35,8 +35,10 @@ class Storage(common.Storage): def createUidTable(storage): metadata = storage.metadata cols = [Column('legacy', BigInteger, primary_key=True), - Column('standard', Text, nullable=False, unique=True, index=True)] - table = Table('uid_mapping', metadata, *cols, extend_existing=True) + Column('prefix', Text, nullable=False), + Column('id', BigInteger, nullable=False)] + idxs = [Index('idx_uid_mapping_prefix_id', 'prefix', 'id', unique=True)] + table = Table('uid_mapping', metadata, *(cols+idxs), extend_existing=True) metadata.create_all(storage.engine) return table diff --git a/storage/migration/tracking.py b/storage/migration/tracking.py index b6c1af4..c069c9d 100644 --- a/storage/migration/tracking.py +++ b/storage/migration/tracking.py @@ -33,7 +33,9 @@ def migrate(loopsRoot, source, factory=tracking.Container, storage = Storage(schema=schema) container = storage.create(factory) ix = 0 + prefix = factory.itemFactory.prefix for ix, (id, inTrack) in enumerate(items): + id = int(id) ts = datetime.fromtimestamp(inTrack.timeStamp) #print('*** in:', id, inTrack) head = [inTrack.metadata[k] for k in container.itemFactory.headFields] @@ -43,11 +45,11 @@ def migrate(loopsRoot, source, factory=tracking.Container, if k[0] == '_' and k[1] != '_': print('*** _field!', k, v, head) data[k] = v - track = container.itemFactory(*head, trackId=int(id), + track = container.itemFactory(*head, trackId=id, timeStamp=ts, data=data) container.upsert(track) ouid = util.getUidForObject(inTrack) - storage.storeUid(ouid, track.uid) + storage.storeUid(ouid, prefix, id) if autoDelete: inTrack.__parent__.removeTrack(inTrack) if divmod(ix+1, step)[1] == 0: