You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							95 lines
						
					
					
						
							2.1 KiB
						
					
					
				| //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: %w", 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: %w", err) | |
| 	} | |
| 
 | |
| 	return nil | |
| }
 |