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 }