ScopedStore wraps Store and auto-prefixes groups with a namespace to prevent key collisions across tenants. QuotaConfig enforces per-namespace MaxKeys and MaxGroups limits (zero = unlimited). Upserts and expired keys are excluded from quota counts. New Store methods: CountAll(prefix) and Groups(prefix) for cross-group queries. All 93 tests pass with race detector, coverage 94.7%. Co-Authored-By: Virgil <virgil@lethean.io> Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1.8 KiB
1.8 KiB
CLAUDE.md
What This Is
SQLite key-value store wrapper with TTL support and namespace isolation. Module: forge.lthn.ai/core/go-store
Commands
go test ./... # Run all tests
go test -v -run Name # Run single test
go test -race ./... # Race detector
go test -cover ./... # Coverage (target: 90%+)
go test -bench=. ./... # Benchmarks
Key API
st, _ := store.New(":memory:") // or store.New("/path/to/db")
defer st.Close()
st.Set("group", "key", "value") // no expiry
st.SetWithTTL("group", "key", "value", 5*time.Minute) // expires after TTL
val, _ := st.Get("group", "key") // lazy-deletes expired
st.Delete("group", "key")
st.DeleteGroup("group")
all, _ := st.GetAll("group") // excludes expired
n, _ := st.Count("group") // excludes expired
out, _ := st.Render(tmpl, "group") // excludes expired
removed, _ := st.PurgeExpired() // manual purge
total, _ := st.CountAll("prefix:") // count keys matching prefix (excludes expired)
groups, _ := st.Groups("prefix:") // distinct group names matching prefix
// Namespace isolation (auto-prefixes groups with "tenant:")
sc, _ := store.NewScoped(st, "tenant")
sc.Set("config", "key", "val") // stored as "tenant:config" in underlying store
sc.Get("config", "key") // reads from "tenant:config"
// With quota enforcement
quota := store.QuotaConfig{MaxKeys: 100, MaxGroups: 10}
sq, _ := store.NewScopedWithQuota(st, "tenant", quota)
sq.Set("g", "k", "v") // returns ErrQuotaExceeded if limits hit
Coding Standards
- UK English
go test ./...must pass before commit- Conventional commits:
type(scope): description - Co-Author:
Co-Authored-By: Virgil <virgil@lethean.io>