// ENHANCEME: Should support the use of bindings
// ENHANCEME: Could also support the option of using a seperate EOF stack so
// as to execute
// sql in a non-blocking fashion.
public static void evaluateSQLWithEntity(EOEditingContext ec, EOEntity entity, String exp) {
EODatabaseContext dbContext = EODatabaseContext.registeredDatabaseContextForModel(entity.model(), ec);
dbContext.lock();
try {
EOAdaptorChannel adaptorChannel = dbContext.availableChannel().adaptorChannel();
if (!adaptorChannel.isOpen()) {
adaptorChannel.openChannel();
}
EOSQLExpressionFactory factory = adaptorChannel.adaptorContext().adaptor().expressionFactory();
if (ERXEOAccessUtilities.log.isInfoEnabled()) {
ERXEOAccessUtilities.log.info("Executing " + exp);
}
// If channel.evaluateExpression throws when committing, it won't close the JDBC transaction
// Probably a bug in JDBCChannel, but we must take care of it
boolean contextHadOpenTransaction = adaptorChannel.adaptorContext().hasOpenTransaction();
try {
adaptorChannel.evaluateExpression(factory.expressionForString(exp));
}
catch (EOGeneralAdaptorException e) {
if (adaptorChannel.adaptorContext().hasOpenTransaction() && ! contextHadOpenTransaction) {
adaptorChannel.adaptorContext().rollbackTransaction();
}
throw e;
}
}
finally {
dbContext.unlock();
}
}