if media.db import fails, start anew

This commit is contained in:
Damien Elmes 2014-06-28 05:06:43 +09:00
parent 61b0072dcc
commit eba3aa583c

View file

@ -3,6 +3,7 @@
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import re import re
import traceback
import urllib import urllib
import unicodedata import unicodedata
import sys import sys
@ -77,9 +78,10 @@ create table meta (dirMod int, lastUsn int); insert into meta values (0, 0);
def maybeUpgrade(self): def maybeUpgrade(self):
oldpath = self.dir()+".db" oldpath = self.dir()+".db"
if os.path.exists(oldpath): if os.path.exists(oldpath):
try:
self.db.execute('attach "../collection.media.db" as old') self.db.execute('attach "../collection.media.db" as old')
self.db.execute(""" self.db.execute("""
insert into media insert into media
select m.fname, csum, mod, ifnull((select 1 from log l2 where l2.fname=m.fname), 0) as dirty select m.fname, csum, mod, ifnull((select 1 from log l2 where l2.fname=m.fname), 0) as dirty
from old.media m from old.media m
left outer join old.log l using (fname) left outer join old.log l using (fname)
@ -87,11 +89,15 @@ insert into media
select fname, null, 0, 1 from old.log where type=1;""") select fname, null, 0, 1 from old.log where type=1;""")
self.db.execute("delete from meta") self.db.execute("delete from meta")
self.db.execute(""" self.db.execute("""
insert into meta select dirMod, usn from old.meta insert into meta select dirMod, usn from old.meta
""") """)
self.db.execute("detach old") self.db.execute("detach old")
self.db.commit() self.db.commit()
self.db.execute("vacuum analyze") self.db.execute("vacuum analyze")
except Exception, e:
# if we couldn't import the old db for some reason, just start
# anew
self.col.log("failed to import old media db:"+traceback.format_exc())
os.rename("../collection.media.db", "../collection.media.db.old") os.rename("../collection.media.db", "../collection.media.db.old")
def close(self): def close(self):