package de.tud.kom.socom.database.report;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import de.tud.kom.socom.database.HSQLDatabase;
import de.tud.kom.socom.util.datatypes.Report;
import de.tud.kom.socom.util.exceptions.IllegalParameterException;
public class HSQLReportDatabase extends HSQLDatabase implements ReportDatabase {
private static ReportDatabase instance = new HSQLReportDatabase();
private HSQLReportDatabase() {
super();
}
public static ReportDatabase getInstance() {
return instance;
}
@Override
public boolean createReport(long informant, String type, long referenceId, String report) throws SQLException, IllegalParameterException {
PreparedStatement typeStatement = db.getPreparedStatement("SELECT id FROM reporttypes WHERE type = ?");
typeStatement.setString(1, type);
ResultSet rs = typeStatement.executeQuery();
if(!rs.next())
throw new IllegalParameterException("type");
long typeid = rs.getLong(1);
PreparedStatement statement = db.getPreparedStatement("INSERT INTO reports " +
"(informant, type, reference, report) VALUES (" +
"?, ?,?,?);");
statement.setLong(1, informant);
statement.setLong(2, typeid);
statement.setLong(3, referenceId);
statement.setString(4, report);
return statement.executeUpdate() == 1;
}
@Override
public List<Report> getReports(int limit, int offset, boolean includereviewed) throws SQLException {
List<Report> result = new LinkedList<Report>();
String limitStatement = limit != -1 ?
" LIMIT " + limit + (offset != -1 ? " OFFSET " + offset : "")
: "";
String whereStatement = includereviewed ? "" : " WHERE reviewed = false ";
String query = "SELECT " +
"id, informant, reporttypes.type, reference, reference2, date, report, review, reviewed, reviewedby, reviewedon " +
"FROM reports INNER JOIN reporttypes ON reports.type = reporttypes.id " +
whereStatement + " ORDER BY date DESC " + limitStatement;
PreparedStatement statement = db.getPreparedStatement(query);
ResultSet rs = statement.executeQuery();
while(rs.next()) {
Report r = extractReport(rs);
result.add(r);
}
return result;
}
@Override
public boolean makeReview(long reportid, long uid, String review) throws SQLException {
PreparedStatement statement = db.getPreparedStatement("UPDATE reports " +
"SET reviewed = true, reviewedby = ?, review = ?, reviewedon = CURRENT_TIMESTAMP " +
"WHERE id = ?;");
statement.setLong(1, uid);
statement.setString(2, review);
statement.setLong(3, reportid);
return statement.executeUpdate() == 1;
}
@Override
public Report getReport(long reportid) throws SQLException {
String query = "SELECT " +
"id, informant, reporttypes.type, reference, reference2, date, report, review, reviewed, reviewedby, reviewedon " +
"FROM reports INNER JOIN reporttypes ON reports.type = reporttypes.id " +
"WHERE id = ?";
PreparedStatement statement = db.getPreparedStatement(query);
statement.setLong(1, reportid);
ResultSet rs = statement.executeQuery();
if(rs.next())
return extractReport(rs);
return null;
}
private Report extractReport(ResultSet rs) throws SQLException {
String report = rs.getString("report");
String reference2 = rs.getString("reference2");
String type = rs.getString("type");
long reference = rs.getLong("reference");
long id = rs.getLong("id");
Date timestamp = rs.getTimestamp("date");
long informant = rs.getLong("informant");
boolean reviewed = rs.getBoolean("reviewed");
long reviewedby = rs.getLong("reviewedby");
String review = rs.getString("review");
Date reviewedon = rs.getTimestamp("reviewedon");
Report r = new Report(id, informant, report, type, reference2, reference, timestamp);
if(reviewed) r.addReview(reviewedby, review, reviewedon);
return r;
}
}