| 33 | } |
| 34 | |
| 35 | func Load(log log.Log, dbPath string) (*DB, error) { |
| 36 | // Make the path directory |
| 37 | if err := os.MkdirAll(filepath.Dir(dbPath), 0755); err != nil { |
| 38 | return nil, err |
| 39 | } |
| 40 | // Open the SQLite database |
| 41 | db, err := sql.Open("sqlite3", dbPath) |
| 42 | if err != nil { |
| 43 | return nil, fmt.Errorf("dag/sqlite: unable to open %q. %w", dbPath, err) |
| 44 | } |
| 45 | |
| 46 | // Create the files and links tables. |
| 47 | if _, err := db.Exec(` |
| 48 | CREATE TABLE IF NOT EXISTS files ( |
| 49 | path TEXT PRIMARY KEY, |
| 50 | data BLOB, |
| 51 | mode INTEGER |
| 52 | ) |
| 53 | `); err != nil { |
| 54 | return nil, fmt.Errorf("dag/sqlite: unable to create files table. %w", err) |
| 55 | } |
| 56 | if _, err := db.Exec(` |
| 57 | CREATE TABLE IF NOT EXISTS links ( |
| 58 | from_path TEXT, |
| 59 | to_path TEXT, |
| 60 | FOREIGN KEY(from_path) REFERENCES files(path), |
| 61 | FOREIGN KEY(to_path) REFERENCES files(path), |
| 62 | PRIMARY KEY(from_path, to_path) |
| 63 | ) |
| 64 | `); err != nil { |
| 65 | return nil, fmt.Errorf("dag/sqlite: unable to create links table. %w", err) |
| 66 | } |
| 67 | |
| 68 | return &DB{db, log, dbPath}, nil |
| 69 | } |
| 70 | |
| 71 | type DB struct { |
| 72 | db *sql.DB |