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
29 try (final Connection connection = connectionProvider.connection()) {
30 connection.setAutoCommit(false);
31 connection.setReadOnly(readOnly);
32
33
34 return callback.execute(connection);
35 } catch (SQLException e) {
36
37
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 }