move storage migration from cybertools to loops, + updates from cco.storage

This commit is contained in:
Helmut Merz 2023-12-15 14:13:47 +01:00
parent 6d39f9f354
commit 781521ca88
6 changed files with 62 additions and 5 deletions

View file

@ -1,4 +1 @@
"""
$Id$
"""
# package loops.organize.personal

View file

@ -0,0 +1,2 @@
# package loops.organize.personal.storage

View file

@ -0,0 +1,20 @@
# loops.organize.personal.storage.favorite
"""SQL-based storage for personal favorites and settings."""
from cco.storage.common import registerContainerClass
from cco.storage.tracking import record
class Favorite(record.Track):
prefix = 'fav'
@registerContainerClass
class Favorites(record.Container):
itemFactory = Favorite
tableName = 'favorites'
insertOnChange = False

View file

@ -98,7 +98,7 @@ class BaseTrackView(TrackView):
def getMetadataTarget(self, key):
value = self.metadata.get(key)
if isinstance(value, int) or value.isdigit():
if value is not None and (isinstance(value, int) or value.isdigit()):
obj = util.getObjectForUid(value)
if obj is not None:
url = ('%s/@@SelectedManagementView.html' %

View file

@ -0,0 +1 @@
# package loops.organize.tracking.storage

View file

@ -0,0 +1,37 @@
# loops.organize.tracking.storage.migration
"""Tools for migration ZODB-/BTree-based tracks to SQL-base records."""
from datetime import datetime
import config
from cco.storage.common import Storage, getEngine
from cco.storage.tracking import record
from loops.config.base import LoopsOptions
def migrate(loopsRoot, recFolderName, factory=record.Container):
rf = loopsRoot.getRecordManager().get(recFolderName)
if rf is None:
print('*** ERROR: folder %r not found!' % recFolderName)
return
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(getEngine(config.dbengine, config.dbname,
config.dbuser, config.dbpassword,
host=config.dbhost, port=config.dbport),
schema=schema)
container = storage.create(factory)
for id, inTrack in rf.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)