package hhn.temp.project.provider; import hhn.temp.project.Task; import hhn.temp.project.TaskState; import java.sql.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class SimpleDatabaseManager implements DatabaseManager { private Connection connection; private enum QueryMode { SELECT, INSERT, DELETE, UPDATE } private int taskStateToInt(TaskState taskState) { return (taskState == TaskState.FINISHED) ? 1 : 0; } private TaskState intToTaskState(int i) { if (i < 0 || i > 1) { throw new IllegalArgumentException("Integer may only bet 0 or 1"); } return (i == 1) ? TaskState.FINISHED : TaskState.IN_PROGRESS; } private String getQuery(QueryMode query) { String queryString = null; switch (query) { case INSERT -> queryString = "INSERT INTO Task (taskid, name, description, workerid, taskstate) VALUES (?, ?, ?, ?, ?)"; case UPDATE -> queryString = "UPDATE Task SET name = ?, description = ?, taskstate = ? WHERE taskid = ?"; case DELETE -> queryString = "DELETE FROM Task WHERE taskid = ?"; case SELECT -> queryString = "SELECT * FROM Task WHERE workerid = ?"; } return queryString; } public void clearDatabase() throws SQLException { try (Statement statement = connection.createStatement()) { statement.executeUpdate("TRUNCATE TABLE Task;"); } } @Override public void saveObjects(Collection objects) throws SQLException { for (E obj : objects) { saveObject(obj); } } @Override public Collection getObjects() throws SQLException { return null; } @Override public void saveObject(E object) throws SQLException { String query = getQuery(QueryMode.INSERT); if (object instanceof Task task) { PreparedStatement ps = connection.prepareStatement(query); ps.setInt(1, task.getTaskId()); ps.setString(2, task.getName()); ps.setString(3, task.getDescription()); ps.setInt(4, task.getWorkerId()); ps.setInt(5, taskStateToInt(task.getTaskState())); ps.executeUpdate(); } } @Override public E getObject(int taskId) throws SQLException { String query = getQuery(QueryMode.SELECT); Task task = null; PreparedStatement ps = connection.prepareStatement(query); ps.setInt(1, taskId); ResultSet resultSet = ps.executeQuery(); if (resultSet.next()) { task = new Task( resultSet.getInt("taskid"), resultSet.getInt("workerid"), resultSet.getString("name"), resultSet.getString("description") ); task.setTaskState(intToTaskState(resultSet.getInt("taskstate"))); } return (E) task; } @Override public void deleteObject(int taskId) throws SQLException { String query = getQuery(QueryMode.DELETE); try (PreparedStatement ps = connection.prepareStatement(query)) { ps.setInt(1, taskId); ps.executeUpdate(); } } @Override public E updateObject(int taskId, E object) throws SQLException { String query = getQuery(QueryMode.UPDATE); if (object instanceof Task task) { if (taskId != task.getTaskId()) { throw new IllegalArgumentException("Task ID does not equals Task ID from Task!"); } PreparedStatement ps = connection.prepareStatement(query); ps.setString(1, task.getName()); ps.setString(2, task.getDescription()); ps.setInt(3, taskStateToInt(task.getTaskState())); ps.setInt(4, task.getTaskId()); int updated = ps.executeUpdate(); if (updated == 0) { return null; } return (E) task; } return null; } @Override public void connect() throws SQLException { connection = DriverManager.getConnection("jdbc:mysql://sql7.freesqldatabase.com/sql7810540?user=sql7810540&password=mXdJCFtDZz"); } @Override public void close() throws SQLException { if (connection != null) { connection.close(); } } }