fix(store-and-forward): create the SQLite database directory on init (StoreAndForward-014)
StoreAndForwardStorage.InitializeAsync opened a SqliteConnection against the configured SqliteDbPath (default ./data/store-and-forward.db) without ensuring the parent directory exists. SQLite creates the database file but not its directory, so when data/ was absent the connection failed with "SQLite Error 14: unable to open database file" — aborting the site host's RegisterSiteActors at StoreAndForwardService.StartAsync. This was the root cause of the six failing SiteActorPathTests. Production masked it because the Docker image / deployment creates data/. InitializeAsync now calls EnsureDatabaseDirectoryExists, which parses the connection string and creates the parent directory of a file-backed database (in-memory databases and bare filenames are skipped). Regression test InitializeAsync_FileInMissingDirectory_CreatesDirectory fails against the pre-fix code. Host suite now 155/155 green (was 149/155).
This commit is contained in:
@@ -470,3 +470,41 @@ invalid-JSON payloads.
|
||||
**Resolution**
|
||||
|
||||
_Unresolved._
|
||||
|
||||
### StoreAndForward-014 — Storage does not create its SQLite database directory
|
||||
|
||||
| | |
|
||||
|--|--|
|
||||
| Severity | Medium |
|
||||
| Category | Error handling & resilience |
|
||||
| Status | Resolved |
|
||||
| Location | `src/ScadaLink.StoreAndForward/StoreAndForwardStorage.cs:26` |
|
||||
|
||||
**Found 2026-05-16** while verifying the store-and-forward fixes — this defect was
|
||||
not part of the original baseline review.
|
||||
|
||||
**Description**
|
||||
|
||||
`StoreAndForwardStorage.InitializeAsync` opened a `SqliteConnection` against the
|
||||
configured `SqliteDbPath` (default `./data/store-and-forward.db`) without ensuring the
|
||||
parent directory exists. SQLite creates the database *file* on demand but not its
|
||||
*directory*, so when `data/` does not already exist the connection fails to open with
|
||||
`SQLite Error 14: 'unable to open database file'`. Every site-host boot therefore failed
|
||||
in any environment whose working directory has no `data/` folder — the cause of the six
|
||||
failing `SiteActorPathTests` (the host's `RegisterSiteActors` aborts at
|
||||
`StoreAndForwardService.StartAsync`). Production masked it because `data/` is created by
|
||||
the Docker image / deployment.
|
||||
|
||||
**Recommendation**
|
||||
|
||||
Create the parent directory of a file-backed SQLite database before opening it.
|
||||
|
||||
**Resolution**
|
||||
|
||||
Resolved 2026-05-16. `InitializeAsync` now calls a new `EnsureDatabaseDirectoryExists`
|
||||
helper that parses the connection string with `SqliteConnectionStringBuilder` and, for a
|
||||
file-backed database, creates the parent directory if it is missing (in-memory databases
|
||||
and bare filenames are skipped). Regression test
|
||||
`InitializeAsync_FileInMissingDirectory_CreatesDirectory` fails against the pre-fix code;
|
||||
all six `SiteActorPathTests` now pass. Fixed by the commit whose message references
|
||||
`StoreAndForward-014`.
|
||||
|
||||
Reference in New Issue
Block a user