Merge remote-tracking branch 'origin/master'

master
Markus Kreth 8 years ago
commit 476e73d012
  1. 18
      pom.xml
  2. 13
      src/main/java/de/kreth/dbmanager/DatabaseType.java
  3. 92
      src/main/java/de/kreth/dbmanager/DbManager.java
  4. 18
      src/main/java/de/kreth/dbmanager/TableDefinition.java
  5. 19
      src/test/java/de/kreth/dbmanager/DbManagerAddColumnTest.java
  6. 137
      src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java

@ -1,12 +1,10 @@
<project <?xml version="1.0" encoding="UTF-8"?>
xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.kreth</groupId> <groupId>de.kreth</groupId>
<artifactId>databasedefinition</artifactId> <artifactId>databasedefinition</artifactId>
<version>0.0.7-SNAPSHOT</version> <version>0.0.8-SNAPSHOT</version>
<name>DatabaseDefinition</name> <name>DatabaseDefinition</name>
<description>Database creation and definition framework</description> <description>Database creation and definition framework</description>
@ -27,13 +25,6 @@
<showDeprecation>true</showDeprecation> <showDeprecation>true</showDeprecation>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.2</version>
<!-- <configuration> -->
<!-- <goals>install</goals> -->
<!-- </configuration> -->
</plugin>
</plugins> </plugins>
</build> </build>
@ -61,6 +52,5 @@
<url>https://github.com/markuskreth/databasedefinition</url> <url>https://github.com/markuskreth/databasedefinition</url>
<connection>scm:git:https://github.com/markuskreth/databasedefinition.git</connection> <connection>scm:git:https://github.com/markuskreth/databasedefinition.git</connection>
<developerConnection>scm:git:https://github.com/markuskreth/databasedefinition.git</developerConnection> <developerConnection>scm:git:https://github.com/markuskreth/databasedefinition.git</developerConnection>
<tag>databasedefinition-0.0.4</tag>
</scm> </scm>
</project> </project>

@ -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,8 +108,18 @@ public class DbManager {
} }
} }
public static String createUniqueConstraint(TableDefinition def,
UniqueConstraint constraint) {
StringBuilder sql = new StringBuilder("ALTER TABLE ");
sql.append(def.getTableName()).append(" ADD CONSTRAINT UNIQUE_")
.append(String.join("_", constraint.getNames()))
.append(" UNIQUE (");
sql.append(String.join(", ", constraint.getNames())).append(")");
return sql.toString();
}
public static String createSqlStatement(TableDefinition def) { public static String createSqlStatement(TableDefinition def) {
assert(def != null); assert (def != null);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("CREATE TABLE ").append(def.getTableName()).append(" (\n"); sql.append("CREATE TABLE ").append(def.getTableName()).append(" (\n");
@ -125,53 +136,51 @@ 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");
sql.append(col.getType().name()); case BOOLEAN :
break; sql.append(col.getType().name());
case DATETIME: break;
sql.append("DATETIME"); case DATETIME :
break; sql.append("DATETIME");
case INTEGER: break;
sql.append(col.getType().name()); case INTEGER :
break; sql.append(col.getType().name());
case REAL: break;
sql.append("DOUBLE"); case REAL :
break; sql.append("DOUBLE");
case VARCHAR100: break;
sql.append("VARCHAR(100)"); case VARCHAR100 :
break; sql.append("VARCHAR(100)");
case VARCHAR25: break;
sql.append("VARCHAR(25)"); case VARCHAR25 :
break; sql.append("VARCHAR(25)");
case TEXT: break;
case VARCHAR255: case TEXT :
sql.append("VARCHAR(255)"); case VARCHAR255 :
break; sql.append("VARCHAR(255)");
break;
} }
} }
public static String createSqlAddColumns(TableDefinition current, ColumnDefinition... columnsToAdd) { public static String createSqlAddColumns(TableDefinition current,
assert(current != null); ColumnDefinition... columnsToAdd) {
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());
@ -183,19 +192,22 @@ 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());
} }
} }
sql.append(";"); sql.append(";");
return sql.toString(); return sql.toString();
} }
public static String createSqlDropColumns(TableDefinition current, ColumnDefinition... columnsToDrop) { public static String createSqlDropColumns(TableDefinition current,
assert(current != null); ColumnDefinition... columnsToDrop) {
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());

@ -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,90 @@
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",
String sql = DbManager.createSqlStatement(def); DatabaseType.MYSQL, columns);
String sql = DbManager.createSqlStatement(def);
assertNotNull(sql);
assertEquals("CREATE TABLE testtable (\n" + " _id INTEGER primary key AUTO_INCREMENT\n" + ")", sql); assertNotNull(sql);
} assertEquals(
"CREATE TABLE testtable (\n"
@Test + " id INTEGER primary key AUTO_INCREMENT\n" + ")",
public void testCreateTable2Columns() { sql);
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); }
columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL")); @Test
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); public void testCreateTable2Columns() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
TableDefinition def = new TableDefinition("testtable", columns);
String sql = DbManager.createSqlStatement(def); columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
assertNotNull(sql); columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
assertEquals("CREATE TABLE testtable (\n"
+ " _id INTEGER primary key AUTO_INCREMENT,\n" TableDefinition def = new TableDefinition("testtable",
+ " name VARCHAR(100) NOT NULL,\n" DatabaseType.MYSQL, columns);
+ " theDate DATETIME\n" + ")", String sql = DbManager.createSqlStatement(def);
sql);
} assertNotNull(sql);
assertEquals("CREATE TABLE testtable (\n"
@Test + " id INTEGER primary key AUTO_INCREMENT,\n"
public void testCreateTable2ColumnsUnique() { + " name VARCHAR(100) NOT NULL,\n" + " theDate DATETIME\n"
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>(); + ")", sql);
}
columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); @Test
public void testCreateTable2ColumnsOnHsqlDb() {
UniqueConstraint unique = new UniqueConstraint(columns.get(0), columns.get(1)); List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
TableDefinition def = new TableDefinition("testtable", columns, unique);
String sql = DbManager.createSqlStatement(def); columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
assertNotNull(sql); columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
String expected = "CREATE TABLE testtable (\n" TableDefinition def = new TableDefinition("testtable",
+ " _id INTEGER primary key AUTO_INCREMENT,\n" DatabaseType.HSQLDB, columns);
+ " name VARCHAR(100) NOT NULL,\n" String sql = DbManager.createSqlStatement(def);
+ " theDate DATETIME,\n"
+ " CONSTRAINT UNIQUE (name,theDate)\n" assertNotNull(sql);
+ ")"; assertEquals("CREATE TABLE testtable (\n" + " id INTEGER IDENTITY,\n"
+ " name VARCHAR(100) NOT NULL,\n" + " theDate DATETIME\n"
assertEquals(expected, sql); + ")", sql);
} }
@Before @Test
public void setUp() throws Exception {} public void test2ColumnsUnique() {
List<ColumnDefinition> columns = new ArrayList<ColumnDefinition>();
columns.add(
new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL"));
columns.add(new ColumnDefinition(DataType.DATETIME, "theDate"));
UniqueConstraint unique = new UniqueConstraint(columns.get(0),
columns.get(1));
TableDefinition def = new TableDefinition("testtable",
DatabaseType.MYSQL, columns);
String sql = DbManager.createUniqueConstraint(def, unique);
assertNotNull(sql);
String expected = "ALTER TABLE testtable ADD CONSTRAINT UNIQUE_name_theDate UNIQUE (name, theDate)";
assertEquals(expected, sql);
}
@Before
public void setUp() throws Exception {
}
} }
// ~ Formatted by Jindent --- http://www.jindent.com
//~ Formatted by Jindent --- http://www.jindent.com

Loading…
Cancel
Save