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, {
siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.None },
onDestroy: () => delete this.lastChapterViewedTables[siteId],
}),
),
);

View File

@ -28,6 +28,7 @@ export class CoreDatabaseTable<
protected database: SQLiteDB;
protected tableName: string;
protected primaryKeyColumns: PrimaryKeyColumn[];
protected listeners: CoreDatabaseTableListener[] = [];
constructor(
config: Partial<CoreDatabaseConfiguration>,
@ -86,7 +87,16 @@ export class CoreDatabaseTable<
* Destroy.
*/
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.
}
/**
* Database table listener.
*/
export interface CoreDatabaseTableListener {
onDestroy?(): void;
}
/**
* CoreDatabaseTable constructor.
*/

View File

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

View File

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

View File

@ -113,6 +113,7 @@ export class CoreFilepoolProvider {
siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
primaryKeyColumns: ['fileId'],
onDestroy: () => delete this.filesTables[siteId],
}),
),
);
@ -122,6 +123,7 @@ export class CoreFilepoolProvider {
siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
primaryKeyColumns: ['fileId', 'component', 'componentId'],
onDestroy: () => delete this.linksTables[siteId],
}),
),
);
@ -130,6 +132,7 @@ export class CoreFilepoolProvider {
() => CoreSites.getSiteTable<CoreFilepoolPackageEntry, 'id'>(PACKAGES_TABLE_NAME, {
siteId,
config: { cachingStrategy: CoreDatabaseCachingStrategy.Lazy },
onDestroy: () => delete this.packagesTables[siteId],
}),
),
);
@ -149,16 +152,6 @@ export class CoreFilepoolProvider {
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>;
database: SQLiteDB;
primaryKeyColumns: PrimaryKeyColumn[];
onDestroy(): void;
}> = {},
): Promise<CoreDatabaseTable<DBRecord, PrimaryKeyColumn>> {
const siteId = options.siteId ?? this.getCurrentSiteId();
@ -176,6 +177,8 @@ export class CoreSitesProvider {
options.primaryKeyColumns,
);
options.onDestroy && table.addListener({ onDestroy: options.onDestroy });
await table.initialize();
promisedTable.resolve(table as unknown as CoreDatabaseTable);
@ -1833,16 +1836,19 @@ export class CoreSitesProvider {
* @returns Scehmas Table.
*/
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, {
siteId: site.getId(),
siteId: siteId,
database: site.getDb(),
config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager },
primaryKeyColumns: ['name'],
onDestroy: () => delete this.schemasTables[siteId],
}),
);
return this.schemasTables[site.getId()];
return this.schemasTables[siteId];
}
}