From 16a8bcf5c3943b61e932f9627c6a154bcbe5130e Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 1 Feb 2024 11:43:37 +0100 Subject: [PATCH] provide table for UID mappings, fill during migration --- storage/compat/common.py | 27 +++++++++++++++++++++++++-- storage/migration/tracking.py | 6 +++++- storage/tests/common.py | 2 +- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/storage/compat/common.py b/storage/compat/common.py index ec81a1d..5cf41a0 100644 --- a/storage/compat/common.py +++ b/storage/compat/common.py @@ -2,6 +2,9 @@ """Compatibility layer on cco.storage: common functionality.""" +from sqlalchemy import Table, Column, BigInteger, Text +from zope.sqlalchemy import mark_changed + from cco.storage import common @@ -11,11 +14,31 @@ class Storage(common.Storage): def __init__(self, engine, schema=None): super(Storage, self).__init__(engine, schema) - #self.uidTable = self.getUidTable(self.schema) + self.uidTable = self.getUidTable(self.schema) + self.session = self.Session() + + def storeUid(self, ouid, nuid): + ouid = int(ouid) + t = self.uidTable + stmt = t.update().values(standard=nuid).where(t.c.legacy == ouid) + n = self.session.execute(stmt).rowcount + if n == 0: + stmt = t.insert().values(legacy=ouid, standard=nuid) + self.session.execute(stmt) + mark_changed(self.session) + def getUidTable(self, schema=None): #table = getExistingTable(self.storage, self.tableName) #if table is None: - return createUidTable(self.storage) + return createUidTable(self) +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) + metadata.create_all(storage.engine) + return table + diff --git a/storage/migration/tracking.py b/storage/migration/tracking.py index 58ef590..7adb027 100644 --- a/storage/migration/tracking.py +++ b/storage/migration/tracking.py @@ -6,9 +6,11 @@ from datetime import datetime import transaction import config -from cco.storage.common import Storage, getEngine +from cco.storage.common import getEngine 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, recFolderName, factory=tracking.Container): @@ -35,5 +37,7 @@ def migrate(loopsRoot, recFolderName, factory=tracking.Container): track = container.itemFactory(*head, trackId=int(id), timeStamp=ts, data=inTrack.data) container.upsert(track) + ouid = util.getUidForObject(inTrack) + storage.storeUid(ouid, track.uid) transaction.commit() diff --git a/storage/tests/common.py b/storage/tests/common.py index bce7943..1184626 100644 --- a/storage/tests/common.py +++ b/storage/tests/common.py @@ -1,4 +1,4 @@ -# loops.storage.test.common +# loops.storage.tests.common """Common definitions for testing the SQL-based storage implementation. """