in src/main/java/com/google/cloud/spanner/pgadapter/ConnectionHandler.java [203:278]
public void connectToSpanner(String database, @Nullable Credentials credentials) {
OptionsMetadata options = getServer().getOptions();
String uri = buildConnectionURL(database, options, getServer().getProperties());
ConnectionOptions.Builder connectionOptionsBuilder = ConnectionOptions.newBuilder().setUri(uri);
connectionOptionsBuilder =
PGAdapterConnectionOptionsHelper.maybeAddGrpcLogInterceptor(
connectionOptionsBuilder, options.isLogGrpcMessages());
connectionOptionsBuilder =
PGAdapterConnectionOptionsHelper.useDirectExecutor(connectionOptionsBuilder);
if (credentials != null) {
connectionOptionsBuilder =
PGAdapterConnectionOptionsHelper.setCredentials(connectionOptionsBuilder, credentials);
} else if (options.getCredentials() != null) {
connectionOptionsBuilder =
PGAdapterConnectionOptionsHelper.setCredentials(
connectionOptionsBuilder, options.getCredentials());
}
SessionPoolOptions sessionPoolOptions =
options.getSessionPoolOptions() == null
? PGAdapterSessionPoolOptionsHelper.useMultiplexedSessions(
SessionPoolOptions.newBuilder())
.build()
: PGAdapterSessionPoolOptionsHelper.useMultiplexedSessions(
options.getSessionPoolOptions().toBuilder())
.build();
connectionOptionsBuilder.setSessionPoolOptions(sessionPoolOptions);
if (options.isEnableOpenTelemetryMetrics()) {
SpannerOptions.enableOpenTelemetryMetrics();
connectionOptionsBuilder =
connectionOptionsBuilder.setOpenTelemetry(server.getOpenTelemetry());
}
ConnectionOptions connectionOptions = connectionOptionsBuilder.build();
Connection spannerConnection = connectionOptions.getConnection();
try {
// Note: Calling getDialect() will cause a SpannerException if the connection itself is
// invalid, for example as a result of the credentials being wrong.
if (spannerConnection.getDialect() != Dialect.POSTGRESQL) {
spannerConnection.close();
throw PGException.newBuilder(
String.format(
"The database uses dialect %s. Currently PGAdapter only supports connections to PostgreSQL dialect databases. "
+ "These can be created using https://cloud.google.com/spanner/docs/quickstart-console#postgresql",
spannerConnection.getDialect()))
.setSeverity(Severity.FATAL)
.setSQLState(SQLState.SQLServerRejectedEstablishmentOfSQLConnection)
.build();
}
} catch (InstanceNotFoundException | DatabaseNotFoundException notFoundException) {
SpannerException exceptionToThrow = notFoundException;
//noinspection finally
try {
// Include more information about the available databases if someone tried to connect using
// psql.
if (getWellKnownClient() == WellKnownClient.PSQL) {
Spanner spanner = spannerConnection.getSpanner();
String availableDatabases =
listDatabasesOrInstances(
notFoundException, getServer().getOptions().getDatabaseName(database), spanner);
exceptionToThrow =
SpannerExceptionFactory.newSpannerException(
notFoundException.getErrorCode(),
notFoundException.getMessage() + "\n" + availableDatabases);
}
} finally {
spannerConnection.close();
throw exceptionToThrow;
}
} catch (SpannerException e) {
spannerConnection.close();
throw e;
}
spannerConnection.setSavepointSupport(SavepointSupport.ENABLED);
this.spannerConnection = spannerConnection;
this.databaseId = connectionOptions.getDatabaseId();
this.extendedQueryProtocolHandler = new ExtendedQueryProtocolHandler(this);
}