001package io.ebean.docker.commands;
002
003import java.sql.Connection;
004import java.sql.SQLException;
005
006public abstract class JdbcBaseDbContainer extends DbContainer {
007
008  JdbcBaseDbContainer(DbConfig config) {
009    super(config);
010    this.checkConnectivityUsingAdmin = true;
011  }
012
013  abstract void createDatabase();
014
015  abstract void dropCreateDatabase();
016
017  @Override
018  public boolean startWithCreate() {
019    if (!startContainerWithWait()) {
020      return false;
021    }
022    createDatabase();
023    return true;
024  }
025
026  @Override
027  public boolean startWithDropCreate() {
028    if (!startContainerWithWait()) {
029      return false;
030    }
031    dropCreateDatabase();
032    return true;
033  }
034
035  private boolean startContainerWithWait() {
036    if (checkAlreadyRunning()) {
037      dbConfig.clearStopMode();
038      return true;
039    }
040    startIfNeeded();
041    if (!waitForConnectivity()) {
042      log.warn("Failed waiting for connectivity");
043      return false;
044    }
045    return true;
046  }
047
048  protected boolean checkAlreadyRunning() {
049    try (Connection connection = dbConfig.createAdminConnection()) {
050      return true;
051    } catch (Throwable e) {
052      // no connectivity
053      return false;
054    }
055  }
056
057  @Override
058  public boolean waitForDatabaseReady() {
059    // Just rely on waitForConnectivity() instead
060    return true;
061  }
062
063  @Override
064  protected boolean isDatabaseReady() {
065    // Just rely on waitForConnectivity() instead
066    return true;
067  }
068
069  @Override
070  protected boolean isDatabaseAdminReady() {
071    // Just rely on waitForConnectivity() instead
072    return true;
073  }
074}