-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathdata_store.go
75 lines (66 loc) · 3.71 KB
/
data_store.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package subsystems
import (
"io"
"github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoretypes"
)
// DataStore is an interface for a data store that holds feature flags and related data received by
// the SDK.
//
// Ordinarily, the only implementations of this interface are the default in-memory implementation,
// which holds references to actual SDK data model objects, and the persistent data store
// implementation that delegates to a PersistentDataStore.
type DataStore interface {
io.Closer
// Init overwrites the store's contents with a set of items for each collection.
//
// All previous data should be discarded, regardless of versioning.
//
// The update should be done atomically. If it cannot be done atomically, then the store
// must first add or update each item in the same order that they are given in the input
// data, and then delete any previously stored items that were not in the input data.
Init(allData []ldstoretypes.Collection) error
// Get retrieves an item from the specified collection, if available.
//
// If the specified key does not exist in the collection, it should return an ItemDescriptor
// whose Version is -1.
//
// If the item has been deleted and the store contains a placeholder, it should return an
// ItemDescriptor whose Version is the version of the placeholder, and whose Item is nil.
Get(kind ldstoretypes.DataKind, key string) (ldstoretypes.ItemDescriptor, error)
// GetAll retrieves all items from the specified collection.
//
// If the store contains placeholders for deleted items, it should include them in the results,
// not filter them out.
GetAll(kind ldstoretypes.DataKind) ([]ldstoretypes.KeyedItemDescriptor, error)
// Upsert updates or inserts an item in the specified collection. For updates, the object will only be
// updated if the existing version is less than the new version.
//
// The SDK may pass an ItemDescriptor whose Item is nil, to represent a placeholder for a deleted
// item. In that case, assuming the version is greater than any existing version of that item, the
// store should retain that placeholder rather than simply not storing anything.
//
// The method returns true if the item was updated, or false if it was not updated because the store
// contains an equal or greater version.
Upsert(kind ldstoretypes.DataKind, key string, item ldstoretypes.ItemDescriptor) (bool, error)
// IsInitialized returns true if the data store contains a data set, meaning that Init has been
// called at least once.
//
// In a shared data store, it should be able to detect this even if Init was called in a
// different process: that is, the test should be based on looking at what is in the data store.
// Once this has been determined to be true, it can continue to return true without having to
// check the store again; this method should be as fast as possible since it may be called during
// feature flag evaluations.
IsInitialized() bool
// IsStatusMonitoringEnabled returns true if this data store implementation supports status
// monitoring.
//
// This is normally only true for persistent data stores created with ldcomponents.PersistentDataStore(),
// but it could also be true for any custom DataStore implementation that makes use of the
// statusUpdater parameter provided to the DataStoreFactory. Returning true means that the store
// guarantees that if it ever enters an invalid state (that is, an operation has failed or it knows
// that operations cannot succeed at the moment), it will publish a status update, and will then
// publish another status update once it has returned to a valid state.
//
// The same value will be returned from DataStoreStatusProvider.IsStatusMonitoringEnabled().
IsStatusMonitoringEnabled() bool
}