diff --git a/ankisyncd/media.py b/ankisyncd/media.py index 1d3356b..de9f9ba 100644 --- a/ankisyncd/media.py +++ b/ankisyncd/media.py @@ -2,12 +2,15 @@ # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # Original source: https://raw.githubusercontent.com/dae/anki/62481ddc1aa78430cb8114cbf00a7739824318a8/anki/media.py +import logging import re import os import os.path import anki.db +logger = logging.getLogger("ankisyncd.media") + class ServerMediaManager: def __init__(self, col): @@ -16,7 +19,6 @@ class ServerMediaManager: def connect(self): path = self.dir() + ".server.db" - # TODO: migrate old db create = not os.path.exists(path) self.db = anki.db.DB(path) if create: @@ -28,6 +30,15 @@ class ServerMediaManager: ); CREATE INDEX idx_media_usn ON media (usn);""" ) + oldpath = self.dir() + ".db2" + if os.path.exists(oldpath): + logger.info("Found client media database, migrating contents") + self.db.execute("ATTACH ? AS old", oldpath) + self.db.execute( + "INSERT INTO media SELECT fname, lastUsn, csum FROM old.media, old.meta" + ) + self.db.commit() + self.db.execute("DETACH old") def close(self): self.db.close() diff --git a/tests/test_media.py b/tests/test_media.py new file mode 100644 index 0000000..d2cab7b --- /dev/null +++ b/tests/test_media.py @@ -0,0 +1,44 @@ +import os.path +import unittest + +import ankisyncd.media +import helpers.collection_utils + + +class ServerMediaManagerTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.colutils = helpers.collection_utils.CollectionUtils() + + @classmethod + def tearDownClass(cls): + cls.colutils.clean_up() + cls.colutils = None + + def test_upgrade(self): + col = self.colutils.create_empty_col() + cm = col.media + + fpath = os.path.join(cm.dir(), "file") + with open(fpath + "A", "w") as f: + f.write("some contents") + with open(fpath + "B", "w") as f: + f.write("other contents") + cm._logChanges() + + self.assertEqual( + set(cm.db.execute("SELECT fname, csum FROM media")), + { + ("fileA", "53059abba1a72c7aff34a3eaf7fef10ed65541ce"), + ("fileB", "a5ae546046d09559399c80fa7076fb10f1ce4bcd"), + }, + ) + cm.setLastUsn(161) + + sm = ankisyncd.media.ServerMediaManager(col) + self.assertEqual( + list(sm.db.execute("SELECT fname, csum FROM media")), + list(cm.db.execute("SELECT fname, csum FROM media")), + ) + self.assertEqual(cm.lastUsn(), sm.lastUsn()) + self.assertEqual(list(sm.db.execute("SELECT usn FROM media")), [(161,), (161,)])