325 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package store
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"crypto/tls"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/unistack-org/micro/v3/codec"
 | 
						|
	"github.com/unistack-org/micro/v3/logger"
 | 
						|
	"github.com/unistack-org/micro/v3/metadata"
 | 
						|
	"github.com/unistack-org/micro/v3/meter"
 | 
						|
	"github.com/unistack-org/micro/v3/tracer"
 | 
						|
)
 | 
						|
 | 
						|
// Options contains configuration for the Store
 | 
						|
type Options struct {
 | 
						|
	// Meter used for metrics
 | 
						|
	Meter meter.Meter
 | 
						|
	// Tracer used for tracing
 | 
						|
	Tracer tracer.Tracer
 | 
						|
	// Context holds external options
 | 
						|
	Context context.Context
 | 
						|
	// Codec used to marshal/unmarshal
 | 
						|
	Codec codec.Codec
 | 
						|
	// Logger used for logging
 | 
						|
	Logger logger.Logger
 | 
						|
	// TLSConfig holds tls.TLSConfig options
 | 
						|
	TLSConfig *tls.Config
 | 
						|
	// Name specifies store name
 | 
						|
	Name string
 | 
						|
	// Database specifies store database
 | 
						|
	Database string
 | 
						|
	// Table specifies store table
 | 
						|
	Table string
 | 
						|
	// Nodes contains store address
 | 
						|
	// TODO: replace with Addrs
 | 
						|
	Nodes []string
 | 
						|
}
 | 
						|
 | 
						|
// NewOptions creates options struct
 | 
						|
func NewOptions(opts ...Option) Options {
 | 
						|
	options := Options{
 | 
						|
		Logger:  logger.DefaultLogger,
 | 
						|
		Context: context.Background(),
 | 
						|
		Codec:   codec.DefaultCodec,
 | 
						|
		Tracer:  tracer.DefaultTracer,
 | 
						|
		Meter:   meter.DefaultMeter,
 | 
						|
	}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 | 
						|
 | 
						|
// Option sets values in Options
 | 
						|
type Option func(o *Options)
 | 
						|
 | 
						|
// TLSConfig specifies a *tls.Config
 | 
						|
func TLSConfig(t *tls.Config) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.TLSConfig = t
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Context pass context to store
 | 
						|
func Context(ctx context.Context) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Context = ctx
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Codec sets the codec
 | 
						|
func Codec(c codec.Codec) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Codec = c
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Logger sets the logger
 | 
						|
func Logger(l logger.Logger) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Logger = l
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Meter sets the meter
 | 
						|
func Meter(m meter.Meter) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Meter = m
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Name the name
 | 
						|
func Name(n string) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Name = n
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Tracer sets the tracer
 | 
						|
func Tracer(t tracer.Tracer) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Tracer = t
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Nodes contains the addresses or other connection information of the backing storage.
 | 
						|
// For example, an etcd implementation would contain the nodes of the cluster.
 | 
						|
// A SQL implementation could contain one or more connection strings.
 | 
						|
func Nodes(a ...string) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Nodes = a
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Database allows multiple isolated stores to be kept in one backend, if supported.
 | 
						|
func Database(db string) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Database = db
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Table is analag for a table in database backends or a key prefix in KV backends
 | 
						|
func Table(t string) Option {
 | 
						|
	return func(o *Options) {
 | 
						|
		o.Table = t
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewReadOptions fills ReadOptions struct with opts slice
 | 
						|
func NewReadOptions(opts ...ReadOption) ReadOptions {
 | 
						|
	options := ReadOptions{}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 | 
						|
 | 
						|
// ReadOptions configures an individual Read operation
 | 
						|
type ReadOptions struct {
 | 
						|
	// Context holds external options
 | 
						|
	Context context.Context
 | 
						|
	// Database holds the database name
 | 
						|
	Database string
 | 
						|
	// Table holds table name
 | 
						|
	Table string
 | 
						|
	// Namespace holds namespace
 | 
						|
	Namespace string
 | 
						|
}
 | 
						|
 | 
						|
// ReadOption sets values in ReadOptions
 | 
						|
type ReadOption func(r *ReadOptions)
 | 
						|
 | 
						|
// ReadFrom the database and table
 | 
						|
func ReadFrom(database, table string) ReadOption {
 | 
						|
	return func(r *ReadOptions) {
 | 
						|
		r.Database = database
 | 
						|
		r.Table = table
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewWriteOptions fills WriteOptions struct with opts slice
 | 
						|
func NewWriteOptions(opts ...WriteOption) WriteOptions {
 | 
						|
	options := WriteOptions{}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 | 
						|
 | 
						|
// WriteOptions configures an individual Write operation
 | 
						|
type WriteOptions struct {
 | 
						|
	// Context holds external options
 | 
						|
	Context context.Context
 | 
						|
	// Metadata contains additional metadata
 | 
						|
	Metadata metadata.Metadata
 | 
						|
	// Database holds database name
 | 
						|
	Database string
 | 
						|
	// Table holds table name
 | 
						|
	Table string
 | 
						|
	// Namespace holds namespace
 | 
						|
	Namespace string
 | 
						|
	// TTL specifies key TTL
 | 
						|
	TTL time.Duration
 | 
						|
}
 | 
						|
 | 
						|
// WriteOption sets values in WriteOptions
 | 
						|
type WriteOption func(w *WriteOptions)
 | 
						|
 | 
						|
// WriteTo the database and table
 | 
						|
func WriteTo(database, table string) WriteOption {
 | 
						|
	return func(w *WriteOptions) {
 | 
						|
		w.Database = database
 | 
						|
		w.Table = table
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// WriteTTL is the time the record expires
 | 
						|
func WriteTTL(d time.Duration) WriteOption {
 | 
						|
	return func(w *WriteOptions) {
 | 
						|
		w.TTL = d
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// WriteMetadata add metadata.Metadata
 | 
						|
func WriteMetadata(md metadata.Metadata) WriteOption {
 | 
						|
	return func(w *WriteOptions) {
 | 
						|
		w.Metadata = metadata.Copy(md)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewDeleteOptions fills DeleteOptions struct with opts slice
 | 
						|
func NewDeleteOptions(opts ...DeleteOption) DeleteOptions {
 | 
						|
	options := DeleteOptions{}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 | 
						|
 | 
						|
// DeleteOptions configures an individual Delete operation
 | 
						|
type DeleteOptions struct {
 | 
						|
	// Context holds external options
 | 
						|
	Context context.Context
 | 
						|
	// Database holds database name
 | 
						|
	Database string
 | 
						|
	// Table holds table name
 | 
						|
	Table string
 | 
						|
	// Namespace holds namespace
 | 
						|
	Namespace string
 | 
						|
}
 | 
						|
 | 
						|
// DeleteOption sets values in DeleteOptions
 | 
						|
type DeleteOption func(d *DeleteOptions)
 | 
						|
 | 
						|
// DeleteFrom the database and table
 | 
						|
func DeleteFrom(database, table string) DeleteOption {
 | 
						|
	return func(d *DeleteOptions) {
 | 
						|
		d.Database = database
 | 
						|
		d.Table = table
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewListOptions fills ListOptions struct with opts slice
 | 
						|
func NewListOptions(opts ...ListOption) ListOptions {
 | 
						|
	options := ListOptions{}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 | 
						|
 | 
						|
// ListOptions configures an individual List operation
 | 
						|
type ListOptions struct {
 | 
						|
	Context   context.Context
 | 
						|
	Database  string
 | 
						|
	Prefix    string
 | 
						|
	Suffix    string
 | 
						|
	Namespace string
 | 
						|
	Table     string
 | 
						|
	Limit     uint
 | 
						|
	Offset    uint
 | 
						|
}
 | 
						|
 | 
						|
// ListOption sets values in ListOptions
 | 
						|
type ListOption func(l *ListOptions)
 | 
						|
 | 
						|
// ListFrom the database and table
 | 
						|
func ListFrom(database, table string) ListOption {
 | 
						|
	return func(l *ListOptions) {
 | 
						|
		l.Database = database
 | 
						|
		l.Table = table
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ListPrefix returns all keys that are prefixed with key
 | 
						|
func ListPrefix(p string) ListOption {
 | 
						|
	return func(l *ListOptions) {
 | 
						|
		l.Prefix = p
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ListSuffix returns all keys that end with key
 | 
						|
func ListSuffix(s string) ListOption {
 | 
						|
	return func(l *ListOptions) {
 | 
						|
		l.Suffix = s
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ListLimit limits the number of returned keys to l
 | 
						|
func ListLimit(l uint) ListOption {
 | 
						|
	return func(lo *ListOptions) {
 | 
						|
		lo.Limit = l
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ListOffset starts returning responses from o. Use in conjunction with Limit for pagination.
 | 
						|
func ListOffset(o uint) ListOption {
 | 
						|
	return func(l *ListOptions) {
 | 
						|
		l.Offset = o
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ExistsOption specifies Exists call options
 | 
						|
type ExistsOption func(*ExistsOptions)
 | 
						|
 | 
						|
// ExistsOptions holds options for Exists method
 | 
						|
type ExistsOptions struct {
 | 
						|
	// Context holds external options
 | 
						|
	Context context.Context
 | 
						|
	// Namespace contains namespace
 | 
						|
	Namespace string
 | 
						|
}
 | 
						|
 | 
						|
// NewExistsOptions helper for Exists method
 | 
						|
func NewExistsOptions(opts ...ExistsOption) ExistsOptions {
 | 
						|
	options := ExistsOptions{
 | 
						|
		Context: context.Background(),
 | 
						|
	}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	return options
 | 
						|
}
 |