diff --git a/README.md b/README.md index 15cafea..a54639f 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,12 @@ can target a single interface regardless of the underlying format on disk. publishes its key list via `ClassSupportedAttributes`. Full per-format matrix in [`docs/attributes-registry.md`](docs/attributes-registry.md). - **Per-user High-Water Mark** — `base.GetHWM('NetReader')` / - `base.SetHWM(...)` plus auto-bump via `base.ActiveUser`. Tossers and - scanners register as named users in the format's native lastread file - (`.JLR` for JAM, `.SQL` for Squish), so multiple consumers coexist - without colliding. Unsupported formats return -1 honestly. + `base.SetHWM(...)` plus auto-bump via `base.ActiveUser`. Native + for JAM (`.JLR`), Squish (`.SQL`), Hudson + GoldBase + (`LASTREAD.BBS/DAT`, with `MapUser` + `Board` context). Tossers + and scanners register as named users in the format's native + lastread file, so multiple consumers coexist without colliding. + Unsupported formats return -1 honestly. - Layered locking: in-process `TRTLCriticalSection` + cross-process advisory lock (`fpflock` on Unix, `LockFileEx` on Windows, `.LCK` sentinel fallback) + the existing `fmShareDenyWrite` / `fmShareDenyNone` share modes. diff --git a/docs/architecture.md b/docs/architecture.md index dfda0fa..a88bec9 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -106,7 +106,7 @@ naturally coexist without colliding. | Squish | ✓ | `.SQL` (CRC32(lower(name))) | | Hudson | ✓ | `LASTREAD.BBS` per-(user-id, board); needs `MapUser` + `Board` | | GoldBase | ✓ | `LASTREAD.DAT` per-(user-id, board); needs `MapUser` + `Board` | -| EzyCom | — | per-area lastread; deferred | +| EzyCom | — | per-user state lives in the BBS user records, not the message base; no msg-base lastread file to plumb | | Wildcat | — | SDK exposes `MarkMsgRead` per-message but no per-user HWM primitive | | PCBoard | — | USERS file lastread per-conference; deferred | | MSG, PKT | — | spec has no HWM concept |