Skip to content

Commit

Permalink
Merge pull request #3514 from NoelDeMartin/MOBILE-4081
Browse files Browse the repository at this point in the history
MOBILE-4081 core: Use inmemory database singletons
  • Loading branch information
dpalou authored Dec 19, 2022
2 parents 9cb4819 + d786b7d commit a7b5091
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/core/classes/database/eager-database-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

import { CoreError } from '@classes/errors/error';
import { SQLiteDBRecordValues } from '@classes/sqlitedb';
import { CoreInMemoryDatabaseTable } from './inmemory-database-table';
import {
CoreDatabaseTable,
CoreDatabaseConditions,
GetDBRecordPrimaryKey,
CoreDatabaseReducer,
Expand All @@ -32,7 +32,7 @@ export class CoreEagerDatabaseTable<
DBRecord extends SQLiteDBRecordValues = SQLiteDBRecordValues,
PrimaryKeyColumn extends keyof DBRecord = 'id',
PrimaryKey extends GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn> = GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn>
> extends CoreDatabaseTable<DBRecord, PrimaryKeyColumn, PrimaryKey> {
> extends CoreInMemoryDatabaseTable<DBRecord, PrimaryKeyColumn, PrimaryKey> {

protected records: Record<string, DBRecord> = {};

Expand Down
73 changes: 73 additions & 0 deletions src/core/classes/database/inmemory-database-table.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// (C) Copyright 2015 Moodle Pty Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import { CoreConstants } from '@/core/constants';
import { SQLiteDB, SQLiteDBRecordValues } from '@classes/sqlitedb';
import { CoreLogger } from '@singletons/logger';
import { CoreDatabaseTable, GetDBRecordPrimaryKey } from './database-table';

/**
* Database wrapper that caches database records in memory to speed up read operations.
*
* Extensions of this class should only be used as singletons, or the data integrity of the inmemory cache
* could be compromised.
*/
export abstract class CoreInMemoryDatabaseTable<
DBRecord extends SQLiteDBRecordValues = SQLiteDBRecordValues,
PrimaryKeyColumn extends keyof DBRecord = 'id',
PrimaryKey extends GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn> = GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn>
> extends CoreDatabaseTable<DBRecord, PrimaryKeyColumn, PrimaryKey> {

private static readonly ACTIVE_TABLES: WeakMap<SQLiteDB, Set<string>> = new WeakMap();
private static readonly LOGGER: CoreLogger = CoreLogger.getInstance('CoreInMemoryDatabaseTable');

/**
* @inheritdoc
*/
async initialize(): Promise<void> {
await super.initialize();

const activeTables = CoreInMemoryDatabaseTable.ACTIVE_TABLES.get(this.database) ?? new Set();

if (activeTables.has(this.tableName)) {
const message = `Trying to create multiple instances of an in-memory table for '${this.tableName}', ` +
'use singletons instead.';

if (!CoreConstants.BUILD.isProduction) {
throw new Error(message);
}

CoreInMemoryDatabaseTable.LOGGER.warn(message);
}

activeTables.add(this.tableName);
CoreInMemoryDatabaseTable.ACTIVE_TABLES.set(this.database, activeTables);
}

/**
* @inheritdoc
*/
async destroy(): Promise<void> {
await super.destroy();

const activeTables = CoreInMemoryDatabaseTable.ACTIVE_TABLES.get(this.database);

activeTables?.delete(this.tableName);

if (activeTables?.size === 0) {
CoreInMemoryDatabaseTable.ACTIVE_TABLES.delete(this.database);
}
}

}
4 changes: 2 additions & 2 deletions src/core/classes/database/lazy-database-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

import { CoreError } from '@classes/errors/error';
import { SQLiteDBRecordValues } from '@classes/sqlitedb';
import { CoreInMemoryDatabaseTable } from './inmemory-database-table';
import {
CoreDatabaseConfiguration,
CoreDatabaseTable,
CoreDatabaseConditions,
GetDBRecordPrimaryKey,
CoreDatabaseQueryOptions,
Expand All @@ -32,7 +32,7 @@ export class CoreLazyDatabaseTable<
DBRecord extends SQLiteDBRecordValues = SQLiteDBRecordValues,
PrimaryKeyColumn extends keyof DBRecord = 'id',
PrimaryKey extends GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn> = GetDBRecordPrimaryKey<DBRecord, PrimaryKeyColumn>
> extends CoreDatabaseTable<DBRecord, PrimaryKeyColumn, PrimaryKey> {
> extends CoreInMemoryDatabaseTable<DBRecord, PrimaryKeyColumn, PrimaryKey> {

protected readonly DEFAULT_CACHE_LIFETIME = 60000;

Expand Down

0 comments on commit a7b5091

Please sign in to comment.