...
1 package client
2
3 import (
4 "context"
5 os "golang.conradwood.net/apis/objectstore"
6 "golang.conradwood.net/go-easyops/errors"
7 "io"
8 "time"
9 )
10
11 var (
12 ostore os.ObjectStoreClient
13 )
14
15 func getostore() {
16 if ostore != nil {
17 return
18 }
19 ostore = os.NewObjectStoreClient(Connect("objectstore.ObjectStore"))
20 }
21 func GetObjectStoreClient() os.ObjectStoreClient {
22 getostore()
23 return ostore
24 }
25 func PutWithID(ctx context.Context, key string, buf []byte) error {
26 if key == "" {
27 return errors.InvalidArgs(ctx, "missing key to store in objectstore", "missing key to store in objectstore")
28 }
29 return PutWithIDAndExpiry(ctx, key, buf, time.Time{})
30 }
31 func PutWithIDAndExpiry(ctx context.Context, key string, buf []byte, expiry time.Time) error {
32 if key == "" {
33 return errors.InvalidArgs(ctx, "missing key to store in objectstore", "missing key to store in objectstore")
34 }
35 getostore()
36 stream, err := ostore.LPutWithID(ctx)
37 if err != nil {
38 return err
39 }
40 size := 8192
41 repeat := true
42 offset := 0
43 for repeat {
44 if offset+size > len(buf) {
45 size = len(buf) - offset
46 repeat = false
47 }
48 n := buf[offset : offset+size]
49 offset = offset + size
50 pwr := &os.PutWithIDRequest{ID: key, Content: n}
51 if !expiry.IsZero() {
52 pwr.Expiry = uint32(expiry.Unix())
53 }
54 err := stream.Send(pwr)
55 if err != nil {
56 return err
57 }
58 }
59 _, err = stream.CloseAndRecv()
60 if err != nil {
61 return err
62 }
63 return err
64 }
65
66
67 func Evict(ctx context.Context, key string) ([]byte, error) {
68 if key == "" {
69 return nil, errors.InvalidArgs(ctx, "missing key to evict from objectstore", "missing key to evict from objectstore")
70 }
71 getostore()
72 gr := &os.EvictRequest{ID: key, ReturnObject: true}
73 _, err := ostore.Evict(ctx, gr)
74 return nil, err
75 }
76
77
78 func EvictNoResult(ctx context.Context, key string) error {
79 if key == "" {
80 return errors.InvalidArgs(ctx, "missing key to evict from objectstore", "missing key to evict from objectstore")
81 }
82 getostore()
83 gr := &os.EvictRequest{ID: key, ReturnObject: false}
84 _, err := ostore.Evict(ctx, gr)
85 return err
86 }
87
88
89 func Get(ctx context.Context, key string) ([]byte, error) {
90 if key == "" {
91 return nil, errors.InvalidArgs(ctx, "missing key to retrieve from objectstore", "missing key to retrieve from objectstore")
92 }
93 getostore()
94 gr := &os.GetRequest{ID: key}
95 stream, err := ostore.LGet(ctx, gr)
96 if err != nil {
97 return nil, err
98 }
99 var buf []byte
100 for {
101 ct, err := stream.Recv()
102 if err == nil {
103 buf = append(buf, ct.Content...)
104 continue
105 }
106 if err == io.EOF {
107 break
108 }
109 return nil, err
110
111 }
112 return buf, nil
113 }
114
View as plain text