package org.sonar.server.db;
import org.sonar.api.ServerComponent;
+import org.sonar.core.persistence.Database;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.core.qualityprofile.db.QualityProfileDao;
*/
public class DbClient implements ServerComponent {
+ private final Database db;
private final MyBatis myBatis;
private final RuleDao ruleDao;
private final ActiveRuleDao activeRuleDao;
private final QualityProfileDao qProfileDao;
- public DbClient(MyBatis myBatis, RuleDao ruleDao, ActiveRuleDao activeRuleDao,
+ public DbClient(Database db, MyBatis myBatis, RuleDao ruleDao, ActiveRuleDao activeRuleDao,
QualityProfileDao qProfileDao) {
+ this.db = db;
this.myBatis = myBatis;
this.ruleDao = ruleDao;
this.activeRuleDao = activeRuleDao;
this.qProfileDao = qProfileDao;
}
+ public Database database() {
+ return db;
+ }
+
public DbSession openSession(boolean batch) {
return myBatis.openSession(batch);
}
import org.slf4j.LoggerFactory;
import org.sonar.api.ServerComponent;
import org.sonar.api.platform.ServerUpgradeStatus;
-import org.sonar.core.persistence.Database;
import org.sonar.core.persistence.DdlUtils;
-import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.db.DbClient;
import org.sonar.server.plugins.ServerPluginRepository;
import java.sql.Connection;
*/
public class DatabaseMigrator implements ServerComponent, Startable {
- private final MyBatis myBatis;
- private final Database database;
+ private final DbClient dbClient;
private final DatabaseMigration[] migrations;
private final ServerUpgradeStatus serverUpgradeStatus;
/**
* ServerPluginRepository is used to ensure H2 schema creation is done only after copy of bundle plugins have been done
*/
- public DatabaseMigrator(MyBatis myBatis, Database database, DatabaseMigration[] migrations, ServerUpgradeStatus serverUpgradeStatus,
+ public DatabaseMigrator(DbClient dbClient, DatabaseMigration[] migrations, ServerUpgradeStatus serverUpgradeStatus,
ServerPluginRepository serverPluginRepository) {
- this.myBatis = myBatis;
- this.database = database;
+ this.dbClient = dbClient;
this.migrations = migrations;
this.serverUpgradeStatus = serverUpgradeStatus;
}
@Override
- public void start(){
+ public void start() {
createDatabase();
}
@Override
- public void stop(){
+ public void stop() {
// Nothing to do
}
*/
@VisibleForTesting
boolean createDatabase() {
- if (DdlUtils.supportsDialect(database.getDialect().getId()) && serverUpgradeStatus.isFreshInstall()) {
+ if (DdlUtils.supportsDialect(dbClient.database().getDialect().getId()) && serverUpgradeStatus.isFreshInstall()) {
LoggerFactory.getLogger(getClass()).info("Create database");
- SqlSession session = null;
+ SqlSession session = dbClient.openSession(false);
Connection connection = null;
try {
- session = myBatis.openSession(false);
connection = session.getConnection();
- createSchema(connection, database.getDialect().getId());
+ createSchema(connection, dbClient.database().getDialect().getId());
return true;
} finally {
- MyBatis.closeQuietly(session);
+ session.close();
// The connection is probably already closed by session.close()
// but it's not documented in mybatis javadoc.
ActiveRuleDao activeRuleDao = mock(ActiveRuleDao.class);
QualityProfileDao qualityProfileDao = mock(QualityProfileDao.class);
- DbClient client = new DbClient(myBatis, ruleDao, activeRuleDao, qualityProfileDao);
+ DbClient client = new DbClient(db.database(), myBatis, ruleDao, activeRuleDao, qualityProfileDao);
+ assertThat(client.database()).isSameAs(db.database());
DbSession dbSession = client.openSession(true);
assertThat(dbSession).isNotNull();
assertThat(dbSession.getConnection().isClosed()).isFalse();
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.mockito.Mockito;
import org.sonar.api.platform.ServerUpgradeStatus;
import org.sonar.core.persistence.AbstractDaoTestCase;
-import org.sonar.core.persistence.Database;
import org.sonar.core.persistence.DbSession;
-import org.sonar.core.persistence.MyBatis;
import org.sonar.core.persistence.dialect.Dialect;
import org.sonar.core.persistence.dialect.H2;
import org.sonar.core.persistence.dialect.MySql;
+import org.sonar.server.db.DbClient;
import java.sql.Connection;
import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class DatabaseMigratorTest extends AbstractDaoTestCase {
@Rule
public ExpectedException thrown = ExpectedException.none();
- MyBatis mybatis = mock(MyBatis.class);
- Database database = mock(Database.class);
+ DbClient dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
DatabaseMigration[] migrations = new DatabaseMigration[]{new FakeMigration()};
ServerUpgradeStatus serverUpgradeStatus = mock(ServerUpgradeStatus.class);
-
DatabaseMigrator migrator;
@Before
public void setUp() throws Exception {
- migrator = new DatabaseMigrator(mybatis, database, migrations, serverUpgradeStatus, null);
+ migrator = new DatabaseMigrator(dbClient, migrations, serverUpgradeStatus, null);
}
@Test
public void should_support_only_creation_of_h2_database() throws Exception {
- when(database.getDialect()).thenReturn(new MySql());
+ when(dbClient.database().getDialect()).thenReturn(new MySql());
assertThat(migrator.createDatabase()).isFalse();
- verifyZeroInteractions(mybatis);
+ verify(dbClient, never()).openSession(anyBoolean());
}
@Test
@Test
public void should_create_schema_on_h2() throws Exception {
Dialect supportedDialect = new H2();
- when(database.getDialect()).thenReturn(supportedDialect);
+ when(dbClient.database().getDialect()).thenReturn(supportedDialect);
Connection connection = mock(Connection.class);
DbSession session = mock(DbSession.class);
when(session.getConnection()).thenReturn(connection);
- when(mybatis.openSession(false)).thenReturn(session);
+ when(dbClient.openSession(false)).thenReturn(session);
when(serverUpgradeStatus.isFreshInstall()).thenReturn(true);
- DatabaseMigrator databaseMigrator = new DatabaseMigrator(mybatis, database, migrations, serverUpgradeStatus, null) {
+ DatabaseMigrator databaseMigrator = new DatabaseMigrator(dbClient, migrations, serverUpgradeStatus, null) {
@Override
protected void createSchema(Connection connection, String dialectId) {
}
public static class FakeMigration implements DatabaseMigration {
static boolean executed = false;
+
@Override
public void execute() {
executed = true;