MOBILE-3821 core: Fix databases clean up

main
Noel De Martin 2022-02-21 12:31:56 +01:00
parent 84afd1ea4d
commit d80ba6698b
6 changed files with 33 additions and 14 deletions

View File

@ -69,6 +69,7 @@ export class AddonModBookProvider {
() => CoreSites.getSiteTable(LAST_CHAPTER_VIEWED_TABLE, { () => CoreSites.getSiteTable(LAST_CHAPTER_VIEWED_TABLE, {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.None }, config: { cachingStrategy: CoreDatabaseCachingStrategy.None },
onDestroy: () => delete this.lastChapterViewedTables[siteId],
}), }),
), ),
); );

View File

@ -28,6 +28,7 @@ export class CoreDatabaseTable<
protected database: SQLiteDB; protected database: SQLiteDB;
protected tableName: string; protected tableName: string;
protected primaryKeyColumns: PrimaryKeyColumn[]; protected primaryKeyColumns: PrimaryKeyColumn[];
protected listeners: CoreDatabaseTableListener[] = [];
constructor( constructor(
config: Partial<CoreDatabaseConfiguration>, config: Partial<CoreDatabaseConfiguration>,
@ -86,7 +87,16 @@ export class CoreDatabaseTable<
* Destroy. * Destroy.
*/ */
async destroy(): Promise<void> { async destroy(): Promise<void> {
// Nothing to destroy by default, override this method if necessary. this.listeners.forEach(listener => listener.onDestroy?.());
}
/**
* Add listener.
*
* @param listener Listener.
*/
addListener(listener: CoreDatabaseTableListener): void {
this.listeners.push(listener);
} }
/** /**
@ -368,6 +378,13 @@ export interface CoreDatabaseConfiguration {
// This definition is augmented in subclasses. // This definition is augmented in subclasses.
} }
/**
* Database table listener.
*/
export interface CoreDatabaseTableListener {
onDestroy?(): void;
}
/** /**
* CoreDatabaseTable constructor. * CoreDatabaseTable constructor.
*/ */

View File

@ -153,6 +153,7 @@ export class CoreCourseProvider {
() => CoreSites.getSiteTable(COURSE_STATUS_TABLE, { () => CoreSites.getSiteTable(COURSE_STATUS_TABLE, {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager }, config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager },
onDestroy: () => delete this.statusTables[siteId],
}), }),
), ),
); );

View File

@ -74,6 +74,7 @@ export class CorePushNotificationsProvider {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.None }, config: { cachingStrategy: CoreDatabaseCachingStrategy.None },
primaryKeyColumns: ['appid', 'uuid'], primaryKeyColumns: ['appid', 'uuid'],
onDestroy: () => delete this.registeredDevicesTables[siteId],
}, },
), ),
), ),

View File

@ -113,6 +113,7 @@ export class CoreFilepoolProvider {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy }, config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
primaryKeyColumns: ['fileId'], primaryKeyColumns: ['fileId'],
onDestroy: () => delete this.filesTables[siteId],
}), }),
), ),
); );
@ -122,6 +123,7 @@ export class CoreFilepoolProvider {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy }, config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
primaryKeyColumns: ['fileId', 'component', 'componentId'], primaryKeyColumns: ['fileId', 'component', 'componentId'],
onDestroy: () => delete this.linksTables[siteId],
}), }),
), ),
); );
@ -130,6 +132,7 @@ export class CoreFilepoolProvider {
() => CoreSites.getSiteTable<CoreFilepoolPackageEntry, 'id'>(PACKAGES_TABLE_NAME, { () => CoreSites.getSiteTable<CoreFilepoolPackageEntry, 'id'>(PACKAGES_TABLE_NAME, {
siteId, siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy }, config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
onDestroy: () => delete this.packagesTables[siteId],
}), }),
), ),
); );
@ -149,16 +152,6 @@ export class CoreFilepoolProvider {
NgZone.run(() => this.checkQueueProcessing()); NgZone.run(() => this.checkQueueProcessing());
}); });
}); });
CoreEvents.on(CoreEvents.SITE_DELETED, async ({ siteId }) => {
if (!siteId || !(siteId in this.filesTables)) {
return;
}
await this.filesTables[siteId].destroy();
delete this.filesTables[siteId];
});
} }
/** /**

View File

@ -158,6 +158,7 @@ export class CoreSitesProvider {
config: Partial<CoreDatabaseConfiguration>; config: Partial<CoreDatabaseConfiguration>;
database: SQLiteDB; database: SQLiteDB;
primaryKeyColumns: PrimaryKeyColumn[]; primaryKeyColumns: PrimaryKeyColumn[];
onDestroy(): void;
}> = {}, }> = {},
): Promise<CoreDatabaseTable<DBRecord, PrimaryKeyColumn>> { ): Promise<CoreDatabaseTable<DBRecord, PrimaryKeyColumn>> {
const siteId = options.siteId ?? this.getCurrentSiteId(); const siteId = options.siteId ?? this.getCurrentSiteId();
@ -176,6 +177,8 @@ export class CoreSitesProvider {
options.primaryKeyColumns, options.primaryKeyColumns,
); );
options.onDestroy && table.addListener({ onDestroy: options.onDestroy });
await table.initialize(); await table.initialize();
promisedTable.resolve(table as unknown as CoreDatabaseTable); promisedTable.resolve(table as unknown as CoreDatabaseTable);
@ -1833,16 +1836,19 @@ export class CoreSitesProvider {
* @returns Scehmas Table. * @returns Scehmas Table.
*/ */
protected getSiteSchemasTable(site: CoreSite): AsyncInstance<CoreDatabaseTable<SchemaVersionsDBEntry, 'name'>> { protected getSiteSchemasTable(site: CoreSite): AsyncInstance<CoreDatabaseTable<SchemaVersionsDBEntry, 'name'>> {
this.schemasTables[site.getId()] = this.schemasTables[site.getId()] ?? asyncInstance( const siteId = site.getId();
this.schemasTables[siteId] = this.schemasTables[siteId] ?? asyncInstance(
() => this.getSiteTable(SCHEMA_VERSIONS_TABLE_NAME, { () => this.getSiteTable(SCHEMA_VERSIONS_TABLE_NAME, {
siteId: site.getId(), siteId: siteId,
database: site.getDb(), database: site.getDb(),
config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager }, config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager },
primaryKeyColumns: ['name'], primaryKeyColumns: ['name'],
onDestroy: () => delete this.schemasTables[siteId],
}), }),
); );
return this.schemasTables[site.getId()]; return this.schemasTables[siteId];
} }
} }