Use synchronous methods in transactions

This commit is contained in:
Fedor Indutny 2021-05-14 10:52:47 -07:00 committed by Scott Nonnenberg
parent e6bab06510
commit 41a4643380

View file

@ -263,6 +263,10 @@ function prepare(db: Database, query: string): Statement<Query> {
return result; return result;
} }
function assertSync<T, X>(value: T extends Promise<X> ? never : T): T {
return value;
}
function objectToJSON(data: any) { function objectToJSON(data: any) {
return JSON.stringify(data); return JSON.stringify(data);
} }
@ -2164,7 +2168,7 @@ async function getAllSenderKeys(): Promise<Array<SenderKeyType>> {
} }
const SESSIONS_TABLE = 'sessions'; const SESSIONS_TABLE = 'sessions';
async function createOrUpdateSession(data: SessionType): Promise<void> { function createOrUpdateSessionSync(data: SessionType): void {
const db = getInstance(); const db = getInstance();
const { id, conversationId } = data; const { id, conversationId } = data;
if (!id) { if (!id) {
@ -2197,6 +2201,10 @@ async function createOrUpdateSession(data: SessionType): Promise<void> {
json: objectToJSON(data), json: objectToJSON(data),
}); });
} }
async function createOrUpdateSession(data: SessionType): Promise<void> {
return createOrUpdateSessionSync(data);
}
async function createOrUpdateSessions( async function createOrUpdateSessions(
array: Array<SessionType> array: Array<SessionType>
): Promise<void> { ): Promise<void> {
@ -2204,7 +2212,7 @@ async function createOrUpdateSessions(
db.transaction(() => { db.transaction(() => {
for (const item of array) { for (const item of array) {
createOrUpdateSession(item); assertSync(createOrUpdateSessionSync(item));
} }
})(); })();
} }
@ -2256,10 +2264,10 @@ function getAllSessions(): Promise<Array<SessionType>> {
return getAllFromTable(SESSIONS_TABLE); return getAllFromTable(SESSIONS_TABLE);
} }
async function createOrUpdate( function createOrUpdateSync(
table: string, table: string,
data: Record<string, unknown> & { id: string | number } data: Record<string, unknown> & { id: string | number }
): Promise<void> { ): void {
const db = getInstance(); const db = getInstance();
const { id } = data; const { id } = data;
if (!id) { if (!id) {
@ -2282,6 +2290,13 @@ async function createOrUpdate(
}); });
} }
async function createOrUpdate(
table: string,
data: Record<string, unknown> & { id: string | number }
): Promise<void> {
return createOrUpdateSync(table, data);
}
async function bulkAdd( async function bulkAdd(
table: string, table: string,
array: Array<Record<string, unknown> & { id: string | number }> array: Array<Record<string, unknown> & { id: string | number }>
@ -2290,7 +2305,7 @@ async function bulkAdd(
db.transaction(() => { db.transaction(() => {
for (const data of array) { for (const data of array) {
createOrUpdate(table, data); assertSync(createOrUpdateSync(table, data));
} }
})(); })();
} }
@ -2378,10 +2393,10 @@ async function getConversationCount(): Promise<number> {
return row['count(*)']; return row['count(*)'];
} }
async function saveConversation( function saveConversationSync(
data: ConversationType, data: ConversationType,
db = getInstance() db = getInstance()
): Promise<void> { ): void {
const { const {
active_at, active_at,
e164, e164,
@ -2461,6 +2476,13 @@ async function saveConversation(
}); });
} }
async function saveConversation(
data: ConversationType,
db = getInstance()
): Promise<void> {
return saveConversationSync(data, db);
}
async function saveConversations( async function saveConversations(
arrayOfConversations: Array<ConversationType> arrayOfConversations: Array<ConversationType>
): Promise<void> { ): Promise<void> {
@ -2468,12 +2490,12 @@ async function saveConversations(
db.transaction(() => { db.transaction(() => {
for (const conversation of arrayOfConversations) { for (const conversation of arrayOfConversations) {
saveConversation(conversation); assertSync(saveConversationSync(conversation));
} }
})(); })();
} }
async function updateConversation(data: ConversationType): Promise<void> { function updateConversationSync(data: ConversationType): void {
const db = getInstance(); const db = getInstance();
const { const {
id, id,
@ -2535,6 +2557,10 @@ async function updateConversation(data: ConversationType): Promise<void> {
}); });
} }
async function updateConversation(data: ConversationType): Promise<void> {
return updateConversationSync(data);
}
async function updateConversations( async function updateConversations(
array: Array<ConversationType> array: Array<ConversationType>
): Promise<void> { ): Promise<void> {
@ -2542,7 +2568,7 @@ async function updateConversations(
db.transaction(() => { db.transaction(() => {
for (const item of array) { for (const item of array) {
updateConversation(item); assertSync(updateConversationSync(item));
} }
})(); })();
} }
@ -2827,20 +2853,22 @@ async function getMessageCount(conversationId?: string): Promise<number> {
return row['count(*)']; return row['count(*)'];
} }
async function saveMessage( function saveMessageSync(
data: MessageType, data: MessageType,
options: { forceSave?: boolean; alreadyInTransaction?: boolean } = {} options: { forceSave?: boolean; alreadyInTransaction?: boolean } = {}
): Promise<string> { ): string {
const db = getInstance(); const db = getInstance();
const { forceSave, alreadyInTransaction } = options; const { forceSave, alreadyInTransaction } = options;
if (!alreadyInTransaction) { if (!alreadyInTransaction) {
return db.transaction(() => { return db.transaction(() => {
return saveMessage(data, { return assertSync(
...options, saveMessageSync(data, {
alreadyInTransaction: true, ...options,
}); alreadyInTransaction: true,
})
);
})(); })();
} }
@ -2986,6 +3014,13 @@ async function saveMessage(
return toCreate.id; return toCreate.id;
} }
async function saveMessage(
data: MessageType,
options: { forceSave?: boolean; alreadyInTransaction?: boolean }
): Promise<string> {
return saveMessageSync(data, options);
}
async function saveMessages( async function saveMessages(
arrayOfMessages: Array<MessageType>, arrayOfMessages: Array<MessageType>,
{ forceSave }: { forceSave?: boolean } = {} { forceSave }: { forceSave?: boolean } = {}
@ -2994,7 +3029,9 @@ async function saveMessages(
db.transaction(() => { db.transaction(() => {
for (const message of arrayOfMessages) { for (const message of arrayOfMessages) {
saveMessage(message, { forceSave, alreadyInTransaction: true }); assertSync(
saveMessageSync(message, { forceSave, alreadyInTransaction: true })
);
} }
})(); })();
} }
@ -3905,10 +3942,10 @@ async function getTapToViewMessagesNeedingErase(): Promise<Array<MessageType>> {
return rows.map(row => jsonToObject(row.json)); return rows.map(row => jsonToObject(row.json));
} }
async function saveUnprocessed( function saveUnprocessedSync(
data: UnprocessedType, data: UnprocessedType,
{ forceSave }: { forceSave?: boolean } = {} { forceSave }: { forceSave?: boolean } = {}
): Promise<string> { ): string {
const db = getInstance(); const db = getInstance();
const { id, timestamp, version, attempts, envelope } = data; const { id, timestamp, version, attempts, envelope } = data;
if (!id) { if (!id) {
@ -3965,6 +4002,13 @@ async function saveUnprocessed(
return id; return id;
} }
async function saveUnprocessed(
data: UnprocessedType,
options: { forceSave?: boolean } = {}
): Promise<string> {
return saveUnprocessedSync(data, options);
}
async function saveUnprocesseds( async function saveUnprocesseds(
arrayOfUnprocessed: Array<UnprocessedType>, arrayOfUnprocessed: Array<UnprocessedType>,
{ forceSave }: { forceSave?: boolean } = {} { forceSave }: { forceSave?: boolean } = {}
@ -3973,7 +4017,7 @@ async function saveUnprocesseds(
db.transaction(() => { db.transaction(() => {
for (const unprocessed of arrayOfUnprocessed) { for (const unprocessed of arrayOfUnprocessed) {
saveUnprocessed(unprocessed, { forceSave }); assertSync(saveUnprocessedSync(unprocessed, { forceSave }));
} }
})(); })();
} }
@ -3994,10 +4038,11 @@ async function updateUnprocessedAttempts(
attempts, attempts,
}); });
} }
async function updateUnprocessedWithData(
function updateUnprocessedWithDataSync(
id: string, id: string,
data: UnprocessedUpdateType data: UnprocessedUpdateType
): Promise<void> { ): void {
const db = getInstance(); const db = getInstance();
const { source, sourceUuid, sourceDevice, serverTimestamp, decrypted } = data; const { source, sourceUuid, sourceDevice, serverTimestamp, decrypted } = data;
@ -4021,6 +4066,14 @@ async function updateUnprocessedWithData(
decrypted: decrypted || null, decrypted: decrypted || null,
}); });
} }
async function updateUnprocessedWithData(
id: string,
data: UnprocessedUpdateType
): Promise<void> {
return updateUnprocessedWithDataSync(id, data);
}
async function updateUnprocessedsWithData( async function updateUnprocessedsWithData(
arrayOfUnprocessed: Array<{ id: string; data: UnprocessedUpdateType }> arrayOfUnprocessed: Array<{ id: string; data: UnprocessedUpdateType }>
): Promise<void> { ): Promise<void> {
@ -4028,7 +4081,7 @@ async function updateUnprocessedsWithData(
db.transaction(() => { db.transaction(() => {
for (const { id, data } of arrayOfUnprocessed) { for (const { id, data } of arrayOfUnprocessed) {
updateUnprocessedWithData(id, data); assertSync(updateUnprocessedWithDataSync(id, data));
} }
})(); })();
} }