package dbmigrate.logging;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import dbmigrate.exceptions.HistoryException;
import dbmigrate.executor.CreateTableExecutor;
import dbmigrate.model.db.Column;
import dbmigrate.model.db.IColumn;
import dbmigrate.model.db.Table;
import dbmigrate.model.db.TypeEnum;
import dbmigrate.model.operation.CreateTableOperationDescriptor;
public class HistoryStorage {
private Connection conn;
private String tableName = "history_storage";
private void createTable() {
Table table = new Table();
table.setName(this.tableName);
List<IColumn> columns = new ArrayList<IColumn> ();
Column ip = new Column();
ip.setName("ip");
ip.setType(TypeEnum.VARCHAR);
ip.setLength(15);
ip.setNullable(true);
Column migrationId = new Column();
migrationId.setName("migration_id");
migrationId.setType(TypeEnum.VARCHAR);
migrationId.setLength(100);
migrationId.setNullable(false);
Column date = new Column();
date.setName("migration_date");
date.setType(TypeEnum.DATE);
Column direction = new Column();
direction.setName("direction");
direction.setType(TypeEnum.INT);
Column operations = new Column();
operations.setName("operations");
operations.setType(TypeEnum.TEXT);
Column success = new Column();
success.setName("success");
success.setType(TypeEnum.INT);
columns.add(ip);
columns.add(migrationId);
columns.add(date);
columns.add(direction);
columns.add(operations);
columns.add(success);
table.setColumns(columns);
CreateTableOperationDescriptor createDesc = new CreateTableOperationDescriptor();
createDesc.setTable(table);
CreateTableExecutor createExec = new CreateTableExecutor(this.conn);
try {
createExec.execute(createDesc);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void store(String ip, String migration_id, String date, int direction, String operations, boolean success) throws HistoryException, SQLException {
if(null == this.conn) {
throw new HistoryException();
}
StringBuilder query = new StringBuilder();
query.append("INSERT INTO \"").append(this.tableName).append("\" (ip, migration_id, migration_date, direction, operations, success) VALUES(");
query.append("'").append(ip).append("', ");
query.append("'").append(migration_id).append("', ");
query.append("'").append(date).append("', ");
query.append("").append(direction).append(", ");
query.append("'").append(operations).append("', ");
int succ = 0;
if (success) {
succ = 1;
}
query.append("").append(succ).append(");");
this.conn.createStatement().executeUpdate(query.toString());
this.conn.commit();
}
public List<HistoryElement> getHistory() throws HistoryException, SQLException {
if(null == this.conn) {
throw new HistoryException();
}
String query = "SELECT * FROM \"" + this.tableName + "\" ORDER BY migration_date DESC";
List<HistoryElement> elements = new ArrayList<HistoryElement> ();
Statement stmt = this.conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String ip = rs.getString(1);
String migrationId = rs.getString(2);
String date = rs.getString(3);
int direction = rs.getInt(4);
String operations = rs.getString(5);
boolean success = rs.getBoolean(6);
elements.add(new HistoryElement(ip, migrationId, date, direction, operations, success));
}
return elements;
}
public void setConnection(Connection conn) throws SQLException {
if(null == conn) {
return;
}
this.conn = conn;
return;
// String query = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public' AND table_name='" + this.tableName + "';";
// ResultSet rset = conn.createStatement().executeQuery(query);
// rset.next();
// int count = rset.getInt(1);
//
// if (count == 0) {
// this.createTable();
// }
}
}