public void connectToSpanner()

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);
  }