package net.sf.egonet.persistence;
import java.util.TreeMap;
import net.sf.egonet.model.Entity;
import net.sf.egonet.model.Question;
import net.sf.egonet.model.QuestionOption;
import net.sf.egonet.web.Main;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
public class DB {
static void save(Session session, Entity e) {
session.saveOrUpdate(e);
}
public static void save(final Entity e) {
withTx(new Function<Session,Object>(){
public Object apply(Session s) {
save(s,e);
return null;
}
});
}
static void delete(Session s, Entity e) {
e.setActive(false);
s.saveOrUpdate(e);
}
static void delete(final Entity e) {
withTx(new Function<Session,Object>(){
public Object apply(Session s) {
delete(s,e);
return null;
}
});
}
static <E> E withTx(Function<Session,E> f) {
Session session = null;
Transaction tx = null;
E result = null;
try {
session = Main.getDBSessionFactory().openSession();
tx = session.beginTransaction();
result = f.apply(session);
tx.commit();
} catch(Exception ex) {
if(tx != null) {
tx.rollback();
}
throw new RuntimeException("Egoweb transaction failed.",ex);
} finally {
session.close();
}
return result;
}
static abstract class Action<R> implements Function<Session,R> {
protected Session session;
public R apply(Session session) {
this.session = session;
return get();
}
public abstract R get();
public R execute() {
return withTx(this);
}
}
public static void migrate() {
new Action<Object>() {
public Object get() {
// TODO: Need to store schema version so each migration can be applied exactly once.
session.createSQLQuery(
"create index idx_questionoption_qid_ord on " +
"question_option(question_id,ordering)")
.executeUpdate();
/*
for(String entity : new String[]{
"Alter","Answer","Expression","Interview","Question","QuestionOption","Study"})
{
this.session.createQuery(
"update "+entity+" set active = 1 where active is null")
.executeUpdate();
}
*/
TreeMap<Long,Long> qIdToStudyId = Maps.newTreeMap();
for(Object questionObj : session.createQuery("from Question").list()) {
Question question = (Question) questionObj;
qIdToStudyId.put(question.getId(), question.getStudyId());
}
for(Object optionObj : session.createQuery("from QuestionOption").list()) {
QuestionOption option = (QuestionOption) optionObj;
if(option.getQuestionId() != null && option.getStudyId() == null) {
option.setStudyId(qIdToStudyId.get(option.getQuestionId()));
DB.save(session, option);
}
}
return null;
}
}.execute();
}
}