def migrate(self): if os.path.isfile(self.old_db_path): sickrage.app.log.info('=' * 30) sickrage.app.log.info('Migrating %s database, please wait...', self.name) migrate_start = time.time() import sqlite3 conn = sqlite3.connect(self.old_db_path) conn.text_factory = lambda x: (x.decode('utf-8', 'ignore')) migrate_data = {} rename_old = False try: c = conn.cursor() for ml in self._migrate_list: migrate_data[ml] = {} rows = self._migrate_list[ml] try: c.execute('SELECT {} FROM `{}`'.format('`' + '`,`'.join(rows) + '`', ml)) except: # ignore faulty destination_id database rename_old = True raise for p in c.fetchall(): columns = {} for row in self._migrate_list[ml]: columns[row] = p[rows.index(row)] if not migrate_data[ml].get(p[0]): migrate_data[ml][p[0]] = columns else: if not isinstance(migrate_data[ml][p[0]], list): migrate_data[ml][p[0]] = [migrate_data[ml][p[0]]] migrate_data[ml][p[0]].append(columns) sickrage.app.log.info('Getting data took %s', (time.time() - migrate_start)) if not self.db.opened: return for t_name in migrate_data: t_data = migrate_data.get(t_name, {}) sickrage.app.log.info('Importing %s %s' % (len(t_data), t_name)) for k, v in t_data.items(): if isinstance(v, list): for d in v: d.update({'_t': t_name}) self.insert(d) else: v.update({'_t': t_name}) self.insert(v) sickrage.app.log.info('Total migration took %s', (time.time() - migrate_start)) sickrage.app.log.info('=' * 30) rename_old = True except OperationalError: sickrage.app.log.debug('Migrating from unsupported/corrupt %s database version', self.name) rename_old = True except: sickrage.app.log.debug('Migration of %s database failed', self.name) finally: conn.close() # rename old database if rename_old: random = randomString() sickrage.app.log.info('Renaming old database to %s.%s_old' % (self.old_db_path, random)) os.rename(self.old_db_path, '{}.{}_old'.format(self.old_db_path, random)) if os.path.isfile(self.old_db_path + '-wal'): os.rename(self.old_db_path + '-wal', '{}-wal.{}_old'.format(self.old_db_path, random)) if os.path.isfile(self.old_db_path + '-shm'): os.rename(self.old_db_path + '-shm', '{}-shm.{}_old'.format(self.old_db_path, random))
def migrate(self): if os.path.isfile(self.old_db_path): sickrage.app.log.info('=' * 30) sickrage.app.log.info('Migrating %s database, please wait...', self.name) migrate_start = time.time() import sqlite3 conn = sqlite3.connect(self.old_db_path) conn.text_factory = lambda x: (x.decode('utf-8', 'ignore')) migrate_data = {} rename_old = False try: c = conn.cursor() for ml in self._migrate_list: migrate_data[ml] = {} rows = self._migrate_list[ml] try: c.execute('SELECT {} FROM `{}`'.format('`' + '`,`'.join(rows) + '`', ml)) except: # ignore faulty destination_id database rename_old = True raise for p in c.fetchall(): columns = {} for row in self._migrate_list[ml]: columns[row] = p[rows.index(row)] if not migrate_data[ml].get(p[0]): migrate_data[ml][p[0]] = columns else: if not isinstance(migrate_data[ml][p[0]], list): migrate_data[ml][p[0]] = [migrate_data[ml][p[0]]] migrate_data[ml][p[0]].append(columns) sickrage.app.log.info('Getting data took %s', (time.time() - migrate_start)) if not self.db.opened: return for t_name in migrate_data: t_data = migrate_data.get(t_name, {}) sickrage.app.log.info('Importing %s %s' % (len(t_data), t_name)) for k, v in t_data.items(): if isinstance(v, list): for d in v: d.update({'_t': t_name}) self.db.insert(d) else: v.update({'_t': t_name}) self.db.insert(v) sickrage.app.log.info('Total migration took %s', (time.time() - migrate_start)) sickrage.app.log.info('=' * 30) rename_old = True except OperationalError: sickrage.app.log.debug('Migrating from unsupported/corrupt %s database version', self.name) rename_old = True except: sickrage.app.log.debug('Migration of %s database failed', self.name) finally: conn.close() # rename old database if rename_old: random = randomString() sickrage.app.log.info('Renaming old database to %s.%s_old' % (self.old_db_path, random)) os.rename(self.old_db_path, '{}.{}_old'.format(self.old_db_path, random)) if os.path.isfile(self.old_db_path + '-wal'): os.rename(self.old_db_path + '-wal', '{}-wal.{}_old'.format(self.old_db_path, random)) if os.path.isfile(self.old_db_path + '-shm'): os.rename(self.old_db_path + '-shm', '{}-shm.{}_old'.format(self.old_db_path, random))