Prepared DbManager for HSQLDB as alternative to mysql

master
Markus Kreth 8 years ago
parent 6e09caf428
commit 5e08a7e13a
  1. 13
      src/main/java/de/kreth/dbmanager/DatabaseType.java
  2. 52
      src/main/java/de/kreth/dbmanager/DbManager.java
  3. 18
      src/main/java/de/kreth/dbmanager/TableDefinition.java
  4. 19
      src/test/java/de/kreth/dbmanager/DbManagerAddColumnTest.java
  5. 68
      src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java

@ -0,0 +1,13 @@
package de.kreth.dbmanager;
public enum DatabaseType {
MYSQL("primary key AUTO_INCREMENT"), HSQLDB("IDENTITY");
public final String autoIncrementIdType;
private DatabaseType(String autoIncrementIdType) {
this.autoIncrementIdType = autoIncrementIdType;
}
}

@ -20,7 +20,8 @@ public class DbManager {
private int newVersion; private int newVersion;
private List<Version> versions; private List<Version> versions;
public DbManager(Collection<TableDefinition> tables, List<Version> versions, Database db, int newVersion) { public DbManager(Collection<TableDefinition> tables, List<Version> versions,
Database db, int newVersion) {
tableDefinitions = new HashMap<String, TableDefinition>(); tableDefinitions = new HashMap<String, TableDefinition>();
this.db = db; this.db = db;
this.newVersion = newVersion; this.newVersion = newVersion;
@ -107,9 +108,11 @@ public class DbManager {
} }
} }
public static String createUniqueConstraint(TableDefinition def, UniqueConstraint constraint) { public static String createUniqueConstraint(TableDefinition def,
UniqueConstraint constraint) {
StringBuilder sql = new StringBuilder("ALTER TABLE "); StringBuilder sql = new StringBuilder("ALTER TABLE ");
sql.append(def.getTableName()).append(" ADD CONSTRAINT UNIQUE_").append(String.join("_", constraint.getNames())) sql.append(def.getTableName()).append(" ADD CONSTRAINT UNIQUE_")
.append(String.join("_", constraint.getNames()))
.append(" UNIQUE ("); .append(" UNIQUE (");
sql.append(String.join(", ", constraint.getNames())).append(")"); sql.append(String.join(", ", constraint.getNames())).append(")");
return sql.toString(); return sql.toString();
@ -133,52 +136,50 @@ public class DbManager {
appendType(sql, col); appendType(sql, col);
if (col.getColumnParameters() != null && !col.getColumnParameters().isEmpty()) { if (col.getColumnParameters() != null
&& !col.getColumnParameters().isEmpty()) {
sql.append(" ").append(col.getColumnParameters()); sql.append(" ").append(col.getColumnParameters());
} }
} }
for (UniqueConstraint uni : def.getUnique()) {
sql.append(",\n\tCONSTRAINT UNIQUE (");
sql.append(String.join(",", uni.getNames()));
sql.append(")");
}
sql.append("\n"); sql.append("\n");
sql.append(")"); sql.append(")");
return sql.toString(); return sql.toString();
} }
private static void appendType(StringBuilder sql, ColumnDefinition col) { private static void appendType(StringBuilder sql, ColumnDefinition col) {
switch (col.getType()) { switch (col.getType()) {
case BLOB: case BLOB :
throw new IllegalArgumentException("Column Type " + col.getType() + " not supported"); throw new IllegalArgumentException(
case BOOLEAN: "Column Type " + col.getType() + " not supported");
case BOOLEAN :
sql.append(col.getType().name()); sql.append(col.getType().name());
break; break;
case DATETIME: case DATETIME :
sql.append("DATETIME"); sql.append("DATETIME");
break; break;
case INTEGER: case INTEGER :
sql.append(col.getType().name()); sql.append(col.getType().name());
break; break;
case REAL: case REAL :
sql.append("DOUBLE"); sql.append("DOUBLE");
break; break;
case VARCHAR100: case VARCHAR100 :
sql.append("VARCHAR(100)"); sql.append("VARCHAR(100)");
break; break;
case VARCHAR25: case VARCHAR25 :
sql.append("VARCHAR(25)"); sql.append("VARCHAR(25)");
break; break;
case TEXT: case TEXT :
case VARCHAR255: case VARCHAR255 :
sql.append("VARCHAR(255)"); sql.append("VARCHAR(255)");
break; break;
} }
} }
public static String createSqlAddColumns(TableDefinition current, ColumnDefinition... columnsToAdd) { public static String createSqlAddColumns(TableDefinition current,
ColumnDefinition... columnsToAdd) {
assert (current != null); assert (current != null);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("ALTER TABLE ").append(current.getTableName()); sql.append("ALTER TABLE ").append(current.getTableName());
@ -191,10 +192,12 @@ public class DbManager {
} }
first = false; first = false;
sql.append("\n\tADD COLUMN ").append(col.getColumnName()).append(" "); sql.append("\n\tADD COLUMN ").append(col.getColumnName())
.append(" ");
appendType(sql, col); appendType(sql, col);
if (col.getColumnParameters() != null && !col.getColumnParameters().isEmpty()) { if (col.getColumnParameters() != null
&& !col.getColumnParameters().isEmpty()) {
sql.append(" ").append(col.getColumnParameters()); sql.append(" ").append(col.getColumnParameters());
} }
} }
@ -202,7 +205,8 @@ public class DbManager {
return sql.toString(); return sql.toString();
} }
public static String createSqlDropColumns(TableDefinition current, ColumnDefinition... columnsToDrop) { public static String createSqlDropColumns(TableDefinition current,
ColumnDefinition... columnsToDrop) {
assert (current != null); assert (current != null);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();

@ -1,7 +1,6 @@
package de.kreth.dbmanager; package de.kreth.dbmanager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -16,19 +15,19 @@ import java.util.stream.Collectors;
* *
*/ */
public class TableDefinition { public class TableDefinition {
public static final String COLUMN_ID_NAME = "_id"; public static final String COLUMN_ID_NAME = "id";
private final String tableName; private final String tableName;
private final Collection<ColumnDefinition> columns; private final Collection<ColumnDefinition> columns;
private Collection<UniqueConstraint> unique;
public TableDefinition(String tableName, List<ColumnDefinition> columns, UniqueConstraint... unique) { public TableDefinition(String tableName, DatabaseType type,
List<ColumnDefinition> columns) {
this.tableName = tableName; this.tableName = tableName;
ColumnDefinition id = new ColumnDefinition(DataType.INTEGER, COLUMN_ID_NAME, "primary key AUTO_INCREMENT"); ColumnDefinition id = new ColumnDefinition(DataType.INTEGER,
COLUMN_ID_NAME, type.autoIncrementIdType);
List<ColumnDefinition> def = new ArrayList<ColumnDefinition>(); List<ColumnDefinition> def = new ArrayList<ColumnDefinition>();
def.add(id); def.add(id);
def.addAll(columns); def.addAll(columns);
this.columns = Collections.unmodifiableCollection(def); this.columns = Collections.unmodifiableCollection(def);
this.unique = Collections.unmodifiableCollection(Arrays.asList(unique));
} }
public String getTableName() { public String getTableName() {
@ -39,12 +38,9 @@ public class TableDefinition {
return columns; return columns;
} }
public Collection<UniqueConstraint> getUnique() {
return unique;
}
@Override @Override
public String toString() { public String toString() {
return tableName + "[" + String.join(",", columns.stream().map(m -> m.toString()).collect(Collectors.toList())) + "]"; return tableName + "[" + String.join(",", columns.stream()
.map(m -> m.toString()).collect(Collectors.toList())) + "]";
} }
} }

@ -17,21 +17,28 @@ public class DbManagerAddColumnTest {
@Test @Test
public void testAddOneColumn() { public void testAddOneColumn() {
TableDefinition def = new TableDefinition("testtable", new ArrayList<ColumnDefinition>()); TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, new ArrayList<ColumnDefinition>());
String sql = DbManager.createSqlAddColumns(def, new ColumnDefinition(DataType.DATETIME, "deleted", " DEFAULT null")); String sql = DbManager.createSqlAddColumns(def, new ColumnDefinition(
assertEquals("ALTER TABLE testtable\n\tADD COLUMN deleted DATETIME DEFAULT null;", sql); DataType.DATETIME, "deleted", " DEFAULT null"));
assertEquals(
"ALTER TABLE testtable\n\tADD COLUMN deleted DATETIME DEFAULT null;",
sql);
} }
@Test @Test
public void testAddTwoColumns() { public void testAddTwoColumns() {
TableDefinition def = new TableDefinition("testtable", new ArrayList<ColumnDefinition>()); TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, new ArrayList<ColumnDefinition>());
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
columns.add(new ColumnDefinition(DataType.DATETIME, "deleted", " DEFAULT null")); columns.add(new ColumnDefinition(DataType.DATETIME, "deleted",
" DEFAULT null"));
columns.add(new ColumnDefinition(DataType.VARCHAR25, "theType")); columns.add(new ColumnDefinition(DataType.VARCHAR25, "theType"));
String sql = DbManager.createSqlAddColumns(def, columns.toArray(new ColumnDefinition[]{})); String sql = DbManager.createSqlAddColumns(def,
columns.toArray(new ColumnDefinition[]{}));
assertEquals( assertEquals(
"ALTER TABLE testtable\n\tADD COLUMN deleted DATETIME DEFAULT null,\n\tADD COLUMN theType VARCHAR(25);", "ALTER TABLE testtable\n\tADD COLUMN deleted DATETIME DEFAULT null,\n\tADD COLUMN theType VARCHAR(25);",
sql); sql);

@ -1,69 +1,93 @@
package de.kreth.dbmanager; package de.kreth.dbmanager;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class DbManagerCreateTablesTest { public class DbManagerCreateTablesTest {
@Test @Test
public void testCreateSqlStatement() { public void testCreateSqlStatement() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
TableDefinition def = new TableDefinition("testtable", columns); TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, columns);
String sql = DbManager.createSqlStatement(def); String sql = DbManager.createSqlStatement(def);
assertNotNull(sql); assertNotNull(sql);
assertEquals("CREATE TABLE testtable (\n" + " _id INTEGER primary key AUTO_INCREMENT\n" + ")", sql); assertEquals(
"CREATE TABLE testtable (\n"
+ " id INTEGER primary key AUTO_INCREMENT\n" + ")",
sql);
} }
@Test @Test
public void testCreateTable2Columns() { public void testCreateTable2Columns() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL")); columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
TableDefinition def = new TableDefinition("testtable", columns); TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, columns);
String sql = DbManager.createSqlStatement(def); String sql = DbManager.createSqlStatement(def);
assertNotNull(sql); assertNotNull(sql);
assertEquals("CREATE TABLE testtable (\n" assertEquals("CREATE TABLE testtable (\n"
+ " _id INTEGER primary key AUTO_INCREMENT,\n" + " id INTEGER primary key AUTO_INCREMENT,\n"
+ " name VARCHAR(100) NOT NULL,\n" + " name VARCHAR(100) NOT NULL,\n" + " theDate DATETIME\n"
+ " theDate DATETIME\n" + ")", + ")", sql);
sql); }
@Test
public void testCreateTable2ColumnsOnHsqlDb() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
TableDefinition def = new TableDefinition("testtable",
DatabaseType.HSQLDB, columns);
String sql = DbManager.createSqlStatement(def);
assertNotNull(sql);
assertEquals("CREATE TABLE testtable (\n" + " id INTEGER IDENTITY,\n"
+ " name VARCHAR(100) NOT NULL,\n" + " theDate DATETIME\n"
+ ")", sql);
} }
@Test @Test
public void testCreateTable2ColumnsUnique() { public void testCreateTable2ColumnsUnique() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL")); columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
UniqueConstraint unique = new UniqueConstraint(columns.get(0), columns.get(1)); UniqueConstraint unique = new UniqueConstraint(columns.get(0),
TableDefinition def = new TableDefinition("testtable", columns, unique); columns.get(1));
TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, columns, unique);
String sql = DbManager.createSqlStatement(def); String sql = DbManager.createSqlStatement(def);
assertNotNull(sql); assertNotNull(sql);
String expected = "CREATE TABLE testtable (\n" String expected = "CREATE TABLE testtable (\n"
+ " _id INTEGER primary key AUTO_INCREMENT,\n" + " id INTEGER primary key AUTO_INCREMENT,\n"
+ " name VARCHAR(100) NOT NULL,\n" + " name VARCHAR(100) NOT NULL,\n" + " theDate DATETIME,\n"
+ " theDate DATETIME,\n" + " CONSTRAINT UNIQUE (name,theDate)\n" + ")";
+ " CONSTRAINT UNIQUE (name,theDate)\n"
+ ")";
assertEquals(expected, sql); assertEquals(expected, sql);
} }
@Before @Before
public void setUp() throws Exception {} public void setUp() throws Exception {
}
} }
// ~ Formatted by Jindent --- http://www.jindent.com
//~ Formatted by Jindent --- http://www.jindent.com

Loading…
Cancel
Save