(db: Database, path: string)
| 389 | } |
| 390 | |
| 391 | function resolveFileInode(db: Database, path: string): { inode: number; mode: number } { |
| 392 | const { path: canonical } = canonicalizePath(path); |
| 393 | const node = db.one<{ inode: number; type: "file" | "dir"; mode: number }>( |
| 394 | `SELECT n.inode AS inode, n.type AS type, n.mode AS mode |
| 395 | FROM vfs_nodes n |
| 396 | WHERE n.inode = ( |
| 397 | SELECT child_inode |
| 398 | FROM vfs_dirents |
| 399 | WHERE parent_inode = ? AND name = ? |
| 400 | )`, |
| 401 | ...parentAndNameForResolvedPath(db, path), |
| 402 | ); |
| 403 | if (node === undefined) { |
| 404 | throw createWorkspaceError("ENOENT", `no such file: ${canonical}`, canonical); |
| 405 | } |
| 406 | if (node.type !== "file") { |
| 407 | throw createWorkspaceError("EISDIR", `path is a directory: ${canonical}`, canonical); |
| 408 | } |
| 409 | return { inode: node.inode, mode: node.mode }; |
| 410 | } |
| 411 | |
| 412 | function parentAndNameForResolvedPath(db: Database, path: string): [number, string] { |
| 413 | const { parts, path: canonical } = canonicalizePath(path); |
no test coverage detected