// Package store provides SQLite-backed storage for grouped entries, TTL expiry, // namespace isolation, quota enforcement, reactive change notifications, and // workspace journalling. // // Usage example: // // func main() { // storeInstance, err := store.New(":memory:") // if err != nil { // return // } // defer storeInstance.Close() // // if err := storeInstance.Set("config", "colour", "blue"); err != nil { // return // } // if err := storeInstance.SetWithTTL("session", "token", "abc123", 5*time.Minute); err != nil { // return // } // // colourValue, err := storeInstance.Get("config", "colour") // if err != nil { // return // } // fmt.Println(colourValue) // // for entry, err := range storeInstance.All("config") { // if err != nil { // return // } // fmt.Println(entry.Key, entry.Value) // } // // events := storeInstance.Watch("config") // defer storeInstance.Unwatch("config", events) // go func() { // for event := range events { // fmt.Println(event.Type, event.Group, event.Key, event.Value) // } // }() // // unregister := storeInstance.OnChange(func(event store.Event) { // fmt.Println("changed", event.Group, event.Key, event.Value) // }) // defer unregister() // // scopedStore, err := store.NewScopedWithQuota( // storeInstance, // "tenant-a", // store.QuotaConfig{MaxKeys: 100, MaxGroups: 10}, // ) // if err != nil { // return // } // if err := scopedStore.SetIn("preferences", "locale", "en-GB"); err != nil { // return // } // // for groupName, err := range storeInstance.GroupsSeq("tenant-a:") { // if err != nil { // return // } // fmt.Println(groupName) // } // // workspace, err := storeInstance.NewWorkspace("scroll-session") // if err != nil { // return // } // defer workspace.Discard() // // if err := workspace.Put("like", map[string]any{"user": "@alice"}); err != nil { // return // } // if err := workspace.Put("profile_match", map[string]any{"user": "@charlie"}); err != nil { // return // } // if result := workspace.Commit(); !result.OK { // return // } // // journalResult := storeInstance.QueryJournal(`from(bucket: "events") |> range(start: -24h)`) // if !journalResult.OK { // return // } // // archiveResult := storeInstance.Compact(store.CompactOptions{ // Before: time.Now().Add(-30 * 24 * time.Hour), // Output: "/tmp/archive", // Format: "gzip", // }) // if !archiveResult.OK { // return // } // } package store