From 91035595b249fedfae5c01d6c9d6921e0422416a Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 31 May 2018 08:47:20 +0200 Subject: [PATCH] MOBILE-2404 update: Migrate site DB core tables --- .../course/classes/module-prefetch-handler.ts | 7 +- src/core/question/providers/question.ts | 4 - src/providers/update-manager.ts | 171 +++++++++++++++++- 3 files changed, 176 insertions(+), 6 deletions(-) diff --git a/src/core/course/classes/module-prefetch-handler.ts b/src/core/course/classes/module-prefetch-handler.ts index 076b0e44e..a663354f4 100644 --- a/src/core/course/classes/module-prefetch-handler.ts +++ b/src/core/course/classes/module-prefetch-handler.ts @@ -457,7 +457,12 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref // Package marked as downloading, call the download function. // Send all the params except downloadFn. This includes all params passed after siteId. return downloadFn.apply(downloadFn, [module, courseId, single, siteId].concat(args)); - }).then((extra: string) => { + }).then((extra: any) => { + // Only accept string types. + if (typeof extra != 'string') { + extra = ''; + } + // Prefetch finished, mark as downloaded. return this.setDownloaded(module.id, siteId, extra); }).catch((error) => { diff --git a/src/core/question/providers/question.ts b/src/core/question/providers/question.ts index 0e0a18866..36fc7fed9 100644 --- a/src/core/question/providers/question.ts +++ b/src/core/question/providers/question.ts @@ -131,10 +131,6 @@ export class CoreQuestionProvider { name: 'questionslot', type: 'INTEGER' }, - { - name: 'state', - type: 'TEXT' - }, { name: 'value', type: 'TEXT' diff --git a/src/providers/update-manager.ts b/src/providers/update-manager.ts index fbef30a2e..3a11d86f5 100644 --- a/src/providers/update-manager.ts +++ b/src/providers/update-manager.ts @@ -176,6 +176,151 @@ export class CoreUpdateManagerProvider implements CoreInitHandler { }, ]; + /** + * Tables to migrate from each site DB. Include all the core ones to decrease the dependencies. + * + * @type {CoreUpdateManagerMigrateTable[]} + */ + protected siteDBTables: CoreUpdateManagerMigrateTable[] = [ + { + name: 'check_updates_times', + fields: [ + { + name: 'courseid', + newName: 'courseId' + } + ] + }, + { + name: 'course_status', + fields: [ + { + name: 'previous', + newName: 'previousStatus' + }, + { + name: 'downloadtime', + newName: 'downloadTime' + }, + { + name: 'previousdownloadtime', + newName: 'previousDownloadTime' + } + ] + }, + { + name: 'filepool', + newName: 'filepool_files', + fields: [ + { + name: 'stale', + type: 'boolean' + }, + { + name: 'downloaded', + newName: 'downloadTime' + }, + { + name: 'isexternalfile', + type: 'boolean' + } + ] + }, + { + name: 'files_links', + newName: 'filepool_files_links', + fields: [ + { + name: 'componentAndId', + delete: true + } + ] + }, + { + name: 'filepool_packages', + fields: [ + { + name: 'downloadtime', + newName: 'downloadTime' + }, + { + name: 'previousdownloadtime', + newName: 'previousDownloadTime' + }, + { + name: 'revision', // Move the value of 'revision' to 'extra' so SCORMs keep working. + newName: 'extra' + }, + { + name: 'timemodified', + delete: true + } + ] + }, + { + name: 'mm_emulator_last_received_notification', + newName: 'core_emulator_last_received_notification', + filterFields: ['component', 'id', 'timecreated'] + }, + { + name: 'questions', + fields: [ + { + name: 'componentId', + newName: 'componentid' + }, + { + name: 'componentAndAttempt', + delete: true + }, + { + name: 'componentAndComponentId', + delete: true + } + ] + }, + { + name: 'question_answers', + fields: [ + { + name: 'componentId', + newName: 'componentid' + }, + { + name: 'componentAndAttempt', + delete: true + }, + { + name: 'componentAndComponentId', + delete: true + }, + { + name: 'componentAndAttemptAndQuestion', + delete: true + } + ] + }, + { + name: 'sync' + }, + { + name: 'users' + }, + { + name: 'wscache', + fields: [ + { + name: 'data', + type: 'object' + }, + { + name: 'expirationtime', + newName: 'expirationTime' + } + ] + } + ]; + constructor(logger: CoreLoggerProvider, private configProvider: CoreConfigProvider, private sitesProvider: CoreSitesProvider, private filepoolProvider: CoreFilepoolProvider, private notifProvider: CoreLocalNotificationsProvider, private utils: CoreUtilsProvider, private appProvider: CoreAppProvider) { @@ -247,7 +392,16 @@ export class CoreUpdateManagerProvider implements CoreInitHandler { // First migrate the app DB. return this.migrateAppDB().then(() => { - // @todo: Migrate site DBs. + // Now migrate all site DBs. + return this.sitesProvider.getSitesIds(); + }).then((ids) => { + const promises = []; + + ids.forEach((id) => { + promises.push(this.migrateSiteDB(id)); + }); + + return this.utils.allPromises(promises); }); } @@ -263,6 +417,21 @@ export class CoreUpdateManagerProvider implements CoreInitHandler { return this.migrateDB(oldDb, newDb, this.appDBTables); } + /** + * Migrate the DB of a certain site. + * + * @param {string} siteId The site ID. + * @return {Promise} Promise resolved when done. + */ + protected migrateSiteDB(siteId: string): Promise { + // Get the site DB. + return this.sitesProvider.getSiteDb(siteId).then((newDb) => { + const oldDb = new ( window).ydn.db.Storage('Site-' + siteId); + + return this.migrateDB(oldDb, newDb, this.siteDBTables); + }); + } + /** * Migrate all the tables of a certain DB to the SQLite DB. *