import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

/**
 * Start a mariadb instance at port localhost:3306, e.g.
 * 
 * <p>{@code
 * docker run --name mariadb-test --rm --env MYSQL_ROOT_PASSWORD=root -p 3306:3306 mariadb:10
 * }
 * 
 * <p>The run with
 * <p><pre>
 * java --class-path=mariadb-java-client-2.7.5.jar TestCase.java
 * java --class-path=mariadb-java-client-3.0.3.jar TestCase.java
 * java --class-path=mariadb-java-client-3.0.4-SNAPSHOT.jar TestCase.java
 * </pre>
 * 
 * <p><strong>WARNING</strong> Will drop and recreate database "testdb"!
 */
public class TestCase {
    private static final String HOST = "localhost";
    private static final String PORT = "3306";
    private static final String USER = "root";
    private static final String PASSWORD = "root";
    private static final String DATABASE = "testdb";

    public static void main(String[] args) throws Exception {
        try (Connection con = setupDatabase()) {
            try (ResultSet rs = con.getMetaData().getColumns("testdb", "testdb", "person", "name")) {
                rs.next();
                Object o = rs.getObject("TYPE_NAME");
                System.out.println("Metadata: " + o.getClass());
            }
            try (Statement s = con.createStatement()) {
                try (ResultSet rs = s.executeQuery("SELECT * FROM person")) {
                    rs.next();
                    Object o = rs.getObject("name");
                    System.out.println("VARCHAR col: " + o.getClass());
                }
            }
        }
    }

    private static Connection setupDatabase() throws Exception {
        Connection con = null;
        Properties props = new Properties();
        props.setProperty("user", USER);
        props.setProperty("password", PASSWORD);
        con = new org.mariadb.jdbc.Driver().connect("jdbc:mariadb://" + HOST + ":" + PORT + "?useSSL=false&allowPublicKeyRetrieval=true", props);
        try (Statement s = con.createStatement()) {
            s.execute("DROP DATABASE IF EXISTS `" + DATABASE + "`");
            s.execute("CREATE DATABASE `" + DATABASE + "`");
            s.execute("USE `" + DATABASE + "`");
            s.execute("CREATE TABLE person (name VARCHAR(255) NOT NULL, email VARCHAR(255) NULL, CONSTRAINT PK_PERSON PRIMARY KEY (name))");
            s.execute("INSERT INTO person VALUES ('jon doe', NULL)");
        }
        return con;
    }
}
