package org.myeslib.util.jdbi;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.myeslib.core.data.UnitOfWork;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.TransactionCallback;
import org.skife.jdbi.v2.TransactionIsolationLevel;
import org.skife.jdbi.v2.TransactionStatus;
import com.google.common.base.Function;
import com.google.inject.Inject;
@Slf4j
public class JdbiUnitOfWorkAutoCommitJournalDao implements UnitOfWorkJournalDao<UUID> {
@Inject
public JdbiUnitOfWorkAutoCommitJournalDao(DBI dbi,
ArTablesMetadata tables,
Function<UnitOfWork, String> toStringFunction) {
this.dbi = dbi;
this.tables = tables;
this.toStringFunction = toStringFunction;
}
private final DBI dbi;
private final ArTablesMetadata tables;
private final Function<UnitOfWork, String> toStringFunction;
/*
* (non-Javadoc)
* @see org.myeslib.util.jdbi.UnitOfWorkJournalDao#append(java.lang.Object, org.myeslib.core.data.UnitOfWork)
*/
@Override
public void append(final UUID id, final UnitOfWork uow) {
final String sql = String.format("insert into %s (id, uow_data, version) values (:id, :uow_data, :version)", tables.getUnitOfWorkTable());
log.debug(sql);
final String asString = toStringFunction.apply(uow);
dbi.inTransaction(TransactionIsolationLevel.READ_COMMITTED, new TransactionCallback<Integer>() {
@Override
public Integer inTransaction(Handle conn, TransactionStatus status)
throws Exception {
conn.createStatement(sql)
.bind("id", id.toString())
.bind("uow_data", asString)
.bind("version", uow.getVersion())
.execute();
return null;
}
}) ;
log.debug("wrote uow");
}
}