// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.apidb.v0_6.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openstreetmap.osmosis.apidb.common.DatabaseContext2;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
/**
* Reads active transaction ids from the database allowing up-to-current queries to be performed
* when extracting changesets from the history tables.
*/
public class TransactionDao implements TransactionManager {
private static final Logger LOG = Logger.getLogger(TransactionDao.class.getName());
private DatabaseContext2 dbCtx;
private JdbcTemplate jdbcTemplate;
/**
* Creates a new instance.
*
* @param dbCtx
* Used to access the database.
*/
public TransactionDao(DatabaseContext2 dbCtx) {
this.dbCtx = dbCtx;
jdbcTemplate = dbCtx.getJdbcTemplate();
}
@Override
public TransactionSnapshot getTransactionSnapshot() {
String snapshotString;
TransactionSnapshot snapshot;
snapshotString = jdbcTemplate.queryForObject("SELECT txid_current_snapshot()", String.class);
snapshot = new TransactionSnapshot(snapshotString);
if (LOG.isLoggable(Level.FINER)) {
LOG.finer("Loaded new database snapshot, xmin=" + snapshot.getXMin()
+ ", xmax=" + snapshot.getXMax()
+ ", xiplist=" + snapshot.getXIpList());
}
return snapshot;
}
@Override
public void executeWithinTransaction(final Runnable target) {
dbCtx.executeWithinTransaction(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
target.run();
}
});
}
}