@@ -119,11 +119,11 @@ type ListenerConn struct {
119
119
120
120
// NewListenerConn creates a new ListenerConn. Use NewListener instead.
121
121
func NewListenerConn (name string , notificationChan chan <- * Notification ) (* ListenerConn , error ) {
122
- return newDialListenerConn (defaultDialer {}, name , notificationChan )
122
+ return newDialListenerConn (defaultDialer {}, nil , name , notificationChan )
123
123
}
124
124
125
- func newDialListenerConn (d Dialer , name string , c chan <- * Notification ) (* ListenerConn , error ) {
126
- cn , err := DialOpen ( d , name )
125
+ func newDialListenerConn (d Dialer , connector driver. Connector , name string , c chan <- * Notification ) (* ListenerConn , error ) {
126
+ cn , err := getConn ( connector , d , name )
127
127
if err != nil {
128
128
return nil , err
129
129
}
@@ -140,6 +140,15 @@ func newDialListenerConn(d Dialer, name string, c chan<- *Notification) (*Listen
140
140
return l , nil
141
141
}
142
142
143
+ // getConn uses driver.Connector if provided and falls back to Dialer otherwise.
144
+ func getConn (c driver.Connector , d Dialer , name string ) (driver.Conn , error ) {
145
+ if c != nil {
146
+ return c .Connect (context .Background ())
147
+ }
148
+
149
+ return DialOpen (d , name )
150
+ }
151
+
143
152
// We can only allow one goroutine at a time to be running a query on the
144
153
// connection for various reasons, so the goroutine sending on the connection
145
154
// must be holding senderLock.
@@ -470,6 +479,7 @@ type Listener struct {
470
479
maxReconnectInterval time.Duration
471
480
dialer Dialer
472
481
eventCallback EventCallbackType
482
+ connector driver.Connector
473
483
474
484
lock sync.Mutex
475
485
isClosed bool
@@ -502,19 +512,37 @@ func NewListener(name string,
502
512
return NewDialListener (defaultDialer {}, name , minReconnectInterval , maxReconnectInterval , eventCallback )
503
513
}
504
514
515
+ // NewConnectorListener is like NewListener but it takes a driver.Connector.
516
+ func NewConnectorListener (c driver.Connector ,
517
+ name string ,
518
+ minReconnectInterval time.Duration ,
519
+ maxReconnectInterval time.Duration ,
520
+ eventCallback EventCallbackType ) * Listener {
521
+ return listener (c , defaultDialer {}, name , minReconnectInterval , maxReconnectInterval , eventCallback )
522
+ }
523
+
505
524
// NewDialListener is like NewListener but it takes a Dialer.
506
525
func NewDialListener (d Dialer ,
507
526
name string ,
508
527
minReconnectInterval time.Duration ,
509
528
maxReconnectInterval time.Duration ,
510
529
eventCallback EventCallbackType ) * Listener {
530
+ return listener (nil , d , name , minReconnectInterval , maxReconnectInterval , eventCallback )
531
+ }
511
532
533
+ func listener (c driver.Connector ,
534
+ d Dialer ,
535
+ name string ,
536
+ minReconnectInterval time.Duration ,
537
+ maxReconnectInterval time.Duration ,
538
+ eventCallback EventCallbackType ) * Listener {
512
539
l := & Listener {
513
540
name : name ,
514
541
minReconnectInterval : minReconnectInterval ,
515
542
maxReconnectInterval : maxReconnectInterval ,
516
543
dialer : d ,
517
544
eventCallback : eventCallback ,
545
+ connector : c ,
518
546
519
547
channels : make (map [string ]struct {}),
520
548
@@ -749,7 +777,7 @@ func (l *Listener) closed() bool {
749
777
750
778
func (l * Listener ) connect () error {
751
779
notificationChan := make (chan * Notification , 32 )
752
- cn , err := newDialListenerConn (l .dialer , l .name , notificationChan )
780
+ cn , err := newDialListenerConn (l .dialer , l .connector , l . name , notificationChan )
753
781
if err != nil {
754
782
return err
755
783
}
0 commit comments