View Javadoc
1   package com.atlassian.refapp.sal.rdbms;
2   
3   import com.atlassian.fugue.Option;
4   import com.atlassian.refapp.api.ConnectionProvider;
5   import com.atlassian.sal.api.rdbms.ConnectionCallback;
6   import com.atlassian.sal.api.rdbms.RdbmsException;
7   import com.atlassian.sal.spi.HostConnectionAccessor;
8   
9   import javax.annotation.Nonnull;
10  import javax.inject.Inject;
11  import javax.inject.Named;
12  import java.sql.Connection;
13  import java.sql.SQLException;
14  
15  @SuppressWarnings("unused")
16  @Named("refImplHostConnectionAccessor")
17  public class RefImplHostConnectionAccessor implements HostConnectionAccessor {
18  
19      private final ConnectionProvider connectionProvider;
20  
21      @Inject
22      public RefImplHostConnectionAccessor(ConnectionProvider connectionProvider) {
23          this.connectionProvider = connectionProvider;
24      }
25  
26      @Override
27      public <A> A execute(boolean readOnly, boolean newTransaction, @Nonnull ConnectionCallback<A> callback) {
28          // retrieve and sanitise the connection
29          try (final Connection connection = connectionProvider.connection()) {
30              connection.setAutoCommit(false);
31              connection.setReadOnly(readOnly);
32  
33              // we can't support execution in existing or new transaction context, because refapp doesn't have one
34              return callback.execute(connection);
35          } catch (SQLException e) {
36  
37              // not much we can do here but throw, so that a rollback occurs
38              throw new RdbmsException("refapp unable to execute against database connection", e);
39          }
40      }
41  
42      @Nonnull
43      @Override
44      public Option<String> getSchemaName() {
45          return Option.option(connectionProvider.schema().orElse(null));
46      }
47  }