Copied existing and used classes.

master
Markus Kreth 9 years ago
parent b898a8d190
commit 7049ca0e6b
  1. 33
      src/main/java/de/kreth/dbmanager/ColumnDefinition.java
  2. 13
      src/main/java/de/kreth/dbmanager/DataType.java
  3. 32
      src/main/java/de/kreth/dbmanager/Database.java
  4. 149
      src/main/java/de/kreth/dbmanager/DbManager.java
  5. 26
      src/main/java/de/kreth/dbmanager/DbValue.java
  6. 20
      src/main/java/de/kreth/dbmanager/Statement.java
  7. 37
      src/main/java/de/kreth/dbmanager/TableDefinition.java
  8. 29
      src/main/java/de/kreth/dbmanager/Version.java

@ -0,0 +1,33 @@
package de.kreth.dbmanager;
public class ColumnDefinition {
private DataType type;
private String columnName;
private String columnParameters;
public ColumnDefinition(DataType type, String columnName) {
super();
this.type = type;
this.columnName = columnName;
}
public ColumnDefinition(DataType type, String columnName, String columnParameters) {
super();
this.type = type;
this.columnName = columnName;
this.columnParameters = columnParameters;
}
public DataType getType() {
return type;
}
public String getColumnName() {
return columnName;
}
public String getColumnParameters() {
return columnParameters;
}
}

@ -0,0 +1,13 @@
package de.kreth.dbmanager;
public enum DataType {
INTEGER,
REAL,
TEXT,
BLOB,
BOOLEAN,
DATETIME,
VARCHAR25,
VARCHAR100,
VARCHAR255,
}

@ -0,0 +1,32 @@
package de.kreth.dbmanager;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public interface Database {
public void beginTransaction() throws SQLException;
public void setTransactionSuccessful() throws SQLException;
public void endTransaction() throws SQLException;
public void execSQL(String sql) throws SQLException;
public void execSQL(String sql, Object bindArgs[]) throws SQLException;
public int getVersion();
public long insert(String table, List<DbValue> values) throws SQLException;
public boolean needUpgrade(int newVersion);
public Iterator<Collection<DbValue>> query(String table, String columns[]) throws SQLException;
public void setVersion(int version);
int delete(String table, String whereClause, String[] whereArgs) throws SQLException;
}

@ -0,0 +1,149 @@
package de.kreth.dbmanager;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbManager {
private Map<String, TableDefinition> tableDefinitions;
private Database db;
private int newVersion;
private List<Version> versions;
public DbManager(Collection<TableDefinition> tables, List<Version> versions, Database db, int newVersion) {
tableDefinitions = new HashMap<String, TableDefinition>();
this.db = db;
this.newVersion = newVersion;
this.versions = versions;
for(TableDefinition def: tables){
tableDefinitions.put(def.getTableName(), def);
}
checkParamters();
sortVersionsAndMakeUnmodifiable();
}
private void checkParamters() {
StringBuilder errorMsg = new StringBuilder();
if(tableDefinitions.isEmpty())
append(errorMsg, "Parameter tables darf nicht leer sein!");
if(db == null)
append(errorMsg, "Parameter db darf nicht null sein!");
if(newVersion<1)
append(errorMsg, "Parameter newVersion muss >= 1 sein!");
if(versions == null)
append(errorMsg, "Liste mit Versionen darf nicht null sein");
if(versions != null && versions.get(0).getVersionNr() != 1)
append(errorMsg, "Der erste Eintrag muss die Versionsnummer 1 haben! Die Create Table anweisungen für erste Version müssen enthalten sein.");
if(errorMsg.length()>0)
throw new IllegalArgumentException(errorMsg.toString());
}
private void sortVersionsAndMakeUnmodifiable() {
Collections.sort(versions, new Comparator<Version>() {
@Override
public int compare(Version o1, Version o2) {
if(o1.getVersionNr() == o2.getVersionNr())
throw new IllegalStateException("Es gibt zwei Einträge mit der selben Version! Es muss eine eindeutige Reihenfolge gegeben sein!");
return o1.getVersionNr() - o2.getVersionNr();
}
});
versions = Collections.unmodifiableList(versions);
}
private void append(StringBuilder bld, String msg){
if(bld.length()>0)
bld.append("\n");
bld.append(msg);
}
public Map<String, TableDefinition> getTableDefinitions() {
return Collections.unmodifiableMap(tableDefinitions);
}
public boolean needUpdate() {
return db.getVersion()<newVersion;
}
/**
* Führt die nötigen Befehle aus um die aktuelle Version zu erreichen. <br />
* @throws SQLException
*/
public void execute() throws SQLException {
int currentVersion = db.getVersion();
int from = 0;
for (int i = from; i < versions.size(); i++) {
Version v = versions.get(i);
if(v.getVersionNr()>currentVersion)
executeStatements(v.getSqlStms());
}
}
private void executeStatements(List<String> sqlStms) throws SQLException {
for(String sql : sqlStms){
db.execSQL(sql);
}
}
public static String createSqlStatement(TableDefinition def) {
StringBuilder sql = new StringBuilder();
sql.append("CREATE TABLE ").append(def.getTableName()).append(" (\n");
boolean first = true;
for(ColumnDefinition col : def.getColumns()) {
if(!first) {
sql.append(",\n");
}
first = false;
sql.append("\t").append(col.getColumnName()).append(" ");
switch (col.getType()) {
case BLOB:
throw new IllegalArgumentException("Column Type " + col.getType() + " not supported");
case BOOLEAN:
sql.append(col.getType().name());
break;
case DATETIME:
sql.append("DATETIME");
break;
case INTEGER:
sql.append(col.getType().name());
break;
case REAL:
sql.append("DOUBLE");
break;
case VARCHAR100:
sql.append("VARCHAR(100)");
break;
case VARCHAR25:
sql.append("VARCHAR(25)");
break;
case TEXT:
case VARCHAR255:
sql.append("VARCHAR(255)");
break;
}
if(col.getColumnParameters() != null && !col.getColumnParameters().isEmpty()){
sql.append(" ").append(col.getColumnParameters());
}
sql.append("\n");
}
sql.append(")");
return sql.toString();
}
}

@ -0,0 +1,26 @@
package de.kreth.dbmanager;
public class DbValue {
private DataType type;
private String columnName;
private Object value;
public DbValue(DataType type, String columnName) {
super();
this.type = type;
this.columnName = columnName;
}
public DataType getType() {
return type;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getColumnName() {
return columnName;
}
}

@ -0,0 +1,20 @@
package de.kreth.dbmanager;
public interface Statement {
public void close();
public void execute();
public long executeInsert();
public void bindBlob(int index, byte value[]);
public void bindDouble(int index, double value);
public void bindLong(int index, long value);
public void bindNull(int index);
public void bindString(int index, String value);
}

@ -0,0 +1,37 @@
package de.kreth.dbmanager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Immutable
* <br /> Der Liste von Spalten wird <i>immer</i> eine Spalte mit Namen {@link #COLUMN_ID_NAME} hinzugefügt, die als Primärschlüssel dient.
* @author markus
*
*/
public class TableDefinition {
public static final String COLUMN_ID_NAME = "_id";
private String tableName;
private Collection<ColumnDefinition> columns;
public TableDefinition(String tableName,Collection<ColumnDefinition> columns) {
super();
this.tableName = tableName;
ColumnDefinition id = new ColumnDefinition(DataType.INTEGER, COLUMN_ID_NAME, "primary key AUTO_INCREMENT");
List<ColumnDefinition> def = new ArrayList<ColumnDefinition>();
def.add(id);
def.addAll(columns);
this.columns = Collections.unmodifiableCollection(def);
}
public String getTableName() {
return tableName;
}
public Collection<ColumnDefinition> getColumns() {
return columns;
}
}

@ -0,0 +1,29 @@
package de.kreth.dbmanager;
import java.util.Collections;
import java.util.List;
public class Version {
private int versionNr;
private List<String> sqlStms;
public Version(int versionNr, List<String> sqlStms) {
super();
this.versionNr = versionNr;
this.sqlStms = Collections.unmodifiableList(sqlStms);
}
public int getVersionNr() {
return versionNr;
}
public List<String> getSqlStms() {
return sqlStms;
}
@Override
public String toString() {
return getClass().getSimpleName() + ": nr=" + versionNr + ", Anz.Sql-Statements=" + sqlStms.size();
}
}
Loading…
Cancel
Save