config = config.charset(getProperty(prefix, properties, "charset", Charset::forName)
.orElse(Charset.defaultCharset()));
config = config.password(getProperty(prefix, properties, "password"));
config = config.database(getProperty(prefix, properties, "database"));
config = config.poolMaxSize(getProperty(prefix, properties, "poolMaxSize", Integer::parseInt));
config = config.poolMaxWaiters(getProperty(prefix, properties, "poolMaxWaiters", Integer::parseInt));
config = config.poolValidationInterval(getProperty(prefix, properties, "poolValidationIntervalSeconds",
s -> Duration.ofSeconds(Long.parseLong(s))));
config = config.connectionTimeout(getProperty(prefix, properties, "connectionTimeoutSeconds",
s -> Duration.ofSeconds(Long.parseLong(s))));
config = config.queryTimeout(getProperty(prefix, properties, "queryTimeoutSeconds",
s -> Duration.ofSeconds(Long.parseLong(s))));
config = config.encodingClasses(getProperty(prefix, properties, "encodingClasses")
.map(k -> Stream.of(k.split(",")).filter(s -> !s.isEmpty()).collect(Collectors.toSet())));
config = config.ssl(getProperty(prefix, properties, "ssl.mode", SSL.Mode::valueOf).map(sslMode -> {
final SSL ssl = SSL.create(sslMode);
return getProperty(prefix, properties, "ssl.rootCert").map(rootCert -> ssl.rootCert(new File(rootCert)))
.orElse(ssl);
}));
config = config.embedded(getProperty(prefix, properties, "embedded.supplierClass")
.map(cls -> Embedded.create(cls, getProperty(prefix, properties, "embedded.version"))));