use of org.jooq.ExecuteContext in project jOOQ by jOOQ.
the class SakilaReportService method initDB.
private static void initDB() throws Exception {
final Properties properties = new Properties();
properties.load(SakilaReportService.class.getResourceAsStream("/config.properties"));
Class.forName(properties.getProperty("db.driver"));
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(properties.getProperty("db.url"));
ds.setUsername(properties.getProperty("db.username"));
ds.setPassword(properties.getProperty("db.password"));
// Some nice debug logging of formatted queries and the first 5 rows in each result set.
dsl = DSL.using(new DefaultConfiguration().set(ds).set(DefaultExecuteListenerProvider.providers(new DefaultExecuteListener() {
@Override
public void executeEnd(ExecuteContext ctx) {
Configuration config = ctx.configuration().derive();
config.settings().setRenderFormatted(true);
log.info("\n" + DSL.using(config).renderInlined(ctx.query()));
}
@Override
public void fetchEnd(ExecuteContext ctx) {
log.info("\n" + ctx.result().format(5));
}
})));
}
use of org.jooq.ExecuteContext in project jOOQ by jOOQ.
the class AbstractDatabase method create.
@SuppressWarnings("serial")
protected final DSLContext create(boolean muteExceptions) {
// [#3800] Make sure that faulty queries are logged in a formatted
// way to help users provide us with bug reports
final Configuration configuration = create0().configuration();
if (muteExceptions) {
return DSL.using(configuration);
} else {
final Settings newSettings = SettingsTools.clone(configuration.settings()).withRenderFormatted(true);
final ExecuteListenerProvider[] oldProviders = configuration.executeListenerProviders();
final ExecuteListenerProvider[] newProviders = new ExecuteListenerProvider[oldProviders.length + 1];
System.arraycopy(oldProviders, 0, newProviders, 0, oldProviders.length);
newProviders[oldProviders.length] = new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
class SQLPerformanceWarning extends Exception {
}
@Override
public void start(ExecuteContext ctx) {
// SQLPerformanceWarning.
if (!initialised) {
DSL.using(configuration).selectOne().fetch();
initialised = true;
}
}
@Override
public void executeStart(ExecuteContext ctx) {
ctx.data("org.jooq.util.AbstractDatabase.watch", new StopWatch());
}
@Override
public void executeEnd(ExecuteContext ctx) {
StopWatch watch = (StopWatch) ctx.data("org.jooq.util.AbstractDatabase.watch");
if (watch.split() > TimeUnit.SECONDS.toNanos(5L)) {
watch.splitWarn("Slow SQL");
log.warn("Slow SQL", "jOOQ Meta executed a slow query (slower than 5 seconds)" + "\n\n" + "Please report this bug here: https://github.com/jOOQ/jOOQ/issues/new\n\n" + formatted(ctx.query()), new SQLPerformanceWarning());
}
}
@Override
public void exception(ExecuteContext ctx) {
log.warn("SQL exception", "Exception while executing meta query: " + (ctx.sqlException() != null ? ctx.sqlException().getMessage() : ctx.exception() != null ? ctx.exception().getMessage() : "No exception available") + "\n\n" + "Please report this bug here: https://github.com/jOOQ/jOOQ/issues/new\n\n" + formatted(ctx.query()));
}
private String formatted(Query query) {
return DSL.using(configuration.derive(newSettings)).renderInlined(query);
}
});
return DSL.using(configuration.derive(newProviders));
}
}
use of org.jooq.ExecuteContext in project jOOQ by jOOQ.
the class DefaultDSLContext method fetchLazy.
@Override
public Cursor<Record> fetchLazy(ResultSet rs, Field<?>... fields) {
ExecuteContext ctx = new DefaultExecuteContext(configuration());
ExecuteListener listener = new ExecuteListeners(ctx);
ctx.resultSet(rs);
return new CursorImpl<Record>(ctx, listener, fields, null, false, true);
}
use of org.jooq.ExecuteContext in project jOOQ by jOOQ.
the class AbstractDMLQuery method execute.
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected final int execute(ExecuteContext ctx, ExecuteListener listener) throws SQLException {
if (returning.isEmpty()) {
return super.execute(ctx, listener);
} else {
int result = 1;
ResultSet rs;
switch(ctx.family()) {
// SQLite can select _rowid_ after the insert
case SQLITE:
{
listener.executeStart(ctx);
result = ctx.statement().executeUpdate();
ctx.rows(result);
listener.executeEnd(ctx);
DSLContext create = DSL.using(ctx.configuration());
returned = create.select(returning).from(table).where(rowid().equal(rowid().getDataType().convert(create.lastID()))).fetchInto(table);
return result;
}
case CUBRID:
{
listener.executeStart(ctx);
result = ctx.statement().executeUpdate();
ctx.rows(result);
listener.executeEnd(ctx);
selectReturning(ctx.configuration(), create(ctx.configuration()).lastID());
return result;
}
case DERBY:
case H2:
case MARIADB:
case MYSQL:
{
listener.executeStart(ctx);
result = ctx.statement().executeUpdate();
ctx.rows(result);
listener.executeEnd(ctx);
rs = ctx.statement().getGeneratedKeys();
try {
List<Object> list = new ArrayList<Object>();
// from getGeneratedKeys() sometimes
if (rs != null)
while (rs.next()) list.add(rs.getObject(1));
selectReturning(ctx.configuration(), list.toArray());
return result;
} finally {
JDBCUtils.safeClose(rs);
}
}
// in the Postgres JDBC driver
case FIREBIRD:
case POSTGRES:
{
listener.executeStart(ctx);
rs = ctx.statement().executeQuery();
listener.executeEnd(ctx);
break;
}
case HSQLDB:
default:
{
listener.executeStart(ctx);
result = ctx.statement().executeUpdate();
ctx.rows(result);
listener.executeEnd(ctx);
rs = ctx.statement().getGeneratedKeys();
break;
}
}
ExecuteContext ctx2 = new DefaultExecuteContext(ctx.configuration());
ExecuteListener listener2 = new ExecuteListeners(ctx2);
ctx2.resultSet(rs);
returned = new CursorImpl<R>(ctx2, listener2, fieldArray(returning), null, false, true).fetch();
// [#3682] Plain SQL tables do not have any fields
if (table.fields().length > 0)
returned = returned.into(table);
// execute this logic
if (returned.size() > 0 || ctx.family() != HSQLDB) {
result = returned.size();
ctx.rows(result);
}
return result;
}
}
use of org.jooq.ExecuteContext in project jOOQ by jOOQ.
the class BatchMultiple method execute.
static int[] execute(final Configuration configuration, final Query[] queries) {
ExecuteContext ctx = new DefaultExecuteContext(configuration, queries);
ExecuteListener listener = new ExecuteListeners(ctx);
Connection connection = ctx.connection();
try {
ctx.statement(new SettingsEnabledPreparedStatement(connection));
String[] batchSQL = ctx.batchSQL();
for (int i = 0; i < queries.length; i++) {
listener.renderStart(ctx);
batchSQL[i] = DSL.using(configuration).renderInlined(queries[i]);
listener.renderEnd(ctx);
}
for (String sql : batchSQL) {
ctx.sql(sql);
listener.prepareStart(ctx);
ctx.statement().addBatch(sql);
listener.prepareEnd(ctx);
ctx.sql(null);
}
listener.executeStart(ctx);
int[] result = ctx.statement().executeBatch();
int[] batchRows = ctx.batchRows();
for (int i = 0; i < batchRows.length && i < result.length; i++) batchRows[i] = result[i];
listener.executeEnd(ctx);
return result;
}// [#3427] ControlFlowSignals must not be passed on to ExecuteListners
catch (ControlFlowSignal e) {
throw e;
} catch (RuntimeException e) {
ctx.exception(e);
listener.exception(ctx);
throw ctx.exception();
} catch (SQLException e) {
ctx.sqlException(e);
listener.exception(ctx);
throw ctx.exception();
} finally {
Tools.safeClose(listener, ctx);
}
}
Aggregations