gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/store/service/service.go (about) 1 // Package service implements the store service interface 2 package service 3 4 import ( 5 "context" 6 "io" 7 "time" 8 9 "gitee.com/liuxuezhan/go-micro-v1.18.0/client" 10 "gitee.com/liuxuezhan/go-micro-v1.18.0/config/options" 11 "gitee.com/liuxuezhan/go-micro-v1.18.0/store" 12 pb "gitee.com/liuxuezhan/go-micro-v1.18.0/store/service/proto" 13 ) 14 15 type serviceStore struct { 16 options.Options 17 18 // Addresses of the nodes 19 Nodes []string 20 21 // store service client 22 Client pb.StoreService 23 } 24 25 // Sync all the known records 26 func (s *serviceStore) List() ([]*store.Record, error) { 27 stream, err := s.Client.List(context.Background(), &pb.ListRequest{}, client.WithAddress(s.Nodes...)) 28 if err != nil { 29 return nil, err 30 } 31 defer stream.Close() 32 33 var records []*store.Record 34 35 for { 36 rsp, err := stream.Recv() 37 if err == io.EOF { 38 break 39 } 40 if err != nil { 41 return records, err 42 } 43 for _, record := range rsp.Records { 44 records = append(records, &store.Record{ 45 Key: record.Key, 46 Value: record.Value, 47 Expiry: time.Duration(record.Expiry) * time.Second, 48 }) 49 } 50 } 51 52 return records, nil 53 } 54 55 // Read a record with key 56 func (s *serviceStore) Read(keys ...string) ([]*store.Record, error) { 57 rsp, err := s.Client.Read(context.Background(), &pb.ReadRequest{ 58 Keys: keys, 59 }, client.WithAddress(s.Nodes...)) 60 if err != nil { 61 return nil, err 62 } 63 64 records := make([]*store.Record, 0, len(rsp.Records)) 65 for _, val := range rsp.Records { 66 records = append(records, &store.Record{ 67 Key: val.Key, 68 Value: val.Value, 69 Expiry: time.Duration(val.Expiry) * time.Second, 70 }) 71 } 72 return records, nil 73 } 74 75 // Write a record 76 func (s *serviceStore) Write(recs ...*store.Record) error { 77 records := make([]*pb.Record, 0, len(recs)) 78 79 for _, record := range recs { 80 records = append(records, &pb.Record{ 81 Key: record.Key, 82 Value: record.Value, 83 Expiry: int64(record.Expiry.Seconds()), 84 }) 85 } 86 87 _, err := s.Client.Write(context.Background(), &pb.WriteRequest{ 88 Records: records, 89 }, client.WithAddress(s.Nodes...)) 90 91 return err 92 } 93 94 // Delete a record with key 95 func (s *serviceStore) Delete(keys ...string) error { 96 _, err := s.Client.Delete(context.Background(), &pb.DeleteRequest{ 97 Keys: keys, 98 }, client.WithAddress(s.Nodes...)) 99 return err 100 } 101 102 // NewStore returns a new store service implementation 103 func NewStore(opts ...options.Option) store.Store { 104 options := options.NewOptions(opts...) 105 106 var nodes []string 107 108 n, ok := options.Values().Get("store.nodes") 109 if ok { 110 nodes = n.([]string) 111 } 112 113 service := &serviceStore{ 114 Options: options, 115 Nodes: nodes, 116 Client: pb.NewStoreService("go.micro.store", client.DefaultClient), 117 } 118 119 return service 120 }