package mediawiki.tool;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import mediawiki.task.NormdatenTask2;
import mediawiki.task.config.nt2.DatabaseHandler;
public class NormdatenDaemonManager implements Runnable{
private Connection connection;
private NormdatenTask2 nt2;
private int taskID;
private int runID;
public NormdatenDaemonManager(Connection c, NormdatenTask2 nt2, int taskid){
connection = c;
this.nt2 = nt2;
taskID = taskid;
}
private int registerRun() throws SQLException {
PreparedStatement s = connection.prepareStatement("INSERT INTO runs (task) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
s.setInt(1, taskID);
s.executeUpdate();
ResultSet rs = s.getGeneratedKeys();
if (rs.next()){
runID = rs.getInt(1);
s.closeOnCompletion();
return runID;
}
s.closeOnCompletion();
throw new RuntimeException("unknown error while registering run");
}
public void run() {
try{
registerRun();
nt2.registerErrorHandler(new DatabaseHandler(connection, runID));
nt2.run();
finalizeRun();
}catch(Exception e){
e.printStackTrace();
}
}
private void finalizeRun() throws SQLException {
{
PreparedStatement s = connection.prepareStatement("UPDATE runs SET `end` = NOW() WHERE ID = ? LIMIT 1");
s.setInt(1, runID);
s.executeUpdate();
s.closeOnCompletion();
}
{
PreparedStatement s = connection.prepareStatement("DELETE FROM problems WHERE AND run != ? AND (SELECT project FROM tasks WHERE tasks.ID = (SELECT task FROM runs WHERE runs.ID = problems.run)) = (SELECT project FROM tasks WHERE tasks.ID = (SELECT task FROM runs WHERE runs.ID = ?))");
s.setInt(1, runID);
s.setInt(2, runID);
s.executeUpdate();
s.closeOnCompletion();
}
{
Statement s = connection.createStatement();
s.execute("CALL `delete_old`();");
s.closeOnCompletion();
}
}
}