Migrate old media DB if present
This commit is contained in:
parent
e8f274ee84
commit
e8850f2a5a
@ -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()
|
||||
|
||||
44
tests/test_media.py
Normal file
44
tests/test_media.py
Normal file
@ -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,)])
|
||||
Loading…
Reference in New Issue
Block a user