Skip to content

Commit bfd13cc

Browse files
committed
feat: single insert for TCC.db
1 parent 17ad32f commit bfd13cc

1 file changed

Lines changed: 40 additions & 22 deletions

File tree

‎src/commands/setup/macOS/updateTccDb.ts‎

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)