github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/query/options/retry.go (about)

     1  package options
     2  
     3  import (
     4  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/tx"
     5  	"github.com/ydb-platform/ydb-go-sdk/v3/retry"
     6  	"github.com/ydb-platform/ydb-go-sdk/v3/retry/budget"
     7  	"github.com/ydb-platform/ydb-go-sdk/v3/trace"
     8  )
     9  
    10  var (
    11  	_ DoOption = RetryOptionsOption(nil)
    12  	_ DoOption = TraceOption{}
    13  
    14  	_ DoTxOption = RetryOptionsOption(nil)
    15  	_ DoTxOption = TraceOption{}
    16  	_ DoTxOption = doTxSettingsOption{}
    17  )
    18  
    19  type (
    20  	DoOption interface {
    21  		applyDoOption(s *doSettings)
    22  	}
    23  
    24  	doSettings struct {
    25  		retryOpts []retry.Option
    26  		trace     *trace.Query
    27  	}
    28  
    29  	DoTxOption interface {
    30  		applyDoTxOption(o *doTxSettings)
    31  	}
    32  
    33  	doTxSettings struct {
    34  		doSettings
    35  		txSettings tx.Settings
    36  	}
    37  
    38  	RetryOptionsOption []retry.Option
    39  	TraceOption        struct {
    40  		t *trace.Query
    41  	}
    42  	doTxSettingsOption struct {
    43  		txSettings tx.Settings
    44  	}
    45  )
    46  
    47  func (opts RetryOptionsOption) applyExecuteOption(s *executeSettings) {
    48  	s.retryOptions = append(s.retryOptions, opts...)
    49  }
    50  
    51  func (s *doSettings) Trace() *trace.Query {
    52  	return s.trace
    53  }
    54  
    55  func (s *doSettings) RetryOpts() []retry.Option {
    56  	return s.retryOpts
    57  }
    58  
    59  func (s *doTxSettings) TxSettings() tx.Settings {
    60  	return s.txSettings
    61  }
    62  
    63  func (opt TraceOption) applyDoOption(s *doSettings) {
    64  	s.trace = s.trace.Compose(opt.t)
    65  }
    66  
    67  func (opt TraceOption) applyDoTxOption(s *doTxSettings) {
    68  	opt.applyDoOption(&s.doSettings)
    69  }
    70  
    71  func (opts RetryOptionsOption) applyDoOption(s *doSettings) {
    72  	s.retryOpts = append(s.retryOpts, opts...)
    73  }
    74  
    75  func (opts RetryOptionsOption) applyDoTxOption(s *doTxSettings) {
    76  	opts.applyDoOption(&s.doSettings)
    77  }
    78  
    79  func (opt doTxSettingsOption) applyDoTxOption(opts *doTxSettings) {
    80  	opts.txSettings = opt.txSettings
    81  }
    82  
    83  func WithTxSettings(txSettings tx.Settings) doTxSettingsOption {
    84  	return doTxSettingsOption{txSettings: txSettings}
    85  }
    86  
    87  func WithIdempotent() RetryOptionsOption {
    88  	return []retry.Option{retry.WithIdempotent(true)}
    89  }
    90  
    91  func WithLabel(lbl string) RetryOptionsOption {
    92  	return []retry.Option{retry.WithLabel(lbl)}
    93  }
    94  
    95  func WithTrace(t *trace.Query) TraceOption {
    96  	return TraceOption{t: t}
    97  }
    98  
    99  func WithRetryBudget(b budget.Budget) RetryOptionsOption {
   100  	return []retry.Option{retry.WithBudget(b)}
   101  }
   102  
   103  func ParseDoOpts(t *trace.Query, opts ...DoOption) (s *doSettings) {
   104  	s = &doSettings{
   105  		trace: t,
   106  	}
   107  
   108  	for _, opt := range opts {
   109  		if opt != nil {
   110  			opt.applyDoOption(s)
   111  		}
   112  	}
   113  
   114  	return s
   115  }
   116  
   117  func ParseDoTxOpts(t *trace.Query, opts ...DoTxOption) (s *doTxSettings) {
   118  	s = &doTxSettings{
   119  		txSettings: tx.NewSettings(tx.WithDefaultTxMode()),
   120  		doSettings: doSettings{
   121  			trace: t,
   122  		},
   123  	}
   124  
   125  	for _, opt := range opts {
   126  		if opt != nil {
   127  			opt.applyDoTxOption(s)
   128  		}
   129  	}
   130  
   131  	return s
   132  }