( db: Database, path: string, size: number, now: () => number, )
| 846 | } |
| 847 | |
| 848 | export function truncateFileSync( |
| 849 | db: Database, |
| 850 | path: string, |
| 851 | size: number, |
| 852 | now: () => number, |
| 853 | ): void { |
| 854 | const { path: canonical } = canonicalizePath(path); |
| 855 | assertNotReadOnly(db, canonical); |
| 856 | if (!Number.isInteger(size) || size < 0) { |
| 857 | throw createWorkspaceError("EINVAL", `invalid truncate size: ${size}`, canonical); |
| 858 | } |
| 859 | const mtime = now(); |
| 860 | |
| 861 | // Pending-create files truncate in-place on the path-keyed buffer. |
| 862 | const pending = getPendingWriteBufferByPath(db, canonical); |
| 863 | if (pending !== undefined) { |
| 864 | if (size > pending.size) { |
| 865 | ensureBufferCapacity(pending, size); |
| 866 | pending.buf.fill(0, pending.size, size); |
| 867 | } |
| 868 | pending.size = size; |
| 869 | pending.dirty = true; |
| 870 | return; |
| 871 | } |
| 872 | |
| 873 | const { inode, mode } = resolveFileInode(db, path); |
| 874 | const buffered = getWriteBuffer(db, inode); |
| 875 | |
| 876 | if (buffered !== undefined) { |
| 877 | hydrateBufferIfNeeded(db, inode, buffered); |
| 878 | if (size > buffered.size) { |
| 879 | ensureBufferCapacity(buffered, size); |
| 880 | buffered.buf.fill(0, buffered.size, size); |
| 881 | } |
| 882 | buffered.size = size; |
| 883 | buffered.dirty = true; |
| 884 | return; |
| 885 | } |
| 886 | |
| 887 | db.transactionSync(() => { |
| 888 | const oldSize = fileSizeForInode(db, inode); |
| 889 | if (oldSize === size) return; |
| 890 | |
| 891 | if (size === 0) { |
| 892 | db.run("DELETE FROM vfs_chunks WHERE inode = ?", inode); |
| 893 | const rev = incrementRev(db); |
| 894 | db.run( |
| 895 | "UPDATE vfs_nodes SET mode = ?, mtime = ?, rev = ?, size = 0, manifest_hash = NULL WHERE inode = ?", |
| 896 | mode, |
| 897 | mtime, |
| 898 | rev, |
| 899 | inode, |
| 900 | ); |
| 901 | return; |
| 902 | } |
| 903 | |
| 904 | applyChunkedInodeUpdate( |
| 905 | db, |
no test coverage detected