add key/value store service (#36868)

* add key/value store service

* don't export kvStoreSQL, consumers should interact with KVStore & NamespacedKVStore

* add del method, avoid ErrNotFound (#38627)

* switch value column to medium text

Co-authored-by: Alexander Emelin <frvzmb@gmail.com>
This commit is contained in:
Dan Cech
2021-08-31 11:05:45 -04:00
committed by GitHub
co-authored by Alexander Emelin
parent dd24995852
commit 681de1ea89
7 changed files with 364 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
package kvstore
import (
"context"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/services/sqlstore"
)
func ProvideService(sqlStore *sqlstore.SQLStore) KVStore {
return &kvStoreSQL{
sqlStore: sqlStore,
log: log.New("infra.kvstore.sql"),
}
}
// KVStore is an interface for k/v store.
type KVStore interface {
Get(ctx context.Context, orgId int64, namespace string, key string) (string, bool, error)
Set(ctx context.Context, orgId int64, namespace string, key string, value string) error
Del(ctx context.Context, orgId int64, namespace string, key string) error
}
// WithNamespace returns a kvstore wrapper with fixed orgId and namespace.
func WithNamespace(kv KVStore, orgId int64, namespace string) *NamespacedKVStore {
return &NamespacedKVStore{
kvStore: kv,
orgId: orgId,
namespace: namespace,
}
}
// NamespacedKVStore is a KVStore wrapper with fixed orgId and namespace.
type NamespacedKVStore struct {
kvStore KVStore
orgId int64
namespace string
}
func (kv *NamespacedKVStore) Get(ctx context.Context, key string) (string, bool, error) {
return kv.kvStore.Get(ctx, kv.orgId, kv.namespace, key)
}
func (kv *NamespacedKVStore) Set(ctx context.Context, key string, value string) error {
return kv.kvStore.Set(ctx, kv.orgId, kv.namespace, key, value)
}
func (kv *NamespacedKVStore) Del(ctx context.Context, key string) error {
return kv.kvStore.Del(ctx, kv.orgId, kv.namespace, key)
}