001package io.ebean.docker.commands;
002
003import java.sql.Connection;
004import java.sql.SQLException;
005import java.util.ArrayList;
006import java.util.List;
007import java.util.Properties;
008
009public class ClickHouseContainer extends JdbcBaseDbContainer {
010
011  public static ClickHouseContainer create(String version, Properties properties) {
012    return new ClickHouseContainer(new ClickHouseConfig(version, properties));
013  }
014
015  ClickHouseContainer(ClickHouseConfig config) {
016    super(config);
017  }
018
019  @Override
020  void createDatabase() {
021    createRoleAndDatabase(false);
022  }
023
024  @Override
025  void dropCreateDatabase() {
026    createRoleAndDatabase(true);
027  }
028
029  private void createRoleAndDatabase(boolean withDrop) {
030    try (Connection connection = config.createAdminConnection()) {
031      if (withDrop) {
032        dropDatabase(connection);
033      }
034      createDatabase(connection);
035
036    } catch (SQLException e) {
037      throw new RuntimeException("Error when creating database and role", e);
038    }
039  }
040
041  private void dropDatabase(Connection connection) {
042    sqlRun(connection, "drop database if exists " + dbConfig.getDbName());
043  }
044
045  private void createDatabase(Connection connection) {
046    sqlRun(connection, "create database if not exists " + dbConfig.getDbName());
047  }
048
049  @Override
050  protected ProcessBuilder runProcess() {
051
052    //$ docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 yandex/clickhouse-server
053
054    List<String> args = new ArrayList<>();
055    args.add(config.docker);
056    args.add("run");
057    args.add("-d");
058    args.add("--name");
059    args.add(config.containerName());
060    args.add("--ulimit");
061    args.add("nofile=262144:262144");
062
063    args.add("-p");
064    args.add(config.getPort() + ":" + config.getInternalPort());
065    //8123 port for HTTP interface and 9000 port for native client.
066
067    args.add(config.getImage());
068    ProcessBuilder pb = createProcessBuilder(args);
069    pb.redirectErrorStream(true);
070    return pb;
071  }
072
073}