package fm.liu.timo.server.session;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap.KeySetView;
import fm.liu.timo.net.connection.BackendConnection;
import fm.liu.timo.route.Outlets;
import fm.liu.timo.server.ServerConnection;
import fm.liu.timo.server.session.handler.AutoTransactionHandler;
import fm.liu.timo.server.session.handler.ResultHandler;
import fm.liu.timo.server.session.handler.RollbackHandler;
import fm.liu.timo.server.session.handler.SessionResultHandler;
/**
* @author liuhuanting
*/
public class AutoTransactionSession extends AbstractSession {
public AutoTransactionSession(ServerConnection front) {
super(front);
variables.setAutocommit(false);
}
@Override
protected SessionResultHandler chooseHandler(Outlets outs, int type) {
return new AutoTransactionHandler(this, outs.size());
}
@Override
public void release(BackendConnection con) {}
@Override
public void clear() {
front.reset();
ArrayList<BackendConnection> rollbacks = new ArrayList<>();
KeySetView<Integer, BackendConnection> keys = connections.keySet();
for (Integer id : keys) {
BackendConnection con = connections.remove(id);
if (con.isClosed()) {
continue;
}
if (con.isRunning()) {
con.setHandler(null);
con.close("cleared");
} else {
rollbacks.add(con);
}
}
ResultHandler handler = new RollbackHandler();
rollbacks.forEach(con -> con.query("rollback", handler));
}
}