MOBILE-3821 core: Fix databases clean up
parent
84afd1ea4d
commit
d80ba6698b
|
@ -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],
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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],
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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],
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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];
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue