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  }