61 lines
1.8 KiB
Markdown
61 lines
1.8 KiB
Markdown
# SQLite Database Support
|
|
|
|
## Overview
|
|
|
|
Add SQLite database support to Sis using the `sqlite-simple` library. On
|
|
startup, the server opens a SQLite database (creating the file if it doesn't
|
|
exist), enables WAL mode and foreign keys, and makes the connection available.
|
|
No tables are created yet — that comes in a later task.
|
|
|
|
## Architecture
|
|
|
|
### New dependency
|
|
|
|
- `sqlite-simple` added to `package.yaml`.
|
|
|
|
### New module: `Sis.Database`
|
|
|
|
Exposes one function:
|
|
|
|
```haskell
|
|
openDatabase :: FilePath -> IO Connection
|
|
```
|
|
|
|
Behavior:
|
|
|
|
- Opens (or creates) the SQLite database file at the given path.
|
|
- Enables WAL journal mode (`PRAGMA journal_mode=WAL`).
|
|
- Enables foreign keys (`PRAGMA foreign_keys=ON`).
|
|
- Returns the `Connection`.
|
|
|
|
No tables are created in this task. The file will contain only the empty SQLite
|
|
schema.
|
|
|
|
### Server wiring
|
|
|
|
- New CLI option `--db-path` in `app/Main.hs` with default value `data/sis.db`.
|
|
- `main` opens the database connection via `Sis.Database.openDatabase` before
|
|
starting the Warp server.
|
|
- The connection is not yet passed into the Orb app — that wiring happens when
|
|
the first table and routes are added in subsequent tasks.
|
|
|
|
## Data flow
|
|
|
|
```
|
|
startup → parseOptions → openDatabase (creates file, sets pragmas)
|
|
→ start Warp server (connection held, unused for now)
|
|
```
|
|
|
|
## Error handling
|
|
|
|
- If `openDatabase` fails (e.g., unwritable path, disk full), the exception
|
|
propagates and the server fails to start. This is correct — the server cannot
|
|
function without its database.
|
|
|
|
## Testing
|
|
|
|
- The existing `spec` test suite does not require changes since there are no
|
|
new routes or business logic.
|
|
- Integration-level tests for database operations will be added when tables
|
|
and queries are introduced in subsequent tasks.
|