Use FTS5 optimizer in production

This commit is contained in:
Fedor Indutny 2023-10-11 01:55:32 +02:00 committed by GitHub
parent f5c18cfb51
commit e124730cb0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 200 additions and 42 deletions

View file

@ -6,6 +6,7 @@ import { keyBy } from 'lodash';
import { v4 as generateUuid } from 'uuid';
import type { LoggerType } from '../../types/Logging';
import { isProduction } from '../../util/version';
import {
getSchemaVersion,
getUserVersion,
@ -2019,7 +2020,53 @@ export class DBVersionFromFutureError extends Error {
override name = 'DBVersionFromFutureError';
}
export function updateSchema(db: Database, logger: LoggerType): void {
export function lazyFTS5SecureDelete(
db: Database,
logger: LoggerType,
enabled: boolean
): void {
const isEnabled =
db
.prepare(
`
SELECT v FROM messages_fts_config WHERE k is 'secure-delete';
`
)
.pluck()
.get() === 1;
if (isEnabled && !enabled) {
logger.info('lazyFTS5SecureDelete: disabling, rebuilding fts5 index');
db.exec(`
-- Disable secure-delete
INSERT INTO messages_fts
(messages_fts, rank)
VALUES
('secure-delete', 0);
--- Rebuild the index to fix the corruption
INSERT INTO messages_fts
(messages_fts)
VALUES
('rebuild');
`);
} else if (!isEnabled && enabled) {
logger.info('lazyFTS5SecureDelete: enabling');
db.exec(`
-- Enable secure-delete
INSERT INTO messages_fts
(messages_fts, rank)
VALUES
('secure-delete', 1);
`);
}
}
export function updateSchema(
db: Database,
logger: LoggerType,
appVersion: string
): void {
const sqliteVersion = getSQLiteVersion(db);
const sqlcipherVersion = getSQLCipherVersion(db);
const startingVersion = getUserVersion(db);
@ -2047,6 +2094,8 @@ export function updateSchema(db: Database, logger: LoggerType): void {
runSchemaUpdate(startingVersion, db, logger);
}
lazyFTS5SecureDelete(db, logger, !isProduction(appVersion));
if (startingVersion !== MAX_VERSION) {
const start = Date.now();
db.pragma('optimize');