Simplify database migrations

This commit is contained in:
Fedor Indutny 2025-08-06 10:32:08 -07:00 committed by GitHub
commit e6809c95db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
106 changed files with 4661 additions and 6814 deletions

View file

@ -3,28 +3,16 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { ReadStatus } from '../../messages/MessageReadStatus';
import { SeenStatus } from '../../MessageSeenStatus';
import { strictAssert } from '../../util/assert';
import { sql, sqlConstant } from '../util';
export const version = 1000;
const READ_STATUS_UNREAD = sqlConstant(ReadStatus.Unread);
const READ_STATUS_READ = sqlConstant(ReadStatus.Read);
const SEEN_STATUS_UNSEEN = sqlConstant(SeenStatus.Unseen);
export function updateToSchemaVersion1000(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1000) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1000(db: Database): void {
const [selectQuery] = sql`
SELECT id
FROM messages
@ -52,9 +40,4 @@ export function updateToSchemaVersion1000(
db.prepare(updateQuery).run(updateParams);
}
db.pragma('user_version = 1000');
})();
logger.info('updateToSchemaVersion1000: success!');
}

View file

@ -3,21 +3,9 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1010;
export function updateToSchemaVersion1010(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1010) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1010(db: Database): void {
const [createTable] = sql`
CREATE TABLE callLinks (
roomId TEXT NOT NULL PRIMARY KEY,
@ -32,9 +20,4 @@ export function updateToSchemaVersion1010(
`;
db.exec(createTable);
db.pragma('user_version = 1010');
})();
logger.info('updateToSchemaVersion1010: success!');
}

View file

@ -6,23 +6,14 @@ import { sql } from '../util';
import type { WritableDB } from '../Interface';
import { getOurUuid } from './41-uuid-keys';
export const version = 1020;
export function updateToSchemaVersion1020(
currentVersion: number,
export default function updateToSchemaVersion1020(
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1020) {
return;
}
db.transaction(() => {
const ourAci = getOurUuid(db);
if (ourAci == null) {
logger.info('updateToSchemaVersion1020: not linked');
db.pragma('user_version = 1020');
logger.info('not linked');
return;
}
@ -36,8 +27,7 @@ export function updateToSchemaVersion1020(
})
.get(selectParams);
if (ourConversationId == null) {
logger.error('updateToSchemaVersion1020: no conversation');
db.pragma('user_version = 1020');
logger.error('no conversation');
return;
}
@ -49,11 +39,6 @@ export function updateToSchemaVersion1020(
`;
const { changes } = db.prepare(deleteQuery).run(deleteParams);
if (changes !== 0) {
logger.warn(`updateToSchemaVersion1020: removed ${changes} self merges`);
logger.warn(`removed ${changes} self merges`);
}
db.pragma('user_version = 1020');
})();
logger.info('updateToSchemaVersion1020: success!');
}

View file

@ -3,21 +3,9 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql, sqlFragment } from '../util';
export const version = 1030;
export function updateToSchemaVersion1030(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1030) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1030(db: Database): void {
// From migration 81
const shouldAffectActivityOrPreview = sqlFragment`
type IS NULL
@ -79,9 +67,4 @@ export function updateToSchemaVersion1030(
`;
db.exec(updateShouldAffectPreview);
db.pragma('user_version = 1030');
})();
logger.info('updateToSchemaVersion1030: success!');
}

View file

@ -20,8 +20,6 @@ import {
type JobManagerJobType,
} from '../../jobs/JobManager';
export const version = 1040;
export type _AttachmentDownloadJobTypeV1030 = {
attachment: AttachmentType;
attempts: number;
@ -56,16 +54,10 @@ export type _AttachmentDownloadJobTypeV1040 = Omit<
'attachmentSignature' | 'originalSource'
> & { digest: string };
export function updateToSchemaVersion1040(
currentVersion: number,
export default function updateToSchemaVersion1040(
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1040) {
return;
}
db.transaction(() => {
// 1. Load all existing rows into memory (shouldn't be many)
const existingJobs: Array<{
id: string | null;
@ -79,9 +71,7 @@ export function updateToSchemaVersion1040(
`
)
.all();
logger.info(
`updateToSchemaVersion1040: loaded ${existingJobs.length} existing jobs`
);
logger.info(`loaded ${existingJobs.length} existing jobs`);
// 2. Create new temp table, with a couple new columns and stricter typing
db.exec(`
@ -171,24 +161,19 @@ export function updateToSchemaVersion1040(
ciphertextSize: 0,
};
const parsed = parsePartial(
attachmentDownloadJobSchemaV1040,
updatedJob
);
const parsed = parsePartial(attachmentDownloadJobSchemaV1040, updatedJob);
rowsToTransfer.push(parsed);
} catch {
logger.warn(
`updateToSchemaVersion1040: unable to transfer job ${existingJob.id} to new table; invalid data`
`unable to transfer job ${existingJob.id} to new table; invalid data`
);
}
}
let numTransferred = 0;
if (rowsToTransfer.length) {
logger.info(
`updateToSchemaVersion1040: transferring ${rowsToTransfer.length} rows`
);
logger.info(`transferring ${rowsToTransfer.length} rows`);
for (const row of rowsToTransfer) {
const [insertQuery, insertParams] = sql`
INSERT INTO attachment_downloads
@ -226,22 +211,14 @@ export function updateToSchemaVersion1040(
db.prepare(insertQuery).run(insertParams);
numTransferred += 1;
} catch (error) {
logger.error(
'updateToSchemaVersion1040: error when transferring row',
error
);
logger.error('error when transferring row', error);
}
}
}
logger.info(
`updateToSchemaVersion1040: transferred ${numTransferred} rows, removed ${
`transferred ${numTransferred} rows, removed ${
existingJobs.length - numTransferred
}`
);
db.pragma('user_version = 1040');
})();
logger.info('updateToSchemaVersion1040: success!');
}

View file

@ -3,21 +3,9 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1050;
export function updateToSchemaVersion1050(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1050) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1050(db: Database): void {
const [createTables] = sql`
DROP TABLE IF EXISTS groupSendCombinedEndorsement;
DROP TABLE IF EXISTS groupSendMemberEndorsement;
@ -42,9 +30,4 @@ export function updateToSchemaVersion1050(
`;
db.exec(createTables);
db.pragma('user_version = 1050');
})();
logger.info('updateToSchemaVersion1050: success!');
}

View file

@ -3,20 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1060;
export function updateToSchemaVersion1060(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1060) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1060(db: Database): void {
db.exec(`
ALTER TABLE messages
ADD COLUMN isAddressableMessage INTEGER
@ -48,9 +35,4 @@ export function updateToSchemaVersion1060(
createdAt, sentAt, id
)
`);
db.pragma('user_version = 1060');
})();
logger.info('updateToSchemaVersion1060: success!');
}

View file

@ -3,20 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1070;
export function updateToSchemaVersion1070(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1070) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1070(db: Database): void {
db.exec(`
CREATE TABLE attachment_backup_jobs (
mediaName TEXT NOT NULL PRIMARY KEY,
@ -47,9 +34,4 @@ export function updateToSchemaVersion1070(
sizeOnBackupCdn INTEGER
) STRICT;
`);
db.pragma('user_version = 1070');
})();
logger.info('updateToSchemaVersion1070: success!');
}

View file

@ -3,29 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1080;
export function updateToSchemaVersion1080(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1080) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1080(db: Database): void {
db.exec(`
CREATE INDEX messages_by_date_addressable_nondisappearing
ON messages (
conversationId, isAddressableMessage, received_at, sent_at
) WHERE expireTimer IS NULL;
`);
db.pragma('user_version = 1080');
})();
logger.info('updateToSchemaVersion1080: success!');
}

View file

@ -3,20 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1090;
export function updateToSchemaVersion1090(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1090) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1090(db: Database): void {
db.exec(`
CREATE INDEX reactions_messageId
ON reactions (messageId);
@ -24,9 +11,4 @@ export function updateToSchemaVersion1090(
CREATE INDEX storyReads_storyId
ON storyReads (storyId);
`);
db.pragma('user_version = 1090');
})();
logger.info('updateToSchemaVersion1090: success!');
}

View file

@ -2,21 +2,9 @@
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1100;
export function updateToSchemaVersion1100(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1100) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1100(db: Database): void {
const [query] = sql`
-- Fix: Query went from readStatus to seenStatus but index wasn't updated
DROP INDEX IF EXISTS messages_callHistory_readStatus;
@ -55,9 +43,4 @@ export function updateToSchemaVersion1100(
`;
db.exec(query);
db.pragma('user_version = 1100');
})();
logger.info('updateToSchemaVersion1100: success!');
}

View file

@ -3,20 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1110;
export function updateToSchemaVersion1110(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1110) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1110(db: Database): void {
db.exec(`
ALTER TABLE stickers
ADD COLUMN version INTEGER NOT NULL DEFAULT 1;
@ -27,9 +14,4 @@ export function updateToSchemaVersion1110(
ALTER TABLE stickers
ADD COLUMN size INTEGER;
`);
db.pragma('user_version = 1110');
})();
logger.info('updateToSchemaVersion1110: success!');
}

View file

@ -3,20 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1120;
export function updateToSchemaVersion1120(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1120) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1120(db: Database): void {
/** Adds indexes for all tables with foreign key relationships to messages(id) */
db.exec(`
CREATE INDEX edited_messages_messageId
@ -25,9 +12,4 @@ export function updateToSchemaVersion1120(
CREATE INDEX mentions_messageId
ON mentions(messageId);
`);
db.pragma('user_version = 1120');
})();
logger.info('updateToSchemaVersion1120: success!');
}

View file

@ -3,29 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1130;
export function updateToSchemaVersion1130(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1130) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1130(db: Database): void {
// This is to improve the performance of getAllStories
db.exec(`
CREATE INDEX messages_isStory
ON messages(received_at, sent_at)
WHERE isStory = 1;
`);
db.pragma('user_version = 1130');
})();
logger.info('updateToSchemaVersion1130: success!');
}

View file

@ -1,20 +1,8 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1140;
export function updateToSchemaVersion1140(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1140) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1140(db: Database): void {
db.exec(`
DROP INDEX IF EXISTS callLinks_deleted;
@ -24,8 +12,4 @@ export function updateToSchemaVersion1140(
CREATE INDEX callLinks_deleted
ON callLinks (deleted, roomId);
`);
db.pragma('user_version = 1140');
})();
logger.info('updateToSchemaVersion1140: success!');
}

View file

@ -1,20 +1,8 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1150;
export function updateToSchemaVersion1150(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1150) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1150(db: Database): void {
db.exec(`
-- All future conversations will start from '1'
ALTER TABLE conversations
@ -23,8 +11,4 @@ export function updateToSchemaVersion1150(
-- All current conversations will start from '2'
UPDATE conversations SET expireTimerVersion = 2;
`);
db.pragma('user_version = 1150');
})();
logger.info('updateToSchemaVersion1150: success!');
}

View file

@ -1,25 +1,13 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql, sqlConstant } from '../util';
import { CallDirection, CallStatusValue } from '../../types/CallDisposition';
export const version = 1160;
const CALL_STATUS_MISSED = sqlConstant(CallStatusValue.Missed);
const CALL_DIRECTION_INCOMING = sqlConstant(CallDirection.Incoming);
export function updateToSchemaVersion1160(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1160) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1160(db: Database): void {
const [query] = sql`
DROP INDEX IF EXISTS callsHistory_incoming_missed;
@ -29,8 +17,4 @@ export function updateToSchemaVersion1160(
AND direction IS ${CALL_DIRECTION_INCOMING};
`;
db.exec(query);
db.pragma('user_version = 1160');
})();
logger.info('updateToSchemaVersion1160: success!');
}

View file

@ -1,20 +1,9 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1170;
export function updateToSchemaVersion1170(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1170) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1170(db: Database): void {
const [query] = sql`
DROP INDEX IF EXISTS messages_callHistory_markReadBefore;
CREATE INDEX messages_callHistory_markReadBefore
@ -22,8 +11,4 @@ export function updateToSchemaVersion1170(
WHERE type IS 'call-history';
`;
db.exec(query);
db.pragma('user_version = 1170');
})();
logger.info('updateToSchemaVersion1170: success!');
}

View file

@ -1,20 +1,9 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { AttachmentDownloadSource } from '../Interface';
export const version = 1180;
export function updateToSchemaVersion1180(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1180) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1180(db: Database): void {
db.exec(`
ALTER TABLE attachment_downloads
ADD COLUMN source TEXT NOT NULL DEFAULT ${AttachmentDownloadSource.STANDARD};
@ -30,8 +19,4 @@ export function updateToSchemaVersion1180(
source, ciphertextSize
);
`);
db.pragma('user_version = 1180');
})();
logger.info('updateToSchemaVersion1180: success!');
}

View file

@ -1,20 +1,8 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1190;
export function updateToSchemaVersion1190(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1190) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1190(db: Database): void {
db.exec(`
ALTER TABLE callLinks ADD COLUMN storageID TEXT;
ALTER TABLE callLinks ADD COLUMN storageVersion INTEGER;
@ -31,8 +19,4 @@ export function updateToSchemaVersion1190(
).run({
deletedAt: new Date().getTime(),
});
db.pragma('user_version = 1190');
})();
logger.info('updateToSchemaVersion1190: success!');
}

View file

@ -1,19 +1,8 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1200;
export function updateToSchemaVersion1200(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1200) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1200(db: Database): void {
// The standard getNextAttachmentDownloadJobs query uses active & source conditions,
// ordered by received_at
db.exec(`
@ -22,8 +11,4 @@ export function updateToSchemaVersion1200(
active, source, receivedAt
);
`);
db.pragma('user_version = 1200');
})();
logger.info('updateToSchemaVersion1200: success!');
}

View file

@ -1,19 +1,8 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1210;
export function updateToSchemaVersion1210(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1210) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1210(db: Database): void {
// The standard getNextAttachmentDownloadJobs query uses active & source conditions,
// ordered by received_at
db.exec(`
@ -23,8 +12,4 @@ export function updateToSchemaVersion1210(
ALTER TABLE callsHistory
ADD COLUMN endedTimestamp INTEGER DEFAULT NULL;
`);
db.pragma('user_version = 1210');
})();
logger.info('updateToSchemaVersion1210: success!');
}

View file

@ -120,16 +120,10 @@ function migrateSession(
throw missingCaseError(session.version);
}
export function updateToSchemaVersion1220(
currentVersion: number,
export default function updateToSchemaVersion1220(
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1220) {
return;
}
db.transaction(() => {
db.exec(`
ALTER TABLE sessions
RENAME TO old_sessions;
@ -158,9 +152,8 @@ export function updateToSchemaVersion1220(
// If we don't have private keys - the sessions cannot be used anyway
if (!identityKeyMapJson || !registrationIdMapJson) {
logger.info('updateToSchemaVersion1220: no identity/registration id');
logger.info('no identity/registration id');
db.exec('DROP TABLE old_sessions');
db.pragma('user_version = 1220');
return;
}
@ -199,21 +192,12 @@ export function updateToSchemaVersion1220(
migrated += 1;
} catch (error) {
failed += 1;
logger.error(
'updateToSchemaVersion1220: failed to migrate session',
Errors.toLogFormat(error)
);
logger.error('failed to migrate session', Errors.toLogFormat(error));
}
}
}
logger.info(
`updateToSchemaVersion1220: migrated ${migrated} sessions, ` +
`${failed} failed`
);
logger.info(`migrated ${migrated} sessions, ${failed} failed`);
db.exec('DROP TABLE old_sessions');
db.pragma('user_version = 1220');
})();
logger.info('updateToSchemaVersion1220: success!');
}

View file

@ -1,28 +1,12 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1230;
export function updateToSchemaVersion1230(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1230) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1230(db: Database): void {
db.exec(`
DROP INDEX IF EXISTS callLinks_adminKey;
CREATE INDEX callLinks_adminKey
ON callLinks (adminKey);
`);
db.pragma('user_version = 1230');
})();
logger.info('updateToSchemaVersion1230: success!');
}

View file

@ -3,21 +3,9 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1240;
export function updateToSchemaVersion1240(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1240) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1240(db: Database): void {
const [createTable] = sql`
CREATE TABLE defunctCallLinks (
roomId TEXT NOT NULL PRIMARY KEY,
@ -27,9 +15,4 @@ export function updateToSchemaVersion1240(
`;
db.exec(createTable);
db.pragma('user_version = 1240');
})();
logger.info('updateToSchemaVersion1240: success!');
}

View file

@ -1,28 +1,12 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 1250;
export function updateToSchemaVersion1250(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1250) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1250(db: Database): void {
db.exec(`
ALTER TABLE defunctCallLinks ADD COLUMN storageID TEXT;
ALTER TABLE defunctCallLinks ADD COLUMN storageVersion INTEGER;
ALTER TABLE defunctCallLinks ADD COLUMN storageUnknownFields BLOB;
ALTER TABLE defunctCallLinks ADD COLUMN storageNeedsSync INTEGER NOT NULL DEFAULT 0;
`);
db.pragma('user_version = 1250');
})();
logger.info('updateToSchemaVersion1250: success!');
}

View file

@ -1,30 +1,13 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1260;
export function updateToSchemaVersion1260(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1260) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1260(db: Database): void {
const [query] = sql`
DROP INDEX IF EXISTS syncTasks_order;
CREATE INDEX syncTasks_delete ON syncTasks (attempts DESC);
`;
db.exec(query);
db.pragma('user_version = 1260');
})();
logger.info('updateToSchemaVersion1260: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1270;
export function updateToSchemaVersion1270(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1270) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1270(db: Database): void {
const [query] = sql`
ALTER TABLE messages
ADD COLUMN timestamp INTEGER;
@ -45,9 +33,4 @@ export function updateToSchemaVersion1270(
`;
db.exec(query);
db.pragma('user_version = 1270');
})();
logger.info('updateToSchemaVersion1270: success!');
}

View file

@ -14,18 +14,10 @@ import { sql } from '../util';
import type { WritableDB } from '../Interface';
import { getOurUuid } from './41-uuid-keys';
export const version = 1280;
export function updateToSchemaVersion1280(
currentVersion: number,
export default function updateToSchemaVersion1280(
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1280) {
return;
}
db.transaction(() => {
const ourAci = getOurUuid(db);
let rows = db.prepare('SELECT * FROM unprocessed').all();
@ -86,9 +78,7 @@ export function updateToSchemaVersion1280(
if (!ourAci) {
if (rows.length) {
logger.warn(
`updateToSchemaVersion1280: no aci, dropping ${rows.length} envelopes`
);
logger.warn(`no aci, dropping ${rows.length} envelopes`);
rows = [];
}
}
@ -146,10 +136,7 @@ export function updateToSchemaVersion1280(
'Envelope.destinationServiceId'
) ?? null,
updatedPni: isUntaggedPniString(decoded.updatedPni)
? normalizePni(
toTaggedPni(decoded.updatedPni),
'Envelope.updatedPni'
)
? normalizePni(toTaggedPni(decoded.updatedPni), 'Envelope.updatedPni')
: null,
// Sadly not captured previously
messageAgeSec: 0,
@ -158,22 +145,11 @@ export function updateToSchemaVersion1280(
: null,
});
} catch (error) {
logger.warn(
'updateToSchemaVersion1280: failed to migrate unprocessed',
id,
error
);
logger.warn('failed to migrate unprocessed', id, error);
}
}
if (oldEnvelopes !== 0) {
logger.warn(
`updateToSchemaVersion1280: dropped ${oldEnvelopes} envelopes`
);
logger.warn(`dropped ${oldEnvelopes} envelopes`);
}
db.pragma('user_version = 1280');
})();
logger.info('updateToSchemaVersion1280: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
import type { WritableDB } from '../Interface';
export const version = 1290;
export function updateToSchemaVersion1290(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1290) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1290(db: WritableDB): void {
const [query] = sql`
ALTER TABLE unprocessed RENAME COLUMN sourceDevice TO legacySourceDevice;
ALTER TABLE unprocessed ADD COLUMN sourceDevice INTEGER;
@ -26,9 +14,4 @@ export function updateToSchemaVersion1290(
ALTER TABLE unprocessed DROP COLUMN legacySourceDevice;
`;
db.exec(query);
db.pragma('user_version = 1290');
})();
logger.info('updateToSchemaVersion1290: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
import type { WritableDB } from '../Interface';
export const version = 1300;
export function updateToSchemaVersion1300(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1300) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1300(db: WritableDB): void {
const [query] = sql`
ALTER TABLE sticker_references
ADD COLUMN stickerId INTEGER NOT NULL DEFAULT -1;
@ -27,9 +15,4 @@ export function updateToSchemaVersion1300(
WHERE isUnresolved IS 1;
`;
db.exec(query);
db.pragma('user_version = 1300');
})();
logger.info('updateToSchemaVersion1300: success!');
}

View file

@ -4,21 +4,13 @@ import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
import type { WritableDB } from '../Interface';
export const version = 1310;
// Value from ts/util/timestamp.ts at the time of creation of this migration
const MAX_SAFE_DATE = 8640000000000000;
export function updateToSchemaVersion1310(
currentVersion: number,
export default function updateToSchemaVersion1310(
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1310) {
return;
}
db.transaction(() => {
const [query, params] = sql`
UPDATE conversations
SET json = json_replace(
@ -30,11 +22,6 @@ export function updateToSchemaVersion1310(
`;
const { changes } = db.prepare(query).run(params);
if (changes !== 0) {
logger.warn(`updateToSchemaVersion1310: fixed ${changes} conversations`);
logger.warn(`fixed ${changes} conversations`);
}
db.pragma('user_version = 1310');
})();
logger.info('updateToSchemaVersion1310: success!');
}

View file

@ -1,22 +1,10 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
import type { WritableDB } from '../Interface';
export const version = 1320;
export function updateToSchemaVersion1320(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1320) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1320(db: WritableDB): void {
const [query] = sql`
DROP INDEX unprocessed_timestamp;
@ -30,9 +18,4 @@ export function updateToSchemaVersion1320(
(receivedAtDate);
`;
db.exec(query);
db.pragma('user_version = 1320');
})();
logger.info('updateToSchemaVersion1320: success!');
}

View file

@ -1,29 +1,12 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1330;
export function updateToSchemaVersion1330(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1330) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1330(db: Database): void {
const [query] = sql`
CREATE INDEX syncTasks_type ON syncTasks (type);
`;
db.exec(query);
db.pragma('user_version = 1330');
})();
logger.info('updateToSchemaVersion1330: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1340;
export function updateToSchemaVersion1340(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1340) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1340(db: Database): void {
const [query] = sql`
CREATE TABLE recentGifs (
id TEXT NOT NULL PRIMARY KEY,
@ -36,9 +24,4 @@ export function updateToSchemaVersion1340(
`;
db.exec(query);
db.pragma('user_version = 1340');
})();
logger.info('updateToSchemaVersion1340: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export const version = 1350;
export function updateToSchemaVersion1350(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 1350) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1350(db: Database): void {
const [query] = sql`
CREATE TABLE notificationProfiles(
id TEXT PRIMARY KEY NOT NULL,
@ -50,9 +38,4 @@ export function updateToSchemaVersion1350(
`;
db.exec(query);
db.pragma('user_version = 1350');
})();
logger.info('updateToSchemaVersion1350: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import type { WritableDB } from '../Interface';
export const version = 1360;
export function updateToSchemaVersion1360(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1360) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1360(db: WritableDB): void {
db.exec(`
DROP TABLE IF EXISTS message_attachments;
`);
@ -111,9 +99,4 @@ export function updateToSchemaVersion1360(
// 'CREATE INDEX message_attachments_all_backupThumbnailPath
// ON message_attachments (backupThumbnailPath);'
// );
db.pragma('user_version = 1360');
})();
logger.info('updateToSchemaVersion1360: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import type { WritableDB } from '../Interface';
export const version = 1370;
export function updateToSchemaVersion1370(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1370) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1370(db: WritableDB): void {
db.exec(`
DROP INDEX IF EXISTS message_attachments_messageId;
DROP INDEX IF EXISTS message_attachments_plaintextHash;
@ -24,8 +12,4 @@ export function updateToSchemaVersion1370(
DROP INDEX IF EXISTS message_attachments_all_screenshotPath;
DROP INDEX IF EXISTS message_attachments_all_backupThumbnailPath;
`);
db.pragma('user_version = 1370');
})();
logger.info('updateToSchemaVersion1370: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import type { WritableDB } from '../Interface';
export const version = 1380;
export function updateToSchemaVersion1380(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1380) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1380(db: WritableDB): void {
db.exec(`
CREATE TABLE donationReceipts(
id TEXT NOT NULL PRIMARY KEY,
@ -28,8 +16,4 @@ export function updateToSchemaVersion1380(
CREATE INDEX donationReceipts_byTimestamp on donationReceipts(timestamp);
`);
db.pragma('user_version = 1380');
})();
logger.info('updateToSchemaVersion1380: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { type WritableDB } from '../Interface';
export const version = 1390;
export function updateToSchemaVersion1390(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1390) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1390(db: WritableDB): void {
// TODO: DESKTOP-8879 Digest column is only used for deduplication purposes; here we
// genericize its name to attachmentSignature to allow jobs to be added with
// plaintextHash and no digest
@ -45,9 +33,4 @@ export function updateToSchemaVersion1390(
UPDATE message_attachments
SET backupCdnNumber = NULL;
`);
db.pragma('user_version = 1390');
})();
logger.info('updateToSchemaVersion1390: success!');
}

View file

@ -1,27 +1,11 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import type { WritableDB } from '../Interface';
export const version = 1400;
export function updateToSchemaVersion1400(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1400) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1400(db: WritableDB): void {
db.exec(`
ALTER TABLE donationReceipts DROP COLUMN paymentDetailJson;
ALTER TABLE donationReceipts DROP COLUMN paymentType;
`);
db.pragma('user_version = 1400');
})();
logger.info('updateToSchemaVersion1400: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { type WritableDB } from '../Interface';
export const version = 1410;
export function updateToSchemaVersion1410(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1410) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1410(db: WritableDB): void {
db.exec(`
UPDATE conversations
SET json = json_remove(json,
@ -33,9 +21,4 @@ export function updateToSchemaVersion1410(
'defaultAutoBubbleColor'
);
`);
db.pragma('user_version = 1410');
})();
logger.info('updateToSchemaVersion1410: success!');
}

View file

@ -1,21 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { AttachmentDownloadSource, type WritableDB } from '../Interface';
export const version = 1420;
export function updateToSchemaVersion1420(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 1420) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion1420(db: WritableDB): void {
db.exec(`
ALTER TABLE attachment_downloads
ADD COLUMN originalSource TEXT NOT NULL DEFAULT ${AttachmentDownloadSource.STANDARD};
@ -62,9 +50,4 @@ export function updateToSchemaVersion1420(
WHERE id = 0;
END;
`);
db.pragma('user_version = 1420');
})();
logger.info('updateToSchemaVersion1420: success!');
}

View file

@ -25,14 +25,9 @@ export function getOurUuid(db: ReadableDB): string | undefined {
}
export default function updateToSchemaVersion41(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 41) {
return;
}
const getConversationUuid = db.prepare(
`
SELECT uuid
@ -377,7 +372,6 @@ export default function updateToSchemaVersion41(
logger.info(`Migrated ${migrated} identity keys`);
};
db.transaction(() => {
db.exec(
`
-- Change type of 'id' column from INTEGER to STRING
@ -420,13 +414,9 @@ export default function updateToSchemaVersion41(
const deleteCount = clearSessionsAndKeys();
if (deleteCount > 0) {
logger.error(
'updateToSchemaVersion41: no uuid is available, ' +
`erased ${deleteCount} sessions/keys`
);
logger.error(`no uuid is available, erased ${deleteCount} sessions/keys`);
}
db.pragma('user_version = 41');
return;
}
@ -439,8 +429,4 @@ export default function updateToSchemaVersion41(
moveIdentityKeyToMap(ourUuid);
updateIdentityKeys();
db.pragma('user_version = 41');
})();
logger.info('updateToSchemaVersion41: success!');
}

View file

@ -6,15 +6,9 @@ import type { WritableDB } from '../Interface';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion42(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 42) {
return;
}
db.transaction(() => {
// First, recreate messages table delete trigger with reaction support
db.exec(`
@ -56,10 +50,7 @@ export default function updateToSchemaVersion42(
}
});
function deleteReactions(
rowids: ReadonlyArray<number>,
persistent: boolean
) {
function deleteReactions(rowids: ReadonlyArray<number>, persistent: boolean) {
db.prepare(
`
DELETE FROM reactions
@ -73,8 +64,4 @@ export default function updateToSchemaVersion42(
logger.info(`Deleting ${reactionsToDelete.length} orphaned reactions`);
batchMultiVarQuery(db, reactionsToDelete, deleteReactions);
}
db.pragma('user_version = 42');
})();
logger.info('updateToSchemaVersion42: success!');
}

View file

@ -33,14 +33,9 @@ type ConversationType = Readonly<{
}>;
export default function updateToSchemaVersion43(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 43) {
return;
}
type LegacyPendingMemberType = {
addedByUserId?: string;
conversationId: string;
@ -117,8 +112,7 @@ export default function updateToSchemaVersion43(
});
if (!uuid) {
logger.warn(
`updateToSchemaVersion43: ${logId}.${key} UUID not found ` +
`for ${member.conversationId}`
`${logId}.${key} UUID not found for ${member.conversationId}`
);
return undefined;
}
@ -158,15 +152,14 @@ export default function updateToSchemaVersion43(
if (oldValue.length !== 0) {
logger.info(
`updateToSchemaVersion43: migrated ${oldValue.length} ${key} ` +
`migrated ${oldValue.length} ${key} ` +
`entries to ${newValue.length} for ${logId}`
);
}
if (addedByCount > 0) {
logger.info(
`updateToSchemaVersion43: migrated ${addedByCount} addedByUserId ` +
`in ${key} for ${logId}`
`migrated ${addedByCount} addedByUserId in ${key} for ${logId}`
);
}
}
@ -286,7 +279,7 @@ export default function updateToSchemaVersion43(
}
if (!newValue) {
logger.warn(
`updateToSchemaVersion43: ${id}.groupV2Change.details.${key} ` +
`${id}.groupV2Change.details.${key} ` +
`UUID not found for ${oldValue}`
);
return undefined;
@ -342,7 +335,7 @@ export default function updateToSchemaVersion43(
if (!uuid) {
logger.warn(
`updateToSchemaVersion43: ${id}.invitedGV2Members UUID ` +
`${id}.invitedGV2Members UUID ` +
`not found for ${conversationId}`
);
return undefined;
@ -390,7 +383,6 @@ export default function updateToSchemaVersion43(
return true;
};
db.transaction(() => {
const allConversations = db
.prepare(
`
@ -404,8 +396,7 @@ export default function updateToSchemaVersion43(
.map(json => jsonToObject<ConversationType>(json));
logger.info(
'updateToSchemaVersion43: About to iterate through ' +
`${allConversations.length} conversations`
`About to iterate through ${allConversations.length} conversations`
);
for (const convo of allConversations) {
@ -413,10 +404,7 @@ export default function updateToSchemaVersion43(
}
const messageCount = getCountFromTable(db, 'messages');
logger.info(
'updateToSchemaVersion43: About to iterate through ' +
`${messageCount} messages`
);
logger.info(`About to iterate through ${messageCount} messages`);
let updatedCount = 0;
for (const message of new TableIterator<MessageType>(db, 'messages')) {
@ -425,9 +413,5 @@ export default function updateToSchemaVersion43(
}
}
logger.info(`updateToSchemaVersion43: Updated ${updatedCount} messages`);
db.pragma('user_version = 43');
})();
logger.info('updateToSchemaVersion43: success!');
logger.info(`Updated ${updatedCount} messages`);
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion44(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 44) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion44(db: Database): void {
db.exec(
`
CREATE TABLE badges(
@ -35,9 +24,4 @@ export default function updateToSchemaVersion44(
);
`
);
db.pragma('user_version = 44');
})();
logger.info('updateToSchemaVersion44: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion45(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 45) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion45(db: Database): void {
db.exec(
`
--- Add column to messages table
@ -129,9 +118,4 @@ export default function updateToSchemaVersion45(
)
`
);
db.pragma('user_version = 45');
})();
logger.info('updateToSchemaVersion45: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion46(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 46) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion46(db: Database): void {
db.exec(
`
--- Add column to messages table
@ -32,9 +21,4 @@ export default function updateToSchemaVersion46(
(conversationId, isStory, storyId, received_at, sent_at);
`
);
db.pragma('user_version = 46');
})();
logger.info('updateToSchemaVersion46: success!');
}

View file

@ -1,20 +1,14 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { LoggerType } from '../../types/Logging';
import { getOurUuid } from './41-uuid-keys';
import type { LoggerType } from '../../types/Logging';
import type { WritableDB } from '../Interface';
export default function updateToSchemaVersion47(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 47) {
return;
}
db.transaction(() => {
db.exec(
`
DROP INDEX messages_conversation;
@ -120,7 +114,7 @@ export default function updateToSchemaVersion47(
const ourUuid = getOurUuid(db);
if (!ourUuid) {
logger.info('updateToSchemaVersion47: our UUID not found');
logger.info('our UUID not found');
} else {
db.prepare(
`
@ -131,9 +125,4 @@ export default function updateToSchemaVersion47(
ourUuid,
});
}
db.pragma('user_version = 47');
})();
logger.info('updateToSchemaVersion47: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion48(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 48) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion48(db: Database): void {
db.exec(
`
DROP INDEX message_user_initiated;
@ -22,9 +11,4 @@ export default function updateToSchemaVersion48(
CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage);
`
);
db.pragma('user_version = 48');
})();
logger.info('updateToSchemaVersion48: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion49(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 49) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion49(db: Database): void {
db.exec(
`
DROP INDEX messages_preview;
@ -25,9 +14,4 @@ export default function updateToSchemaVersion49(
(conversationId, shouldAffectPreview, isGroupLeaveEventFromOther, received_at, sent_at);
`
);
db.pragma('user_version = 49');
})();
logger.info('updateToSchemaVersion49: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion50(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 50) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion50(db: Database): void {
db.exec(
`
DROP INDEX messages_unread;
@ -24,9 +13,4 @@ export default function updateToSchemaVersion50(
(conversationId, readStatus, isStory, storyId, received_at, sent_at) WHERE readStatus IS NOT NULL;
`
);
db.pragma('user_version = 50');
})();
logger.info('updateToSchemaVersion50: success!');
}

View file

@ -7,15 +7,9 @@ import type { WritableDB } from '../Interface';
import { getJobsInQueue, insertJob } from '../Server';
export default function updateToSchemaVersion51(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 51) {
return;
}
db.transaction(() => {
const deleteJobsInQueue = db.prepare(
'DELETE FROM jobs WHERE queueType = $queueType'
);
@ -32,33 +26,25 @@ export default function updateToSchemaVersion51(
const { data, id } = job;
if (!isRecord(data)) {
logger.warn(
`updateToSchemaVersion51: reactions queue job ${id} was missing valid data`
);
logger.warn(`reactions queue job ${id} was missing valid data`);
return;
}
const { messageId } = data;
if (typeof messageId !== 'string') {
logger.warn(
`updateToSchemaVersion51: reactions queue job ${id} had a non-string messageId`
);
logger.warn(`reactions queue job ${id} had a non-string messageId`);
return;
}
const message = getMessageById.get([messageId]);
if (!message) {
logger.warn(
`updateToSchemaVersion51: Unable to find message for reaction job ${id}`
);
logger.warn(`Unable to find message for reaction job ${id}`);
return;
}
const { conversationId } = message;
if (typeof conversationId !== 'string') {
logger.warn(
`updateToSchemaVersion51: reactions queue job ${id} had a non-string conversationId`
);
logger.warn(`reactions queue job ${id} had a non-string conversationId`);
return;
}
@ -83,9 +69,7 @@ export default function updateToSchemaVersion51(
const { data, id } = job;
if (!isRecord(data)) {
logger.warn(
`updateToSchemaVersion51: normal send queue job ${id} was missing valid data`
);
logger.warn(`normal send queue job ${id} was missing valid data`);
return;
}
@ -100,9 +84,4 @@ export default function updateToSchemaVersion51(
insertJob(db, newJob);
});
db.pragma('user_version = 51');
})();
logger.info('updateToSchemaVersion51: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion52(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 52) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion52(db: Database): void {
db.exec(
`
-- Create indices that don't have storyId in them so that
@ -30,9 +19,4 @@ export default function updateToSchemaVersion52(
WHERE readStatus IS NOT NULL;
`
);
db.pragma('user_version = 52');
})();
logger.info('updateToSchemaVersion52: success!');
}

View file

@ -7,14 +7,9 @@ import type { LoggerType } from '../../types/Logging';
import { jsonToObject } from '../util';
export default function updateToSchemaVersion53(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 53) {
return;
}
type LegacyConversationType = {
id: string;
groupId: string;
@ -52,7 +47,7 @@ export default function updateToSchemaVersion53(
};
logger.info(
`updateToSchemaVersion53: Updating ${logId} with ` +
`Updating ${logId} with ` +
`${legacy.bannedMembersV2.length} banned members`
);
@ -64,7 +59,6 @@ export default function updateToSchemaVersion53(
return true;
};
db.transaction(() => {
const allConversations = db
.prepare(
`
@ -79,8 +73,7 @@ export default function updateToSchemaVersion53(
.map(json => jsonToObject<ConversationType>(json));
logger.info(
'updateToSchemaVersion53: About to iterate through ' +
`${allConversations.length} conversations`
`About to iterate through ${allConversations.length} conversations`
);
let updated = 0;
@ -88,9 +81,5 @@ export default function updateToSchemaVersion53(
updated += upgradeConversation(convo) ? 1 : 0;
}
logger.info(`updateToSchemaVersion53: Updated ${updated} conversations`);
db.pragma('user_version = 53');
})();
logger.info('updateToSchemaVersion53: success!');
logger.info(`Updated ${updated} conversations`);
}

View file

@ -3,25 +3,10 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion54(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 54) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion54(db: Database): void {
db.exec(
`
ALTER TABLE unprocessed ADD COLUMN receivedAtCounter INTEGER;
`
);
db.pragma('user_version = 54');
})();
logger.info('updateToSchemaVersion54: success!');
}

View file

@ -8,15 +8,9 @@ import { isRecord } from '../../util/isRecord';
import { isIterable } from '../../util/iterables';
export default function updateToSchemaVersion55(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 55) {
return;
}
db.transaction(() => {
const deleteJobsInQueue = db.prepare(
'DELETE FROM jobs WHERE queueType = $queueType'
);
@ -29,24 +23,18 @@ export default function updateToSchemaVersion55(
const { data, id } = job;
if (!isRecord(data)) {
logger.warn(
`updateToSchemaVersion55: report spam queue job ${id} was missing valid data`
);
logger.warn(`report spam queue job ${id} was missing valid data`);
return;
}
const { e164, serverGuids } = data;
if (typeof e164 !== 'string') {
logger.warn(
`updateToSchemaVersion55: report spam queue job ${id} had a non-string e164`
);
logger.warn(`report spam queue job ${id} had a non-string e164`);
return;
}
if (!isIterable(serverGuids)) {
logger.warn(
`updateToSchemaVersion55: report spam queue job ${id} had a non-iterable serverGuids`
);
logger.warn(`report spam queue job ${id} had a non-iterable serverGuids`);
return;
}
@ -61,8 +49,4 @@ export default function updateToSchemaVersion55(
insertJob(db, newJob);
});
db.pragma('user_version = 55');
})();
logger.info('updateToSchemaVersion55: success!');
}

View file

@ -5,18 +5,7 @@ import type { Database } from '@signalapp/sqlcipher';
import { ReadStatus } from '../../messages/MessageReadStatus';
import { SeenStatus } from '../../MessageSeenStatus';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion56(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 56) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion56(db: Database): void {
db.exec(
`
--- Add column to messages table
@ -80,9 +69,4 @@ export default function updateToSchemaVersion56(
);
`
);
db.pragma('user_version = 56');
})();
logger.info('updateToSchemaVersion56: success!');
}

View file

@ -3,27 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion57(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 57) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion57(db: Database): void {
db.exec(
`
DELETE FROM messages
WHERE type IS 'message-history-unsynced';
`
);
db.pragma('user_version = 57');
})();
logger.info('updateToSchemaVersion57: success!');
}

View file

@ -5,18 +5,7 @@ import type { Database } from '@signalapp/sqlcipher';
import { ReadStatus } from '../../messages/MessageReadStatus';
import { SeenStatus } from '../../MessageSeenStatus';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion58(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 58) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion58(db: Database): void {
db.exec(
`
--- Promote unread status in JSON to SQL column
@ -128,9 +117,4 @@ export default function updateToSchemaVersion58(
seenStatus IS NOT 0;
`
);
db.pragma('user_version = 58');
})();
logger.info('updateToSchemaVersion58: success!');
}

View file

@ -3,26 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion59(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 59) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion59(db: Database): void {
db.exec(
`
CREATE INDEX unprocessed_byReceivedAtCounter ON unprocessed
(receivedAtCounter)
`
);
db.pragma('user_version = 59');
})();
logger.info('updateToSchemaVersion59: success!');
}

View file

@ -3,19 +3,8 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
// TODO: DESKTOP-3694
export default function updateToSchemaVersion60(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 60) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion60(db: Database): void {
db.exec(
`
DROP INDEX expiring_message_by_conversation_and_received_at;
@ -32,9 +21,4 @@ export default function updateToSchemaVersion60(
WHERE isStory IS 0 AND type IS 'incoming';
`
);
db.pragma('user_version = 60');
})();
logger.info('updateToSchemaVersion60: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion61(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 61) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion61(db: Database): void {
db.exec(
`
ALTER TABLE storyDistributions DROP COLUMN avatarKey;
@ -36,9 +25,4 @@ export default function updateToSchemaVersion61(
WHERE storyDistributionListId IS NOT NULL;
`
);
db.pragma('user_version = 61');
})();
logger.info('updateToSchemaVersion61: success!');
}

View file

@ -3,26 +3,10 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion62(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 62) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion62(db: Database): void {
db.exec(
`
ALTER TABLE sendLogPayloads ADD COLUMN urgent INTEGER;
`
);
db.pragma('user_version = 62');
})();
logger.info('updateToSchemaVersion62: success!');
}

View file

@ -3,26 +3,10 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion63(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 63) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion63(db: Database): void {
db.exec(
`
ALTER TABLE unprocessed ADD COLUMN urgent INTEGER;
`
);
db.pragma('user_version = 63');
})();
logger.info('updateToSchemaVersion63: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion64(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 64) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion64(db: Database): void {
db.exec(
`
ALTER TABLE preKeys
@ -30,9 +19,4 @@ export default function updateToSchemaVersion64(
CREATE INDEX signedPreKeys_ourUuid ON signedPreKeys (ourUuid);
`
);
db.pragma('user_version = 64');
})();
logger.info('updateToSchemaVersion64: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion65(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 65) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion65(db: Database): void {
db.exec(
`
ALTER TABLE sticker_packs ADD COLUMN position INTEGER DEFAULT 0 NOT NULL;
@ -54,9 +43,4 @@ export default function updateToSchemaVersion65(
);
`
);
db.pragma('user_version = 65');
})();
logger.info('updateToSchemaVersion65: success!');
}

View file

@ -3,27 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion66(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 66) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion66(db: Database): void {
db.exec(
`
ALTER TABLE sendLogPayloads
ADD COLUMN hasPniSignatureMessage INTEGER DEFAULT 0 NOT NULL;
`
);
db.pragma('user_version = 66');
})();
logger.info('updateToSchemaVersion66: success!');
}

View file

@ -3,26 +3,10 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion67(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 67) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion67(db: Database): void {
db.exec(
`
ALTER TABLE unprocessed ADD COLUMN story INTEGER;
`
);
db.pragma('user_version = 67');
})();
logger.info('updateToSchemaVersion67: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion68(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 68) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion68(db: Database): void {
db.exec(
`
ALTER TABLE messages
@ -23,9 +12,4 @@ export default function updateToSchemaVersion68(
DROP COLUMN deprecatedSourceDevice;
`
);
db.pragma('user_version = 68');
})();
logger.info('updateToSchemaVersion68: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion69(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 69) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion69(db: Database): void {
db.exec(
`
DROP TABLE IF EXISTS groupCallRings;
@ -25,9 +14,4 @@ export default function updateToSchemaVersion69(
);
`
);
db.pragma('user_version = 69');
})();
logger.info('updateToSchemaVersion69: success!');
}

View file

@ -3,27 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion70(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 70) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion70(db: Database): void {
// Used in `getAllStories`.
db.exec(
`
CREATE INDEX messages_by_storyId ON messages (storyId);
`
);
db.pragma('user_version = 70');
})();
logger.info('updateToSchemaVersion70: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion71(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 71) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion71(db: Database): void {
db.exec(
`
--- These will be re-added below
@ -115,9 +104,4 @@ export default function updateToSchemaVersion71(
CREATE INDEX message_user_initiated ON messages (isUserInitiatedMessage);
`
);
db.pragma('user_version = 71');
})();
logger.info('updateToSchemaVersion71: success!');
}

View file

@ -2,18 +2,8 @@
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion72(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 72) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion72(db: Database): void {
db.exec(
`
ALTER TABLE messages
@ -30,9 +20,4 @@ export default function updateToSchemaVersion72(
(conversationId, type, callMode, callId);
`
);
db.pragma('user_version = 72');
})();
logger.info('updateToSchemaVersion72: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion73(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 73) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion73(db: Database): void {
db.exec(
`
--- Delete deprecated notifications
@ -104,9 +93,4 @@ export default function updateToSchemaVersion73(
CREATE INDEX message_user_initiated ON messages (isUserInitiatedMessage);
`
);
db.pragma('user_version = 73');
})();
logger.info('updateToSchemaVersion73: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion74(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 74) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion74(db: Database): void {
db.exec(
`
-- Previously: (isUserInitiatedMessage)
@ -31,9 +20,4 @@ export default function updateToSchemaVersion74(
);
`
);
db.pragma('user_version = 74');
})();
logger.info('updateToSchemaVersion74: success!');
}

View file

@ -1,25 +1,8 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion75(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 75) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion75(): void {
// This was previously a FTS5 migration, but we had to reorder the
// migrations for backports.
// See: migrations 76 and 77.
db.pragma('user_version = 75');
})();
logger.info('updateToSchemaVersion75: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion76(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 76) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion76(db: Database): void {
db.exec(
`
-- Re-created below
@ -51,9 +40,4 @@ export default function updateToSchemaVersion76(
received_at, sent_at) WHERE storyId IS NULL;
`
);
db.pragma('user_version = 76');
})();
logger.info('updateToSchemaVersion76: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion77(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 77) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion77(db: Database): void {
db.exec(
`
-- Create FTS table with custom tokenizer from
@ -36,9 +25,4 @@ export default function updateToSchemaVersion77(
WHERE isViewOnce IS NOT 1 AND storyId IS NULL;
`
);
db.pragma('user_version = 77');
})();
logger.info('updateToSchemaVersion77: success!');
}

View file

@ -7,15 +7,9 @@ import type { WritableDB } from '../Interface';
import { getJobsInQueue, insertJob } from '../Server';
export default function updateToSchemaVersion78(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 78) {
return;
}
db.transaction(() => {
const deleteJobsInQueue = db.prepare(
'DELETE FROM jobs WHERE queueType = $queueType'
);
@ -53,7 +47,7 @@ export default function updateToSchemaVersion78(
const { data, id } = job;
if (!isRecord(data)) {
logger.warn(
`updateToSchemaVersion78: ${queue.queueType} queue job ${id} was missing valid data`
`${queue.queueType} queue job ${id} was missing valid data`
);
return;
}
@ -61,23 +55,21 @@ export default function updateToSchemaVersion78(
const { messageId } = data;
if (typeof messageId !== 'string') {
logger.warn(
`updateToSchemaVersion78: ${queue.queueType} queue job ${id} had a non-string messageId`
`${queue.queueType} queue job ${id} had a non-string messageId`
);
return;
}
const message = getMessageById.get([messageId]);
if (!message) {
logger.warn(
`updateToSchemaVersion78: Unable to find message for ${queue.queueType} job ${id}`
);
logger.warn(`Unable to find message for ${queue.queueType} job ${id}`);
return;
}
const { conversationId } = message;
if (typeof conversationId !== 'string') {
logger.warn(
`updateToSchemaVersion78: ${queue.queueType} queue job ${id} had a non-string conversationId`
`${queue.queueType} queue job ${id} had a non-string conversationId`
);
return;
}
@ -88,7 +80,7 @@ export default function updateToSchemaVersion78(
if (!Array.isArray(oldReceipts)) {
logger.warn(
`updateToSchemaVersion78: ${queue.queueType} queue job ${id} had a non-array ${queue.jobDataKey}`
`${queue.queueType} queue job ${id} had a non-array ${queue.jobDataKey}`
);
return;
}
@ -98,7 +90,7 @@ export default function updateToSchemaVersion78(
for (const receipt of oldReceipts) {
if (!isRecord(receipt)) {
logger.warn(
`updateToSchemaVersion78: ${queue.queueType} queue job ${id} had a non-record receipt`
`${queue.queueType} queue job ${id} had a non-record receipt`
);
continue;
}
@ -123,9 +115,4 @@ export default function updateToSchemaVersion78(
insertJob(db, newJob);
});
}
db.pragma('user_version = 78');
})();
logger.info('updateToSchemaVersion78: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion79(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 79) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion79(db: Database): void {
db.exec(`
DROP INDEX messages_hasVisualMediaAttachments;
CREATE INDEX messages_hasVisualMediaAttachments
@ -24,9 +13,4 @@ export default function updateToSchemaVersion79(
)
WHERE hasVisualMediaAttachments IS 1;
`);
db.pragma('user_version = 79');
})();
logger.info('updateToSchemaVersion79: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion80(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 80) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion80(db: Database): void {
db.exec(`
CREATE TABLE edited_messages(
fromId STRING,
@ -26,9 +15,4 @@ export default function updateToSchemaVersion80(
CREATE INDEX edited_messages_sent_at ON edited_messages (sentAt);
`);
db.pragma('user_version = 80');
})();
logger.info('updateToSchemaVersion80: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion81(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 81) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion81(db: Database): void {
db.exec(
`
--- These will be re-added below
@ -110,9 +99,4 @@ export default function updateToSchemaVersion81(
CREATE INDEX message_user_initiated ON messages (conversationId, isUserInitiatedMessage);
`
);
db.pragma('user_version = 81');
})();
logger.info('updateToSchemaVersion81: success!');
}

View file

@ -3,27 +3,11 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion82(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 82) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion82(db: Database): void {
db.exec(`
ALTER TABLE edited_messages DROP COLUMN fromId;
ALTER TABLE edited_messages ADD COLUMN conversationId STRING;
CREATE INDEX edited_messages_unread ON edited_messages (readStatus, conversationId);
`);
db.pragma('user_version = 82');
})();
logger.info('updateToSchemaVersion82: success!');
}

View file

@ -2,18 +2,8 @@
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion83(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 83) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion83(db: Database): void {
db.exec(
`
ALTER TABLE messages
@ -30,9 +20,4 @@ export default function updateToSchemaVersion83(
WHERE isStory IS 0 AND readStatus IS NOT NULL;
`
);
db.pragma('user_version = 83');
})();
logger.info('updateToSchemaVersion83: success!');
}

View file

@ -2,18 +2,8 @@
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion84(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 84) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion84(db: Database): void {
const selectMentionsFromMessages = `
SELECT messages.id, bodyRanges.value ->> 'mentionUuid' as mentionUuid, bodyRanges.value ->> 'start' as start, bodyRanges.value ->> 'length' as length
FROM messages, json_each(messages.json ->> 'bodyRanges') as bodyRanges
@ -52,9 +42,4 @@ export default function updateToSchemaVersion84(
AND messages.id = new.id;
END;
`);
db.pragma('user_version = 84');
})();
logger.info('updateToSchemaVersion84: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion85(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 85) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion85(db: Database): void {
db.exec(
`CREATE TABLE kyberPreKeys(
id STRING PRIMARY KEY NOT NULL,
@ -34,9 +23,4 @@ export default function updateToSchemaVersion85(
json = json_set(json, '$.createdAt', ${now});
`
);
db.pragma('user_version = 85');
})();
logger.info('updateToSchemaVersion85: success!');
}

View file

@ -3,18 +3,7 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export default function updateToSchemaVersion86(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 86) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion86(db: Database): void {
// The key reason for this new schema is that all of our previous schemas start with
// conversationId. This query is meant to find all replies to a given story, no
// matter the conversation.
@ -24,9 +13,4 @@ export default function updateToSchemaVersion86(
WHERE isStory IS 0;
`
);
db.pragma('user_version = 86');
})();
logger.info('updateToSchemaVersion86: success!');
}

View file

@ -3,8 +3,8 @@
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
import { cleanKeys } from './920-clean-more-keys';
import type { LoggerType } from '../../types/Logging';
import { sqlFragment } from '../util';
// Note: for many users, this is not what ran for them as migration 87. You can see that
@ -13,21 +13,20 @@ import { sqlFragment } from '../util';
// The goal of this migration is to ensure that key cleanup happens before migration 88.
export default function updateToSchemaVersion87(
currentVersion: number,
db: Database,
logger: LoggerType
logger: LoggerType,
startingVersion: number
): void {
// We're checking for the version of the next migration here, not this version. We want
// this to run if the user hasn't yet successfully run migration 88.
if (currentVersion >= 88) {
if (startingVersion >= 88) {
return;
}
db.transaction(() => {
cleanKeys(
db,
logger,
'updateToSchemaVersion87(cleanup)/kyberPreKeys',
'(cleanup)/kyberPreKeys',
sqlFragment`kyberPreKeys`,
sqlFragment`createdAt`,
sqlFragment`ourUuid`
@ -35,7 +34,7 @@ export default function updateToSchemaVersion87(
cleanKeys(
db,
logger,
'updateToSchemaVersion87(cleanup)/preKeys',
'(cleanup)/preKeys',
sqlFragment`preKeys`,
sqlFragment`createdAt`,
sqlFragment`ourUuid`
@ -43,12 +42,9 @@ export default function updateToSchemaVersion87(
cleanKeys(
db,
logger,
'updateToSchemaVersion87(cleanup)/signedPreKeys',
'(cleanup)/signedPreKeys',
sqlFragment`signedPreKeys`,
sqlFragment`created_at`,
sqlFragment`ourUuid`
);
})();
logger.info('updateToSchemaVersion87(cleanup): success!');
}

View file

@ -26,14 +26,9 @@ import { isNotNil } from '../../util/isNotNil';
//
export default function updateToSchemaVersion88(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 88) {
return;
}
// See updateToSchemaVersion84
const selectMentionsFromMessages = `
SELECT messages.id, bodyRanges.value ->> 'mentionAci' as mentionAci,
@ -43,7 +38,6 @@ export default function updateToSchemaVersion88(
WHERE bodyRanges.value ->> 'mentionAci' IS NOT NULL
`;
db.transaction(() => {
// Rename all columns and re-create all indexes first.
db.exec(`
--
@ -237,11 +231,6 @@ export default function updateToSchemaVersion88(
AND messages.id = new.id;
END;
`);
db.pragma('user_version = 88');
})();
logger.info('updateToSchemaVersion88: success!');
}
//
@ -338,9 +327,7 @@ function migrateConversations(
'UPDATE conversations SET json = $json WHERE id IS $id'
);
logger.info(
`updateToSchemaVersion88: updating ${convos.length} conversations`
);
logger.info(`updating ${convos.length} conversations`);
// Build lookup map for senderKeyInfo
const identifierToServiceId = new Map<string, ServiceIdString>();
@ -439,9 +426,7 @@ function migrateConversations(
.map(({ identifier, ...rest }) => {
const deviceServiceId = identifierToServiceId.get(identifier);
if (!deviceServiceId) {
logger.warn(
`updateToSchemaVersion88: failed to resolve identifier ${identifier}`
);
logger.warn(`failed to resolve identifier ${identifier}`);
return undefined;
}
@ -454,10 +439,7 @@ function migrateConversations(
updateStmt.run({ id, json: JSON.stringify(modern) });
} catch (error) {
logger.warn(
`updateToSchemaVersion88: failed to parse convo ${id} json`,
error
);
logger.warn(`failed to parse convo ${id} json`, error);
continue;
}
}
@ -511,12 +493,9 @@ function migrateItems(db: Database, logger: LoggerType): OurServiceIds {
[legacyAci] = JSON.parse(uuidIdJson ?? '').value.split('.', 2);
} catch (error) {
if (uuidIdJson) {
logger.warn(
'updateToSchemaVersion88: failed to parse uuid_id item',
error
);
logger.warn('failed to parse uuid_id item', error);
} else {
logger.info('updateToSchemaVersion88: Our UUID not found');
logger.info('Our UUID not found');
}
}
@ -525,9 +504,9 @@ function migrateItems(db: Database, logger: LoggerType): OurServiceIds {
legacyPni = JSON.parse(pniJson ?? '').value;
} catch (error) {
if (pniJson) {
logger.warn('updateToSchemaVersion88: failed to parse pni item', error);
logger.warn('failed to parse pni item', error);
} else {
logger.info('updateToSchemaVersion88: Our PNI not found');
logger.info('Our PNI not found');
}
}
@ -573,7 +552,7 @@ function migrateItems(db: Database, logger: LoggerType): OurServiceIds {
updateStmt.run({ id, json: JSON.stringify(data) });
} catch (error) {
logger.warn(`updateToSchemaVersion88: failed to parse ${id} item`, error);
logger.warn(`failed to parse ${id} item`, error);
}
}
return { aci, pni, legacyAci, legacyPni };
@ -611,21 +590,18 @@ function migrateSessions(
`
);
logger.info(`updateToSchemaVersion88: updating ${sessions.length} sessions`);
logger.info(`updating ${sessions.length} sessions`);
for (const { id, serviceId, ourServiceId, json } of sessions) {
const match = id.match(/^(.*):(.*)\.(.*)$/);
if (!match) {
logger.warn(`updateToSchemaVersion88: invalid session id ${id}`);
logger.warn(`invalid session id ${id}`);
continue;
}
let legacyData: JSONWithUnknownFields<Record<string, unknown>>;
try {
legacyData = JSON.parse(json);
} catch (error) {
logger.warn(
`updateToSchemaVersion88: failed to parse session ${id}`,
error
);
logger.warn(`failed to parse session ${id}`, error);
continue;
}
@ -642,7 +618,7 @@ function migrateSessions(
);
if (!newServiceId || !newOurServiceId) {
logger.warn(
'updateToSchemaVersion88: failed to normalize session service ids',
'failed to normalize session service ids',
serviceId,
ourServiceId
);
@ -753,7 +729,7 @@ function migrateMessages(db: Database, logger: LoggerType): void {
WHERE rowid = $rowid
`);
logger.info('updateToSchemaVersion88: updating messages');
logger.info('updating messages');
let totalMessages = 0;
// eslint-disable-next-line no-constant-condition
@ -832,15 +808,12 @@ function migrateMessages(db: Database, logger: LoggerType): void {
json: JSON.stringify(updatedMessage),
});
} catch (error) {
logger.warn(
`updateToSchemaVersion88: failed to parse message ${id} json`,
error
);
logger.warn(`failed to parse message ${id} json`, error);
}
}
}
logger.info(`updateToSchemaVersion88: updated ${totalMessages} messages`);
logger.info(`updated ${totalMessages} messages`);
}
// migratePreKeys works similarly to migrateSessions and does:
@ -867,11 +840,11 @@ function migratePreKeys(
WHERE id = $id
`);
logger.info(`updateToSchemaVersion88: updating ${preKeys.length} ${table}`);
logger.info(`updating ${preKeys.length} ${table}`);
for (const { id, json } of preKeys) {
const match = id.match(/^(.*):(.*)$/);
if (!match) {
logger.warn(`updateToSchemaVersion88: invalid ${table} id ${id}`);
logger.warn(`invalid ${table} id ${id}`);
continue;
}
@ -879,10 +852,7 @@ function migratePreKeys(
try {
legacyData = JSON.parse(json);
} catch (error) {
logger.warn(
`updateToSchemaVersion88: failed to parse ${table} ${id}`,
error
);
logger.warn(`failed to parse ${table} ${id}`, error);
continue;
}
@ -1118,7 +1088,7 @@ function migrateJobs(
const serviceId = identifierToServiceId.get(identifier);
if (!serviceId) {
logger.warn(
`updateToSchemaVersion88: failed to resolve identifier ${identifier} ` +
`failed to resolve identifier ${identifier} ` +
`for job ${id}/${queueType}`
);
continue;
@ -1137,14 +1107,11 @@ function migrateJobs(
updateStmt.run({ id, data: JSON.stringify(updatedData) });
}
} catch (error) {
logger.warn(
`updateToSchemaVersion88: failed to migrate job ${id}/${queueType} json`,
error
);
logger.warn(`failed to migrate job ${id}/${queueType} json`, error);
}
}
logger.info(`updateToSchemaVersion88: updated ${updatedCount} jobs`);
logger.info(`updated ${updatedCount} jobs`);
}
//

View file

@ -94,7 +94,7 @@ function getPeerIdFromConversation(
if (conversation.type === 'private') {
if (conversation.serviceId == null) {
logger.warn(
`updateToSchemaVersion89: Private conversation (${conversation.id}) was missing serviceId (discoveredUnregisteredAt: ${conversation.discoveredUnregisteredAt})`
`Private conversation (${conversation.id}) was missing serviceId (discoveredUnregisteredAt: ${conversation.discoveredUnregisteredAt})`
);
return conversation.id;
}
@ -191,15 +191,9 @@ function convertLegacyCallDetails(
}
export default function updateToSchemaVersion89(
currentVersion: number,
db: WritableDB,
logger: LoggerType
): void {
if (currentVersion >= 89) {
return;
}
db.transaction(() => {
const ourUuid = getOurUuid(db);
const [createTable] = sql`
@ -281,7 +275,7 @@ export default function updateToSchemaVersion89(
if (!isObject(conversation)) {
logger.warn(
`updateToSchemaVersion89: Private conversation (${conversationId}) ` +
`Private conversation (${conversationId}) ` +
'has non-object json column'
);
continue;
@ -387,9 +381,4 @@ export default function updateToSchemaVersion89(
WHERE type IS 'call-history';
`;
db.exec(optimizeMessages);
db.pragma('user_version = 89');
})();
logger.info('updateToSchemaVersion89: success!');
}

View file

@ -7,16 +7,10 @@ import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export default function updateToSchemaVersion90(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 90) {
return;
}
let numChanges = 0;
db.transaction(() => {
const [updateQuery, updateParams] = sql`
UPDATE messages
SET json = json_remove(json, '$.storyReplyContext.attachment.screenshotData')
@ -33,13 +27,8 @@ export default function updateToSchemaVersion90(
const info = db.prepare(updateQuery).run(updateParams);
numChanges = info.changes;
db.pragma('user_version = 90');
})();
logger.info(
`updateToSchemaVersion90: removed screenshotData from ${numChanges} ` +
`removed screenshotData from ${numChanges} ` +
`message${numChanges > 1 ? 's' : ''}`
);
logger.info('updateToSchemaVersion90: success!');
}

View file

@ -10,15 +10,9 @@ import { normalizePni } from '../../types/ServiceId';
import * as Errors from '../../types/errors';
export default function updateToSchemaVersion91(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 91) {
return;
}
db.transaction(() => {
// Fix the ourServiceId column so it's generated from the right JSON field
db.exec(`
@ -66,9 +60,8 @@ export default function updateToSchemaVersion91(
pluck: true,
})
.get<number>() ?? 0;
logger.info(`updateToSchemaVersion91: Found ${totalKeys} keys`);
logger.info(`Found ${totalKeys} keys`);
if (totalKeys < 1000) {
db.pragma('user_version = 91');
return;
}
@ -84,14 +77,10 @@ export default function updateToSchemaVersion91(
const pniData = JSON.parse(pniJson ?? '');
pni = normalizePni(pniData.value, 'updateToSchemaVersion91');
} catch (error) {
db.pragma('user_version = 91');
if (pniJson) {
logger.warn(
'updateToSchemaVersion91: PNI found but did not parse',
Errors.toLogFormat(error)
);
logger.warn('PNI found but did not parse', Errors.toLogFormat(error));
} else {
logger.info('updateToSchemaVersion91: Our PNI not found');
logger.info('Our PNI not found');
}
return;
}
@ -105,7 +94,7 @@ export default function updateToSchemaVersion91(
pluck: true,
})
.get(beforeParams);
logger.info(`updateToSchemaVersion91: Found ${beforeKeys} preKeys for PNI`);
logger.info(`Found ${beforeKeys} preKeys for PNI`);
// Create index to help us with all these queries
@ -117,7 +106,7 @@ export default function updateToSchemaVersion91(
CREATE INDEX preKeys_date
ON preKeys (ourServiceId, createdAt);
`);
logger.info('updateToSchemaVersion91: Temporary index created');
logger.info('Temporary index created');
// Fetch 500th-oldest timestamp for PNI
@ -136,9 +125,7 @@ export default function updateToSchemaVersion91(
pluck: true,
})
.get(oldParams);
logger.info(
`updateToSchemaVersion91: Found 500th-oldest timestamp: ${oldBoundary}`
);
logger.info(`Found 500th-oldest timestamp: ${oldBoundary}`);
// Fetch 500th-newest timestamp for PNI
@ -157,9 +144,7 @@ export default function updateToSchemaVersion91(
pluck: true,
})
.get(newParams);
logger.info(
`updateToSchemaVersion91: Found 500th-newest timestamp: ${newBoundary}`
);
logger.info(`Found 500th-newest timestamp: ${newBoundary}`);
// Delete everything in between for PNI
@ -179,9 +164,9 @@ export default function updateToSchemaVersion91(
const preparedQuery = db.prepare(deleteQuery);
do {
result = preparedQuery.run(deleteParams);
logger.info(`updateToSchemaVersion91: Deleted ${result.changes} items`);
logger.info(`Deleted ${result.changes} items`);
} while (result.changes > 0);
logger.info('updateToSchemaVersion91: Delete is complete!');
logger.info('Delete is complete!');
// Get updated count for PNI
@ -195,17 +180,10 @@ export default function updateToSchemaVersion91(
pluck: true,
})
.get(afterParams);
logger.info(
`updateToSchemaVersion91: Found ${afterCount} preKeys for PNI after delete`
);
logger.info(`Found ${afterCount} preKeys for PNI after delete`);
db.exec(`
DROP INDEX preKeys_date;
ALTER TABLE preKeys DROP COLUMN createdAt;
`);
db.pragma('user_version = 91');
})();
logger.info('updateToSchemaVersion91: success!');
}

View file

@ -11,22 +11,14 @@ import { sql, sqlFragment } from '../util';
import { normalizePni } from '../../types/ServiceId';
import * as Errors from '../../types/errors';
export const version = 920;
export function updateToSchemaVersion920(
currentVersion: number,
export default function updateToSchemaVersion920(
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 920) {
return;
}
db.transaction(() => {
): 'vacuum' {
cleanKeys(
db,
logger,
'updateToSchemaVersion920/kyberPreKeys',
'kyberPreKeys',
sqlFragment`kyberPreKeys`,
sqlFragment`createdAt`,
sqlFragment`ourServiceId`
@ -34,24 +26,15 @@ export function updateToSchemaVersion920(
cleanKeys(
db,
logger,
'updateToSchemaVersion920/signedPreKeys',
'signedPreKeys',
sqlFragment`signedPreKeys`,
sqlFragment`created_at`,
sqlFragment`ourServiceId`
);
logger.info('updateToSchemaVersion920: Done with deletions');
logger.info('Done with deletions, starting vacuum...');
db.pragma('user_version = 920');
})();
logger.info(
'updateToSchemaVersion920: user_version set to 920. Starting vacuum...'
);
db.exec('VACUUM;');
logger.info('updateToSchemaVersion920: Vacuum complete.');
logger.info('updateToSchemaVersion920: success!');
return 'vacuum';
}
export function cleanKeys(

View file

@ -1,26 +1,6 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 930;
export function updateToSchemaVersion930(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 930) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion930(): void {
// This was a migration that enabled 'secure-delete' in FTS
db.pragma('user_version = 930');
})();
logger.info('updateToSchemaVersion930: success!');
}

View file

@ -1,25 +1,6 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 940;
export function updateToSchemaVersion940(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 940) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion940(): void {
// This was a migration that disabled secure-delete and rebuilt the index
db.pragma('user_version = 940');
})();
logger.info('updateToSchemaVersion940: success!');
}

View file

@ -1,25 +1,6 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 950;
export function updateToSchemaVersion950(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 950) {
return;
}
db.transaction(() => {
export default function updateToSchemaVersion950(): void {
// This was a migration that enable secure-delete
db.pragma('user_version = 950');
})();
logger.info('updateToSchemaVersion950: success!');
}

View file

@ -13,21 +13,13 @@ import { normalizePni } from '../../types/ServiceId';
import { normalizeAci } from '../../util/normalizeAci';
import type { JSONWithUnknownFields } from '../../types/Util';
export const version = 960;
export function updateToSchemaVersion960(
currentVersion: number,
export default function updateToSchemaVersion960(
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 960) {
return;
}
db.transaction(() => {
const ourServiceIds = migratePni(db, logger);
if (!ourServiceIds) {
logger.info('updateToSchemaVersion960: not running, pni is normalized');
logger.info('not running, pni is normalized');
return;
}
@ -46,11 +38,6 @@ export function updateToSchemaVersion960(
migratePreKeys(db, 'preKeys', ourServiceIds, logger);
migratePreKeys(db, 'signedPreKeys', ourServiceIds, logger);
migratePreKeys(db, 'kyberPreKeys', ourServiceIds, logger);
db.pragma('user_version = 960');
})();
logger.info('updateToSchemaVersion960: success!');
}
//
@ -101,12 +88,9 @@ function migratePni(
[aci] = JSON.parse(uuidIdJson ?? '').value.split('.', 2);
} catch (error) {
if (uuidIdJson) {
logger.warn(
'updateToSchemaVersion960: failed to parse uuid_id item',
error
);
logger.warn('failed to parse uuid_id item', error);
} else {
logger.info('updateToSchemaVersion960: Our ACI not found');
logger.info('Our ACI not found');
}
}
if (!aci) {
@ -118,9 +102,9 @@ function migratePni(
legacyPni = JSON.parse(pniJson ?? '').value;
} catch (error) {
if (pniJson) {
logger.warn('updateToSchemaVersion960: failed to parse pni item', error);
logger.warn('failed to parse pni item', error);
} else {
logger.info('updateToSchemaVersion960: Our PNI not found');
logger.info('Our PNI not found');
}
}
if (!legacyPni) {
@ -164,10 +148,7 @@ function migratePni(
updateStmt.run({ id, json: JSON.stringify(data) });
} catch (error) {
logger.warn(
`updateToSchemaVersion960: failed to parse ${id} item`,
error
);
logger.warn(`failed to parse ${id} item`, error);
}
}
return {
@ -200,11 +181,11 @@ function migratePreKeys(
WHERE id = $id
`);
logger.info(`updateToSchemaVersion960: updating ${preKeys.length} ${table}`);
logger.info(`updating ${preKeys.length} ${table}`);
for (const { id, json } of preKeys) {
const match = id.match(/^(.*):(.*)$/);
if (!match) {
logger.warn(`updateToSchemaVersion960: invalid ${table} id ${id}`);
logger.warn(`invalid ${table} id ${id}`);
continue;
}
@ -212,20 +193,13 @@ function migratePreKeys(
try {
legacyData = JSON.parse(json);
} catch (error) {
logger.warn(
`updateToSchemaVersion960: failed to parse ${table} ${id}`,
error
);
logger.warn(`failed to parse ${table} ${id}`, error);
continue;
}
const [, ourServiceId, keyId] = match;
if (ourServiceId !== legacyPni) {
logger.warn(
'updateToSchemaVersion960: unexpected ourServiceId',
ourServiceId,
legacyPni
);
logger.warn('unexpected ourServiceId', ourServiceId, legacyPni);
continue;
}

View file

@ -2,29 +2,9 @@
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/sqlcipher';
import type { LoggerType } from '../../types/Logging';
export const version = 970;
export function updateToSchemaVersion970(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 970) {
return;
}
const start = Date.now();
db.transaction(() => {
export default function updateToSchemaVersion970(db: Database): void {
db.exec(`
INSERT INTO messages_fts(messages_fts) VALUES ('optimize');
`);
db.pragma('user_version = 970');
})();
const duration = Date.now() - start;
logger.info(
`updateToSchemaVersion970: success! fts optimize took ${duration}ms`
);
}

Some files were not shown because too many files have changed in this diff Show more