All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.test4j.module.database.proxy.EmbeddedMysqlConfig Maven / Gradle / Ivy

There is a newer version: 1.1.2
Show newest version
package org.test4j.module.database.proxy;

import com.wix.mysql.EmbeddedMysql;
import com.wix.mysql.config.AdditionalConfig;
import com.wix.mysql.config.MysqldConfig;
import com.wix.mysql.config.SchemaConfig;
import com.wix.mysql.distribution.Version;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

import static com.wix.mysql.config.Charset.UTF8;
import static com.wix.mysql.config.DownloadConfig.aDownloadConfig;
import static com.wix.mysql.config.MysqldConfig.aMysqldConfig;
import static com.wix.mysql.config.ProxyFactory.aHttpProxy;
import static org.test4j.module.database.config.DbConfig.instance;

/**
 * EmbeddedMysqlCreator: 启动/停止 EmbeddedMysql
 *
 * @author darui.wu
 */
@SuppressWarnings({"unused"})
public class EmbeddedMysqlConfig {
    private static final Map started = new ConcurrentHashMap<>();

    public final Version version;

    public final int port;

    public final String schema;

    public final String userName = "test";

    public final String password = "password";

    public EmbeddedMysqlConfig() {
        this(instance().embeddedMysqlVersion(), instance().embeddedMysqlPort(), "ut");
    }

    public EmbeddedMysqlConfig(Version version, int port, String schema) {
        this.version = version;
        this.port = port;
        this.schema = schema;
    }

    public EmbeddedMysqlConfig start() {
        start(this);
        return this;
    }

    private static synchronized void start(EmbeddedMysqlConfig creator) {
        if (started.containsKey(creator.schema)) {
            return;
        }
        // mysql版本
        MysqldConfig config = getMysqlConfig(creator);
        SchemaConfig schemaConfig = SchemaConfig.aSchemaConfig(creator.schema).build();
        AdditionalConfig[] configs = getDownloadConfig();
        EmbeddedMysql mysql = EmbeddedMysql.anEmbeddedMysql(config, configs).addSchema(schemaConfig).start();
        started.put(creator.schema, mysql);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> stop(creator.schema)));
    }

    private static AdditionalConfig[] getDownloadConfig() {
        String host = instance().embeddedMysqlRemoteHost();
        if (host.trim().isEmpty()) {
            return new AdditionalConfig[0];
        } else {
            int port = instance().embeddedMysqlRemotePort();
            AdditionalConfig config = aDownloadConfig().withProxy(aHttpProxy(host, port)).build();
            return new AdditionalConfig[]{config};
        }
    }

    private static MysqldConfig getMysqlConfig(EmbeddedMysqlConfig creator) {
        return aMysqldConfig(creator.version)
            .withCharset(UTF8)
            .withPort(creator.port)
            .withUser(creator.userName, creator.password)
            .withTimeZone("Asia/Shanghai")
            .withTimeout(2, TimeUnit.MINUTES)
            .withServerVariable("max_connect_errors", 100)
            .build();
    }

    public static void stop() {
        Iterator> it = started.entrySet().iterator();
        while (it.hasNext()) {
            it.next().getValue().stop();
            it.remove();
        }
    }

    public static void stop(String schema) {
        if (started.containsKey(schema)) {
            started.get(schema).stop();
            started.remove(schema);
        }
    }

    public String url() {
        return String.format("jdbc:mysql://localhost:%d/%s" +
                "?characterEncoding=UTF-8" +
                "&zeroDateTimeBehavior=convertToNull" +
                "&allowMultiQueries=true",
            this.port, this.schema);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy