package com.github.davidmoten.rx.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.atomic.AtomicInteger;
import javax.sql.DataSource;
import com.github.davidmoten.rx.jdbc.exceptions.SQLRuntimeException;
public class DatabaseCreator {
private static AtomicInteger dbNumber = new AtomicInteger();
public static String nextUrl() {
return "jdbc:h2:mem:test" + dbNumber.incrementAndGet() + ";DB_CLOSE_DELAY=-1";
}
public static ConnectionProvider connectionProvider() {
return new ConnectionProviderFromUrl(nextUrl());
}
public static Database db() {
ConnectionProvider cp = connectionProvider();
Connection con = cp.get();
createDatabase(con);
try {
con.close();
} catch (SQLException e) {
throw new SQLRuntimeException(e);
}
return new Database(cp);
}
public static Database createDatabase(DataSource dataSource) {
return createDatabase(new ConnectionProviderFromDataSource(dataSource));
}
public static Database createDatabase(ConnectionProvider cp) {
Database db = Database.from(cp);
Connection con = cp.get();
createDatabase(con);
try {
con.close();
} catch (SQLException e) {
throw new SQLRuntimeException(e);
}
return db;
}
static Connection nextConnection() {
try {
Connection con = DriverManager.getConnection(DatabaseCreator.nextUrl());
DatabaseCreator.createDatabase(con);
return con;
} catch (SQLException e) {
throw new SQLRuntimeException(e);
}
}
public static void createDatabase(Connection c) {
try {
c.setAutoCommit(true);
c.prepareStatement(
"create table person (name varchar(50) primary key, score int not null,dob date, registered timestamp)")
.execute();
c.prepareStatement("insert into person(name,score) values('FRED',21)").execute();
c.prepareStatement("insert into person(name,score) values('JOSEPH',34)").execute();
c.prepareStatement("insert into person(name,score) values('MARMADUKE',25)").execute();
c.prepareStatement(
"create table person_clob (name varchar(50) not null, document clob)")
.execute();
c.prepareStatement(
"create table person_blob (name varchar(50) not null, document blob)")
.execute();
c.prepareStatement(
"create table address (address_id int primary key, full_address varchar(255) not null)")
.execute();
c.prepareStatement(
"insert into address(address_id, full_address) values(1,'57 Something St, El Barrio, Big Place')")
.execute();
c.prepareStatement(
"create table note(id bigint auto_increment primary key, text varchar(255))")
.execute();
} catch (SQLException e) {
throw new SQLRuntimeException(e);
}
}
}