@@ -300,31 +300,49 @@ export async function updateTccDb(path: string): Promise<void> {
300300 : [ ] ) ,
301301 ] ;
302302
303- for ( const values of getEntries ( ) ) {
304- const query = `INSERT OR IGNORE INTO access (${ columns . join ( "," ) } ) VALUES(${ values } ${
305- isSonomaOrNewer ? `,NULL,NULL,'UNUSED',${ epoch } ` : ""
306- } );`;
307-
308- for ( let i = 0 ; i < TIMEOUT_BACKOFFS . length + 1 ; i ++ ) {
309- try {
310- execFileSyncAsRoot ( "sqlite3" , [ path , query ] , {
311- encoding : "utf8" ,
312- stdio : "ignore" ,
313- timeout : SHORT_COMMAND_TIMEOUT_MS ,
314- } ) ;
303+ const rows = getEntries ( ) . map (
304+ ( values ) =>
305+ `(${ values } ${ isSonomaOrNewer ? `,NULL,NULL,'UNUSED',${ epoch } ` : "" } )` ,
306+ ) ;
307+ const updatedColumns = [
308+ "auth_value" ,
309+ "auth_reason" ,
310+ "auth_version" ,
311+ "flags" ,
312+ "last_modified" ,
313+ ...( isSonomaOrNewer
314+ ? [ "pid" , "pid_version" , "boot_uuid" , "last_reminded" ]
315+ : [ ] ) ,
316+ ] ;
317+ const query = [
318+ "BEGIN IMMEDIATE;" ,
319+ `INSERT INTO access (${ columns . join ( "," ) } ) VALUES ${ rows . join (
320+ "," ,
321+ ) } ON CONFLICT DO UPDATE SET ${ updatedColumns
322+ . map ( ( column ) => `${ column } =excluded.${ column } ` )
323+ . join ( "," ) } ;`,
324+ "COMMIT;" ,
325+ ] . join ( "\n" ) ;
315326
316- break ;
317- } catch ( cause ) {
318- if ( i === TIMEOUT_BACKOFFS . length ) {
319- throw new Error ( ERR_SETUP_MACOS_UNABLE_TO_WRITE_USER_TCC_DB , {
320- cause ,
321- } ) ;
322- }
327+ for ( let i = 0 ; i < TIMEOUT_BACKOFFS . length + 1 ; i ++ ) {
328+ try {
329+ execFileSyncAsRoot ( "sqlite3" , [ "-bail" , path , query ] , {
330+ encoding : "utf8" ,
331+ stdio : "ignore" ,
332+ timeout : SHORT_COMMAND_TIMEOUT_MS ,
333+ } ) ;
323334
324- await new Promise ( ( resolve ) =>
325- setTimeout ( resolve , TIMEOUT_BACKOFFS [ i ] ) ,
326- ) ;
335+ break ;
336+ } catch ( cause ) {
337+ if ( i === TIMEOUT_BACKOFFS . length ) {
338+ throw new Error ( ERR_SETUP_MACOS_UNABLE_TO_WRITE_USER_TCC_DB , {
339+ cause,
340+ } ) ;
327341 }
342+
343+ await new Promise ( ( resolve ) =>
344+ setTimeout ( resolve , TIMEOUT_BACKOFFS [ i ] ) ,
345+ ) ;
328346 }
329347 }
330348
0 commit comments