Migrated the TransitionRepository here from Yohoho.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@1930 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
//
|
||||
// $Id$
|
||||
|
||||
package com.samskivert.jdbc;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import com.samskivert.io.PersistenceException;
|
||||
|
||||
/**
|
||||
* Used to note that transitionary code has been run to migrate persistent
|
||||
* data. The TransitionRepository is especially useful for data that
|
||||
* one cannot examine to determine if it's been transitioned.
|
||||
*/
|
||||
public class TransitionRepository extends SimpleRepository
|
||||
{
|
||||
/** The identifier of this connection. */
|
||||
public static final String TRANSITION_DB_IDENT = "transitiondb";
|
||||
|
||||
/**
|
||||
* An interface for the transition.
|
||||
*/
|
||||
public static interface Transition
|
||||
{
|
||||
/**
|
||||
* Do the transition.
|
||||
*/
|
||||
public void run () throws PersistenceException;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a TransitionRepository for the server.
|
||||
*/
|
||||
public TransitionRepository (ConnectionProvider conprov)
|
||||
throws PersistenceException
|
||||
{
|
||||
super(conprov, TRANSITION_DB_IDENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a transition if it has not already been applied, and record
|
||||
* that it was applied.
|
||||
*/
|
||||
public void transition (Class clazz, String name, Transition trans)
|
||||
throws PersistenceException
|
||||
{
|
||||
if (!isTransitionApplied(clazz, name)) {
|
||||
trans.run();
|
||||
noteTransition(clazz, name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Has the specified name transition been applied.
|
||||
*/
|
||||
public boolean isTransitionApplied (Class clazz, final String name)
|
||||
throws PersistenceException
|
||||
{
|
||||
final String cname = clazz.getName();
|
||||
return execute(new Operation<Boolean>() {
|
||||
public Boolean invoke (Connection conn, DatabaseLiaison liaison)
|
||||
throws SQLException, PersistenceException
|
||||
{
|
||||
Object found = null;
|
||||
PreparedStatement stmt = null;
|
||||
try {
|
||||
stmt = conn.prepareStatement("select NAME " +
|
||||
"from TRANSITIONS where CLASS=? and NAME=?");
|
||||
stmt.setString(1, cname);
|
||||
stmt.setString(2, name);
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
while (rs.next()); // is this really necessary?
|
||||
return true;
|
||||
}
|
||||
} finally {
|
||||
JDBCUtil.close(stmt);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Note in the database that a particular transition has been applied.
|
||||
*/
|
||||
public void noteTransition (Class clazz, final String name)
|
||||
throws PersistenceException
|
||||
{
|
||||
final String cname = clazz.getName();
|
||||
executeUpdate(new Operation<Void>() {
|
||||
public Void invoke (Connection conn, DatabaseLiaison liaison)
|
||||
throws SQLException, PersistenceException
|
||||
{
|
||||
PreparedStatement stmt = null;
|
||||
try {
|
||||
stmt = conn.prepareStatement("insert into TRANSITIONS " +
|
||||
"(CLASS, NAME) values (?, ?)");
|
||||
stmt.setString(1, cname);
|
||||
stmt.setString(2, name);
|
||||
|
||||
JDBCUtil.checkedUpdate(stmt, 1);
|
||||
} finally {
|
||||
JDBCUtil.close(stmt);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the transition.
|
||||
*/
|
||||
public void clearTransition (Class clazz, final String name)
|
||||
throws PersistenceException
|
||||
{
|
||||
final String cname = clazz.getName();
|
||||
executeUpdate(new Operation<Void>() {
|
||||
public Void invoke (Connection conn, DatabaseLiaison liaison)
|
||||
throws SQLException, PersistenceException
|
||||
{
|
||||
PreparedStatement stmt = null;
|
||||
try {
|
||||
stmt = conn.prepareStatement("delete from TRANSITIONS " +
|
||||
"where CLASS=? and NAME=?");
|
||||
stmt.setString(1, cname);
|
||||
stmt.setString(2, name);
|
||||
|
||||
stmt.executeUpdate(); // we don't care if it worked or not
|
||||
|
||||
} finally {
|
||||
JDBCUtil.close(stmt);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user