From f71cc7f44eecfd6918293513a09b56d96368a1d3 Mon Sep 17 00:00:00 2001 From: Nic Wolfe <nic@wolfeden.ca> Date: Sat, 9 Jun 2012 00:09:05 -0600 Subject: [PATCH] Refactored db migrations, added backups for config files during config migrations --- sickbeard/config.py | 4 ++-- sickbeard/databases/mainDB.py | 32 ++++++++------------------------ sickbeard/helpers.py | 26 +++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/sickbeard/config.py b/sickbeard/config.py index 4daf58b3a..9ecc3a12a 100644 --- a/sickbeard/config.py +++ b/sickbeard/config.py @@ -16,8 +16,6 @@ # You should have received a copy of the GNU General Public License # along with Sick Beard. If not, see <http://www.gnu.org/licenses/>. - - import cherrypy import os.path import datetime @@ -274,6 +272,8 @@ class ConfigMigrator(): else: migration_name = '' + helpers.backupVersionedFile(sickbeard.CONFIG_FILE, next_version) + # do the migration, expect a method named _migrate_v<num> logger.log(u"Migrating config up to version "+str(next_version)+migration_name) getattr(self, '_migrate_v'+str(next_version))() diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 9595846a6..649b55ded 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -17,15 +17,12 @@ # along with Sick Beard. If not, see <http://www.gnu.org/licenses/>. import sickbeard -import shutil, time, os.path, sys +import os.path -from sickbeard import db -from sickbeard import common -from sickbeard import logger +from sickbeard import db, common, helpers, logger from sickbeard.providers.generic import GenericProvider from sickbeard import encodingKludge as ek -from sickbeard.exceptions import ex from sickbeard.name_parser.parser import NameParser, InvalidNameException class MainSanityCheck(db.DBSanityCheck): @@ -52,6 +49,9 @@ class MainSanityCheck(db.DBSanityCheck): else: logger.log(u"No duplicate episode, check passed") +def backupDatabase(version): + helpers.backupVersionedFile(db.dbFilename(), version) + # ====================== # = Main DB Migrations = # ====================== @@ -130,25 +130,7 @@ class NewQualitySettings (NumericProviders): def execute(self): - numTries = 0 - while not ek.ek(os.path.isfile, db.dbFilename(suffix='v0')): - if not ek.ek(os.path.isfile, db.dbFilename()): - break - - try: - logger.log(u"Attempting to back up your sickbeard.db file before migration...") - shutil.copy(db.dbFilename(), db.dbFilename(suffix='v0')) - logger.log(u"Done backup, proceeding with migration.") - break - except Exception, e: - logger.log(u"Error while trying to back up your sickbeard.db: "+ex(e)) - numTries += 1 - time.sleep(1) - logger.log(u"Trying again.") - - if numTries >= 10: - logger.log(u"Unable to back up your sickbeard.db file, please do it manually.") - sys.exit(1) + backupDatabase(0) # old stuff that's been removed from common but we need it to upgrade HD = 1 @@ -406,6 +388,8 @@ class AddSizeAndSceneNameFields(FixAirByDateSetting): def execute(self): + backupDatabase(10) + if not self.hasColumn("tv_episodes", "file_size"): self.addColumn("tv_episodes", "file_size") diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 1f72025c1..b38505957 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License # along with Sick Beard. If not, see <http://www.gnu.org/licenses/>. - import StringIO, zlib, gzip import os import stat @@ -24,6 +23,7 @@ import urllib, urllib2 import re, socket import shutil import traceback +import time, sys from xml.dom.minidom import Node @@ -633,3 +633,27 @@ def get_xml_text(node): if child_node.nodeType in (Node.CDATA_SECTION_NODE, Node.TEXT_NODE): text += child_node.data return text.strip() + +def backupVersionedFile(oldFile, version): + numTries = 0 + + newFile = oldFile + '.' + 'v'+str(version) + + while not ek.ek(os.path.isfile, newFile): + if not ek.ek(os.path.isfile, oldFile): + break + + try: + logger.log(u"Attempting to back up "+oldFile+" before migration...") + shutil.copy(oldFile, newFile) + logger.log(u"Done backup, proceeding with migration.") + break + except Exception, e: + logger.log(u"Error while trying to back up "+oldFile+": "+ex(e)) + numTries += 1 + time.sleep(1) + logger.log(u"Trying again.") + + if numTries >= 10: + logger.log(u"Unable to back up "+oldFile+", please do it manually.") + sys.exit(1) -- GitLab