2222import io .asyncer .r2dbc .mysql .extension .Extension ;
2323import io .asyncer .r2dbc .mysql .internal .util .InternalArrays ;
2424import io .netty .handler .ssl .SslContextBuilder ;
25+ import io .netty .resolver .AddressResolverGroup ;
2526import org .jetbrains .annotations .Nullable ;
2627import org .reactivestreams .Publisher ;
2728import reactor .netty .resources .LoopResources ;
@@ -127,6 +128,9 @@ public final class MySqlConnectionConfiguration {
127128 @ Nullable
128129 private final Publisher <String > passwordPublisher ;
129130
131+ @ Nullable
132+ private final AddressResolverGroup <?> resolver ;
133+
130134 private MySqlConnectionConfiguration (
131135 boolean isHost , String domain , int port , MySqlSslConfiguration ssl ,
132136 boolean tcpKeepAlive , boolean tcpNoDelay , @ Nullable Duration connectTimeout ,
@@ -141,7 +145,8 @@ private MySqlConnectionConfiguration(
141145 int queryCacheSize , int prepareCacheSize ,
142146 Set <CompressionAlgorithm > compressionAlgorithms , int zstdCompressionLevel ,
143147 @ Nullable LoopResources loopResources ,
144- Extensions extensions , @ Nullable Publisher <String > passwordPublisher
148+ Extensions extensions , @ Nullable Publisher <String > passwordPublisher ,
149+ @ Nullable AddressResolverGroup <?> resolver
145150 ) {
146151 this .isHost = isHost ;
147152 this .domain = domain ;
@@ -171,6 +176,7 @@ private MySqlConnectionConfiguration(
171176 this .loopResources = loopResources == null ? TcpResources .get () : loopResources ;
172177 this .extensions = extensions ;
173178 this .passwordPublisher = passwordPublisher ;
179+ this .resolver = resolver ;
174180 }
175181
176182 /**
@@ -301,6 +307,11 @@ Publisher<String> getPasswordPublisher() {
301307 return passwordPublisher ;
302308 }
303309
310+ @ Nullable
311+ AddressResolverGroup <?> getResolver () {
312+ return resolver ;
313+ }
314+
304315 @ Override
305316 public boolean equals (Object o ) {
306317 if (this == o ) {
@@ -337,7 +348,8 @@ public boolean equals(Object o) {
337348 zstdCompressionLevel == that .zstdCompressionLevel &&
338349 Objects .equals (loopResources , that .loopResources ) &&
339350 extensions .equals (that .extensions ) &&
340- Objects .equals (passwordPublisher , that .passwordPublisher );
351+ Objects .equals (passwordPublisher , that .passwordPublisher ) &&
352+ Objects .equals (resolver , that .resolver );
341353 }
342354
343355 @ Override
@@ -352,52 +364,41 @@ public int hashCode() {
352364 loadLocalInfilePath , localInfileBufferSize ,
353365 queryCacheSize , prepareCacheSize ,
354366 compressionAlgorithms , zstdCompressionLevel ,
355- loopResources , extensions , passwordPublisher );
367+ loopResources , extensions , passwordPublisher , resolver );
356368 }
357369
358370 @ Override
359371 public String toString () {
360- if (isHost ) {
361- return "MySqlConnectionConfiguration{host='" + domain + "', port=" + port + ", ssl=" + ssl +
362- ", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive +
363- ", connectTimeout=" + connectTimeout +
372+ return "MySqlConnectionConfiguration{" +
373+ (isHost ? "host='" + domain + "', port=" + port + ", ssl=" + ssl +
374+ ", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive :
375+ "unixSocket='" + domain + "'" ) +
376+ buildCommonToStringPart () +
377+ '}' ;
378+ }
379+
380+ private String buildCommonToStringPart () {
381+ return ", connectTimeout=" + connectTimeout +
364382 ", preserveInstants=" + preserveInstants +
365383 ", connectionTimeZone=" + connectionTimeZone +
366384 ", forceConnectionTimeZoneToSession=" + forceConnectionTimeZoneToSession +
367- ", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
385+ ", zeroDateOption=" + zeroDateOption +
386+ ", user='" + user + "', password=" + password +
368387 ", database='" + database + "', createDatabaseIfNotExist=" + createDatabaseIfNotExist +
369388 ", preferPrepareStatement=" + preferPrepareStatement +
370389 ", sessionVariables=" + sessionVariables +
371390 ", lockWaitTimeout=" + lockWaitTimeout +
372391 ", statementTimeout=" + statementTimeout +
373392 ", loadLocalInfilePath=" + loadLocalInfilePath +
374393 ", localInfileBufferSize=" + localInfileBufferSize +
375- ", queryCacheSize=" + queryCacheSize + ", prepareCacheSize=" + prepareCacheSize +
394+ ", queryCacheSize=" + queryCacheSize +
395+ ", prepareCacheSize=" + prepareCacheSize +
376396 ", compressionAlgorithms=" + compressionAlgorithms +
377397 ", zstdCompressionLevel=" + zstdCompressionLevel +
378398 ", loopResources=" + loopResources +
379- ", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}' ;
380- }
381-
382- return "MySqlConnectionConfiguration{unixSocket='" + domain +
383- "', connectTimeout=" + connectTimeout +
384- ", preserveInstants=" + preserveInstants +
385- ", connectionTimeZone=" + connectionTimeZone +
386- ", forceConnectionTimeZoneToSession=" + forceConnectionTimeZoneToSession +
387- ", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
388- ", database='" + database + "', createDatabaseIfNotExist=" + createDatabaseIfNotExist +
389- ", preferPrepareStatement=" + preferPrepareStatement +
390- ", sessionVariables=" + sessionVariables +
391- ", lockWaitTimeout=" + lockWaitTimeout +
392- ", statementTimeout=" + statementTimeout +
393- ", loadLocalInfilePath=" + loadLocalInfilePath +
394- ", localInfileBufferSize=" + localInfileBufferSize +
395- ", queryCacheSize=" + queryCacheSize +
396- ", prepareCacheSize=" + prepareCacheSize +
397- ", compressionAlgorithms=" + compressionAlgorithms +
398- ", zstdCompressionLevel=" + zstdCompressionLevel +
399- ", loopResources=" + loopResources +
400- ", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}' ;
399+ ", extensions=" + extensions +
400+ ", passwordPublisher=" + passwordPublisher +
401+ ", resolver=" + resolver ;
401402 }
402403
403404 /**
@@ -494,6 +495,9 @@ public static final class Builder {
494495 @ Nullable
495496 private Publisher <String > passwordPublisher ;
496497
498+ @ Nullable
499+ private AddressResolverGroup <?> resolver ;
500+
497501 /**
498502 * Builds an immutable {@link MySqlConnectionConfiguration} with current options.
499503 *
@@ -528,7 +532,7 @@ public MySqlConnectionConfiguration build() {
528532 loadLocalInfilePath ,
529533 localInfileBufferSize , queryCacheSize , prepareCacheSize ,
530534 compressionAlgorithms , zstdCompressionLevel , loopResources ,
531- Extensions .from (extensions , autodetectExtensions ), passwordPublisher );
535+ Extensions .from (extensions , autodetectExtensions ), passwordPublisher , resolver );
532536 }
533537
534538 /**
@@ -1156,6 +1160,21 @@ public Builder passwordPublisher(Publisher<String> passwordPublisher) {
11561160 return this ;
11571161 }
11581162
1163+ /**
1164+ * Sets the {@link AddressResolverGroup} for resolving host addresses.
1165+ * <p>
1166+ * This can be used to customize the DNS resolution mechanism, which is particularly useful in environments
1167+ * with specific DNS configuration needs or where a custom DNS resolver is required.
1168+ *
1169+ * @param resolver the resolver group to use for host address resolution.
1170+ * @return this {@link Builder}.
1171+ * @since 1.2.0
1172+ */
1173+ public Builder resolver (AddressResolverGroup <?> resolver ) {
1174+ this .resolver = resolver ;
1175+ return this ;
1176+ }
1177+
11591178 private SslMode requireSslMode () {
11601179 SslMode sslMode = this .sslMode ;
11611180
0 commit comments