Improve message migration error handling

This commit is contained in:
trevor-signal 2024-11-04 15:18:36 -05:00 committed by GitHub
parent 1620ccf3ab
commit aac94b0217
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 163 additions and 33 deletions

View file

@ -438,6 +438,7 @@ export const DataWriter: ServerWritableInterface = {
saveMessage,
saveMessages,
saveMessagesIndividually,
removeMessage,
removeMessages,
markReactionAsRead,
@ -2208,6 +2209,7 @@ export function saveMessage(
ourAci: AciString;
}
): string {
// NB: `saveMessagesIndividually` relies on `saveMessage` being atomic
const { alreadyInTransaction, forceSave, jobToInsert, ourAci } = options;
if (!alreadyInTransaction) {
@ -2435,6 +2437,31 @@ function saveMessages(
})();
}
function saveMessagesIndividually(
db: WritableDB,
arrayOfMessages: ReadonlyArray<ReadonlyDeep<MessageType>>,
options: { forceSave?: boolean; ourAci: AciString }
): { failedIndices: Array<number> } {
return db.transaction(() => {
const failedIndices: Array<number> = [];
arrayOfMessages.forEach((message, index) => {
try {
saveMessage(db, message, {
...options,
alreadyInTransaction: true,
});
} catch (e) {
logger.error(
'saveMessagesIndividually: failed to save message',
Errors.toLogFormat(e)
);
failedIndices.push(index);
}
});
return { failedIndices };
})();
}
function removeMessage(db: WritableDB, id: string): void {
db.prepare<Query>('DELETE FROM messages WHERE id = $id;').run({ id });
}