...

Source file src/golang.conradwood.net/go-easyops/client/objectstore.go

Documentation: golang.conradwood.net/go-easyops/client

     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  // evict (remove) an object from the objectstore by key
    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  // evict (remove) an object from the objectstore by key
    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  // get an object from the objectstore by key
    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