migration: improve uid mapping by using separate columns for prefix and id
This commit is contained in:
parent
536903f3d8
commit
f51f3d4f25
2 changed files with 12 additions and 8 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
"""Compatibility layer on scopes.storage: common functionality."""
|
"""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 zope.sqlalchemy import mark_changed
|
||||||
|
|
||||||
from scopes.storage import common
|
from scopes.storage import common
|
||||||
|
@ -16,13 +16,13 @@ class Storage(common.Storage):
|
||||||
super(Storage, self).__init__(schema)
|
super(Storage, self).__init__(schema)
|
||||||
self.uidTable = self.getUidTable(self.schema)
|
self.uidTable = self.getUidTable(self.schema)
|
||||||
|
|
||||||
def storeUid(self, ouid, nuid):
|
def storeUid(self, ouid, prefix, id):
|
||||||
ouid = int(ouid)
|
ouid = int(ouid)
|
||||||
t = self.uidTable
|
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
|
n = self.session.execute(stmt).rowcount
|
||||||
if n == 0:
|
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)
|
self.session.execute(stmt)
|
||||||
mark_changed(self.session)
|
mark_changed(self.session)
|
||||||
|
|
||||||
|
@ -35,8 +35,10 @@ class Storage(common.Storage):
|
||||||
def createUidTable(storage):
|
def createUidTable(storage):
|
||||||
metadata = storage.metadata
|
metadata = storage.metadata
|
||||||
cols = [Column('legacy', BigInteger, primary_key=True),
|
cols = [Column('legacy', BigInteger, primary_key=True),
|
||||||
Column('standard', Text, nullable=False, unique=True, index=True)]
|
Column('prefix', Text, nullable=False),
|
||||||
table = Table('uid_mapping', metadata, *cols, extend_existing=True)
|
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)
|
metadata.create_all(storage.engine)
|
||||||
return table
|
return table
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,9 @@ def migrate(loopsRoot, source, factory=tracking.Container,
|
||||||
storage = Storage(schema=schema)
|
storage = Storage(schema=schema)
|
||||||
container = storage.create(factory)
|
container = storage.create(factory)
|
||||||
ix = 0
|
ix = 0
|
||||||
|
prefix = factory.itemFactory.prefix
|
||||||
for ix, (id, inTrack) in enumerate(items):
|
for ix, (id, inTrack) in enumerate(items):
|
||||||
|
id = int(id)
|
||||||
ts = datetime.fromtimestamp(inTrack.timeStamp)
|
ts = datetime.fromtimestamp(inTrack.timeStamp)
|
||||||
#print('*** in:', id, inTrack)
|
#print('*** in:', id, inTrack)
|
||||||
head = [inTrack.metadata[k] for k in container.itemFactory.headFields]
|
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] != '_':
|
if k[0] == '_' and k[1] != '_':
|
||||||
print('*** _field!', k, v, head)
|
print('*** _field!', k, v, head)
|
||||||
data[k] = v
|
data[k] = v
|
||||||
track = container.itemFactory(*head, trackId=int(id),
|
track = container.itemFactory(*head, trackId=id,
|
||||||
timeStamp=ts, data=data)
|
timeStamp=ts, data=data)
|
||||||
container.upsert(track)
|
container.upsert(track)
|
||||||
ouid = util.getUidForObject(inTrack)
|
ouid = util.getUidForObject(inTrack)
|
||||||
storage.storeUid(ouid, track.uid)
|
storage.storeUid(ouid, prefix, id)
|
||||||
if autoDelete:
|
if autoDelete:
|
||||||
inTrack.__parent__.removeTrack(inTrack)
|
inTrack.__parent__.removeTrack(inTrack)
|
||||||
if divmod(ix+1, step)[1] == 0:
|
if divmod(ix+1, step)[1] == 0:
|
||||||
|
|
Loading…
Add table
Reference in a new issue