@@ -246,23 +246,23 @@ func getSink(
246
246
if knobs , ok := serverCfg .TestingKnobs .Changefeed .(* TestingKnobs ); ok {
247
247
nullIsAccounted = knobs .NullSinkIsExternalIOAccounted
248
248
}
249
- return makeNullSink (sinkURL {URL : u }, metricsBuilder (nullIsAccounted ))
249
+ return makeNullSink (& changefeedbase. SinkURL {URL : u }, metricsBuilder (nullIsAccounted ))
250
250
case isKafkaSink (u ):
251
251
return validateOptionsAndMakeSink (changefeedbase .KafkaValidOptions , func () (Sink , error ) {
252
252
if KafkaV2Enabled .Get (& serverCfg .Settings .SV ) {
253
- return makeKafkaSinkV2 (ctx , sinkURL {URL : u }, AllTargets (feedCfg ), opts .GetKafkaConfigJSON (),
253
+ return makeKafkaSinkV2 (ctx , & changefeedbase. SinkURL {URL : u }, AllTargets (feedCfg ), opts .GetKafkaConfigJSON (),
254
254
numSinkIOWorkers (serverCfg ), newCPUPacerFactory (ctx , serverCfg ), timeutil.DefaultTimeSource {},
255
255
serverCfg .Settings , metricsBuilder , kafkaSinkV2Knobs {})
256
256
} else {
257
- return makeKafkaSink (ctx , sinkURL {URL : u }, AllTargets (feedCfg ), opts .GetKafkaConfigJSON (), serverCfg .Settings , metricsBuilder )
257
+ return makeKafkaSink (ctx , & changefeedbase. SinkURL {URL : u }, AllTargets (feedCfg ), opts .GetKafkaConfigJSON (), serverCfg .Settings , metricsBuilder )
258
258
}
259
259
})
260
260
case isPulsarSink (u ):
261
261
var testingKnobs * TestingKnobs
262
262
if knobs , ok := serverCfg .TestingKnobs .Changefeed .(* TestingKnobs ); ok {
263
263
testingKnobs = knobs
264
264
}
265
- return makePulsarSink (ctx , sinkURL {URL : u }, encodingOpts , AllTargets (feedCfg ), opts .GetKafkaConfigJSON (),
265
+ return makePulsarSink (ctx , & changefeedbase. SinkURL {URL : u }, encodingOpts , AllTargets (feedCfg ), opts .GetKafkaConfigJSON (),
266
266
serverCfg .Settings , metricsBuilder , testingKnobs )
267
267
case isWebhookSink (u ):
268
268
webhookOpts , err := opts .GetWebhookSinkOptions ()
@@ -271,13 +271,13 @@ func getSink(
271
271
}
272
272
if WebhookV2Enabled .Get (& serverCfg .Settings .SV ) {
273
273
return validateOptionsAndMakeSink (changefeedbase .WebhookValidOptions , func () (Sink , error ) {
274
- return makeWebhookSink (ctx , sinkURL {URL : u }, encodingOpts , webhookOpts ,
274
+ return makeWebhookSink (ctx , & changefeedbase. SinkURL {URL : u }, encodingOpts , webhookOpts ,
275
275
numSinkIOWorkers (serverCfg ), newCPUPacerFactory (ctx , serverCfg ), timeutil.DefaultTimeSource {},
276
276
metricsBuilder , serverCfg .Settings )
277
277
})
278
278
} else {
279
279
return validateOptionsAndMakeSink (changefeedbase .WebhookValidOptions , func () (Sink , error ) {
280
- return makeDeprecatedWebhookSink (ctx , sinkURL {URL : u }, encodingOpts , webhookOpts ,
280
+ return makeDeprecatedWebhookSink (ctx , & changefeedbase. SinkURL {URL : u }, encodingOpts , webhookOpts ,
281
281
defaultWorkerCount (), timeutil.DefaultTimeSource {}, metricsBuilder )
282
282
})
283
283
}
@@ -307,18 +307,18 @@ func getSink(
307
307
nodeID = serverCfg .NodeID .SQLInstanceID ()
308
308
}
309
309
return makeCloudStorageSink (
310
- ctx , sinkURL {URL : u }, nodeID , serverCfg .Settings , encodingOpts ,
310
+ ctx , & changefeedbase. SinkURL {URL : u }, nodeID , serverCfg .Settings , encodingOpts ,
311
311
timestampOracle , serverCfg .ExternalStorageFromURI , user , metricsBuilder , testingKnobs ,
312
312
)
313
313
})
314
314
case u .Scheme == changefeedbase .SinkSchemeExperimentalSQL :
315
315
return validateOptionsAndMakeSink (changefeedbase .SQLValidOptions , func () (Sink , error ) {
316
- return makeSQLSink (sinkURL {URL : u }, sqlSinkTableName , AllTargets (feedCfg ), metricsBuilder )
316
+ return makeSQLSink (& changefeedbase. SinkURL {URL : u }, sqlSinkTableName , AllTargets (feedCfg ), metricsBuilder )
317
317
})
318
318
case u .Scheme == changefeedbase .SinkSchemeExternalConnection :
319
319
return validateOptionsAndMakeSink (changefeedbase .ExternalConnectionValidOptions , func () (Sink , error ) {
320
320
return makeExternalConnectionSink (
321
- ctx , sinkURL {URL : u }, user , makeExternalConnectionProvider (ctx , serverCfg .DB ),
321
+ ctx , & changefeedbase. SinkURL {URL : u }, user , makeExternalConnectionProvider (ctx , serverCfg .DB ),
322
322
serverCfg , feedCfg , timestampOracle , jobID , m ,
323
323
)
324
324
})
@@ -362,70 +362,6 @@ func validateSinkOptions(opts map[string]string, sinkSpecificOpts map[string]str
362
362
return nil
363
363
}
364
364
365
- // sinkURL is a helper struct which for "consuming" URL query
366
- // parameters from the underlying URL.
367
- type sinkURL struct {
368
- * url.URL
369
- q url.Values
370
- }
371
-
372
- func (u * sinkURL ) consumeParam (p string ) string {
373
- if u .q == nil {
374
- u .q = u .Query ()
375
- }
376
- v := u .q .Get (p )
377
- u .q .Del (p )
378
- return v
379
- }
380
-
381
- func (u * sinkURL ) addParam (p string , value string ) {
382
- if u .q == nil {
383
- u .q = u .Query ()
384
- }
385
- u .q .Add (p , value )
386
- }
387
-
388
- func (u * sinkURL ) consumeBool (param string , dest * bool ) (wasSet bool , err error ) {
389
- if paramVal := u .consumeParam (param ); paramVal != "" {
390
- wasSet , err := strToBool (paramVal , dest )
391
- if err != nil {
392
- return false , errors .Wrapf (err , "param %s must be a bool" , param )
393
- }
394
- return wasSet , err
395
- }
396
- return false , nil
397
- }
398
-
399
- func (u * sinkURL ) decodeBase64 (param string , dest * []byte ) error {
400
- // TODO(dan): There's a straightforward and unambiguous transformation
401
- // between the base 64 encoding defined in RFC 4648 and the URL variant
402
- // defined in the same RFC: simply replace all `+` with `-` and `/` with
403
- // `_`. Consider always doing this for the user and accepting either
404
- // variant.
405
- val := u .consumeParam (param )
406
- err := decodeBase64FromString (val , dest )
407
- if err != nil {
408
- return errors .Wrapf (err , `param %s must be base 64 encoded` , param )
409
- }
410
- return nil
411
- }
412
-
413
- func (u * sinkURL ) remainingQueryParams () (res []string ) {
414
- for p := range u .q {
415
- res = append (res , p )
416
- }
417
- return
418
- }
419
-
420
- func (u * sinkURL ) String () string {
421
- if u .q != nil {
422
- // If we changed query params, re-encode them.
423
- u .URL .RawQuery = u .q .Encode ()
424
- u .q = nil
425
- }
426
- return u .URL .String ()
427
- }
428
-
429
365
// errorWrapperSink delegates to another sink and marks all returned errors as
430
366
// retryable. During changefeed setup, we use the sink once without this to
431
367
// verify configuration, but in the steady state, no sink error should be
@@ -616,9 +552,9 @@ func (n *nullSink) getConcreteType() sinkType {
616
552
617
553
var _ Sink = (* nullSink )(nil )
618
554
619
- func makeNullSink (u sinkURL , m metricsRecorder ) (Sink , error ) {
555
+ func makeNullSink (u * changefeedbase. SinkURL , m metricsRecorder ) (Sink , error ) {
620
556
var pacer * time.Ticker
621
- if delay := u .consumeParam (`delay` ); delay != "" {
557
+ if delay := u .ConsumeParam (`delay` ); delay != "" {
622
558
pace , err := time .ParseDuration (delay )
623
559
if err != nil {
624
560
return nil , err
0 commit comments