aboutsummaryrefslogtreecommitdiff
path: root/weed/filer/tarantool/tarantool_store_kv.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/filer/tarantool/tarantool_store_kv.go')
-rw-r--r--weed/filer/tarantool/tarantool_store_kv.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/weed/filer/tarantool/tarantool_store_kv.go b/weed/filer/tarantool/tarantool_store_kv.go
new file mode 100644
index 000000000..e9f0f4dd0
--- /dev/null
+++ b/weed/filer/tarantool/tarantool_store_kv.go
@@ -0,0 +1,95 @@
+//go:build tarantool
+// +build tarantool
+
+package tarantool
+
+import (
+ "context"
+ "fmt"
+ "reflect"
+
+ "github.com/seaweedfs/seaweedfs/weed/filer"
+ "github.com/tarantool/go-tarantool/v2/crud"
+ "github.com/tarantool/go-tarantool/v2/pool"
+)
+
+const (
+ tarantoolKVSpaceName = "key_value"
+)
+
+func (store *TarantoolStore) KvPut(ctx context.Context, key []byte, value []byte) (err error) {
+
+ var operations = []crud.Operation{
+ {
+ Operator: crud.Insert,
+ Field: "value",
+ Value: string(value),
+ },
+ }
+
+ req := crud.MakeUpsertRequest(tarantoolKVSpaceName).
+ Tuple([]interface{}{string(key), nil, string(value)}).
+ Operations(operations)
+
+ ret := crud.Result{}
+ if err := store.pool.Do(req, pool.RW).GetTyped(&ret); err != nil {
+ return fmt.Errorf("kv put: %v", err)
+ }
+
+ return nil
+}
+
+func (store *TarantoolStore) KvGet(ctx context.Context, key []byte) (value []byte, err error) {
+
+ getOpts := crud.GetOpts{
+ Fields: crud.MakeOptTuple([]interface{}{"value"}),
+ Mode: crud.MakeOptString("read"),
+ PreferReplica: crud.MakeOptBool(true),
+ Balance: crud.MakeOptBool(true),
+ }
+
+ req := crud.MakeGetRequest(tarantoolKVSpaceName).
+ Key(crud.Tuple([]interface{}{string(key)})).
+ Opts(getOpts)
+
+ resp := crud.Result{}
+
+ err = store.pool.Do(req, pool.PreferRO).GetTyped(&resp)
+ if err != nil {
+ return nil, err
+ }
+
+ results, ok := resp.Rows.([]interface{})
+ if !ok || len(results) != 1 {
+ return nil, filer.ErrKvNotFound
+ }
+
+ rows, ok := results[0].([]interface{})
+ if !ok || len(rows) != 1 {
+ return nil, filer.ErrKvNotFound
+ }
+
+ row, ok := rows[0].(string)
+ if !ok {
+ return nil, fmt.Errorf("Can't convert rows[0] field to string. Actual type: %v, value: %v", reflect.TypeOf(rows[0]), rows[0])
+ }
+
+ return []byte(row), nil
+}
+
+func (store *TarantoolStore) KvDelete(ctx context.Context, key []byte) (err error) {
+
+ delOpts := crud.DeleteOpts{
+ Noreturn: crud.MakeOptBool(true),
+ }
+
+ req := crud.MakeDeleteRequest(tarantoolKVSpaceName).
+ Key(crud.Tuple([]interface{}{string(key)})).
+ Opts(delOpts)
+
+ if _, err := store.pool.Do(req, pool.RW).Get(); err != nil {
+ return fmt.Errorf("kv delete: %v", err)
+ }
+
+ return nil
+}