From 7049ca0e6b2dba639af68c70250a68718ec6e4f4 Mon Sep 17 00:00:00 2001 From: Markus Kreth Date: Sun, 6 Nov 2016 14:08:17 +0100 Subject: [PATCH] Copied existing and used classes. --- .../de/kreth/dbmanager/ColumnDefinition.java | 33 ++++ .../java/de/kreth/dbmanager/DataType.java | 13 ++ .../java/de/kreth/dbmanager/Database.java | 32 ++++ .../java/de/kreth/dbmanager/DbManager.java | 149 ++++++++++++++++++ src/main/java/de/kreth/dbmanager/DbValue.java | 26 +++ .../java/de/kreth/dbmanager/Statement.java | 20 +++ .../de/kreth/dbmanager/TableDefinition.java | 37 +++++ src/main/java/de/kreth/dbmanager/Version.java | 29 ++++ 8 files changed, 339 insertions(+) create mode 100644 src/main/java/de/kreth/dbmanager/ColumnDefinition.java create mode 100644 src/main/java/de/kreth/dbmanager/DataType.java create mode 100644 src/main/java/de/kreth/dbmanager/Database.java create mode 100644 src/main/java/de/kreth/dbmanager/DbManager.java create mode 100644 src/main/java/de/kreth/dbmanager/DbValue.java create mode 100644 src/main/java/de/kreth/dbmanager/Statement.java create mode 100644 src/main/java/de/kreth/dbmanager/TableDefinition.java create mode 100644 src/main/java/de/kreth/dbmanager/Version.java diff --git a/src/main/java/de/kreth/dbmanager/ColumnDefinition.java b/src/main/java/de/kreth/dbmanager/ColumnDefinition.java new file mode 100644 index 0000000..22b3b41 --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/ColumnDefinition.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; + } +} diff --git a/src/main/java/de/kreth/dbmanager/DataType.java b/src/main/java/de/kreth/dbmanager/DataType.java new file mode 100644 index 0000000..e96099d --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/DataType.java @@ -0,0 +1,13 @@ +package de.kreth.dbmanager; + +public enum DataType { + INTEGER, + REAL, + TEXT, + BLOB, + BOOLEAN, + DATETIME, + VARCHAR25, + VARCHAR100, + VARCHAR255, +} diff --git a/src/main/java/de/kreth/dbmanager/Database.java b/src/main/java/de/kreth/dbmanager/Database.java new file mode 100644 index 0000000..8a4567a --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/Database.java @@ -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 values) throws SQLException; + + public boolean needUpgrade(int newVersion); + + public Iterator> query(String table, String columns[]) throws SQLException; + + public void setVersion(int version); + + int delete(String table, String whereClause, String[] whereArgs) throws SQLException; + +} \ No newline at end of file diff --git a/src/main/java/de/kreth/dbmanager/DbManager.java b/src/main/java/de/kreth/dbmanager/DbManager.java new file mode 100644 index 0000000..3b2db1f --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/DbManager.java @@ -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 tableDefinitions; + private Database db; + private int newVersion; + private List versions; + + public DbManager(Collection tables, List versions, Database db, int newVersion) { + tableDefinitions = new HashMap(); + 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() { + + @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 getTableDefinitions() { + return Collections.unmodifiableMap(tableDefinitions); + } + + public boolean needUpdate() { + return db.getVersion() + * @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 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(); + } +} diff --git a/src/main/java/de/kreth/dbmanager/DbValue.java b/src/main/java/de/kreth/dbmanager/DbValue.java new file mode 100644 index 0000000..29edaac --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/DbValue.java @@ -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; + } + +} diff --git a/src/main/java/de/kreth/dbmanager/Statement.java b/src/main/java/de/kreth/dbmanager/Statement.java new file mode 100644 index 0000000..abd4497 --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/Statement.java @@ -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); + +} \ No newline at end of file diff --git a/src/main/java/de/kreth/dbmanager/TableDefinition.java b/src/main/java/de/kreth/dbmanager/TableDefinition.java new file mode 100644 index 0000000..a9a5b80 --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/TableDefinition.java @@ -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 + *
Der Liste von Spalten wird immer 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 columns; + + public TableDefinition(String tableName,Collection columns) { + super(); + this.tableName = tableName; + ColumnDefinition id = new ColumnDefinition(DataType.INTEGER, COLUMN_ID_NAME, "primary key AUTO_INCREMENT"); + List def = new ArrayList(); + def.add(id); + def.addAll(columns); + this.columns = Collections.unmodifiableCollection(def); + } + + public String getTableName() { + return tableName; + } + + public Collection getColumns() { + return columns; + } + +} diff --git a/src/main/java/de/kreth/dbmanager/Version.java b/src/main/java/de/kreth/dbmanager/Version.java new file mode 100644 index 0000000..fdd9055 --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/Version.java @@ -0,0 +1,29 @@ +package de.kreth.dbmanager; + +import java.util.Collections; +import java.util.List; + +public class Version { + + private int versionNr; + private List sqlStms; + + public Version(int versionNr, List sqlStms) { + super(); + this.versionNr = versionNr; + this.sqlStms = Collections.unmodifiableList(sqlStms); + } + + public int getVersionNr() { + return versionNr; + } + + public List getSqlStms() { + return sqlStms; + } + + @Override + public String toString() { + return getClass().getSimpleName() + ": nr=" + versionNr + ", Anz.Sql-Statements=" + sqlStms.size(); + } +}