Well, yeah, the query is translated at the lower level of the stack,
so the generated SQL is not available from the query object directly.
You can probably intercept the generated SQL by wrapping DataSource/
Connection/PreparedStatement. Or maybe use Log4J API with a custom
Log4J appender for the QueryLogger logger. SQLException may or may
not contain the info you are looking for - worse checking of course.
Andrus
On Aug 18, 2006, at 8:04 AM, Andreas Pardeike wrote:
Hi,
I am trying to set up an error page in my web application that
sends error
details to me. I can easily get the stack trace and other variables
but
I can't the heck find out how to get the last query cayenne has
executed.
So far, I have managed to set up a DataContextDelegate that is
called for
every query but I cannot get it to store some valuable info from
the current
query.
What I want is to retrieve similar information as to what the
QueryLogger
writes into the log.
INFO QueryLogger: SELECT t0.SOMPR1, t0.SOMPR2, t0.SOM .. [bind....]
Is that possible?
Or is there an even easier way to retrieve information about the
querie
at the place where the SQLException is thrown by accessing the
exception
itself?
Thanks,
Andreas Pardeike
Here's my DataContextDelegate code in my global application object:
dataContext = DataContext.createDataContext();
dataContextDelegate = new DataContextDelegate()
{
public void finishedMergeChanges(DataObject object) {}
public void finishedProcessDelete(DataObject object) {}
public boolean shouldProcessDelete(DataObject object) { return
true; }
public boolean shouldMergeChanges(DataObject object, DataRow
snapshotInStore) { return true; }
private void store(String type, DataContext c, Query q)
{
// TODO - get and store info about the current query
// so it can be fetched later at the exception
displaying page
}
public org.objectstyle.cayenne.query.GenericSelectQuery
willPerformSelect(DataContext context,
org.objectstyle.cayenne.query.GenericSelectQuery query)
{
store("GenericSelectQuery", context, query);
lastQuery = query;
return query;
}
public Query willPerformQuery(DataContext context, Query query)
{
store("Query", context, query);
lastQuery = query;
return query;
}
public Query willPerformGenericQuery(DataContext context, Query
query)
{
store("GenericQuery", context, query);
lastQuery = query;
return query;
}
};
dataContext.setDelegate(dataContextDelegate);