You can get DataDomain directly from ServerRuntime:
DataDomain domain = runtime.getDataDomain();
even better - you can get direct access to DataSource:
DataSource ds = runtime.getDataSource("mynodename");
So in 3.1 with DI various stack objects are a bit closer to your application.
Andrus
On Nov 14, 2011, at 2:55 PM, Marco Gattei wrote:
> Hi everyone....
>
> i'm tryng to write a translator from implementing select count(*) from a
> Select Query with an Expression built at runtime via ExpressionFactory.
>
> In cayenne 2.0 i was using something like:
>
> static class CountTranslator extends SelectTranslator {
>
> @Override
>
> public String createSqlString() throws Exception {
>
> String sql = super.createSqlString();
>
> int index = sql.indexOf(" FROM ");
>
> return "SELECT COUNT(*)" + sql.substring(index);
>
> }
>
> }
>
> public int count(SelectQuery query,
>
> DataNode node) {
>
> CountTranslator translator = new CountTranslator();
>
> translator.setQuery(query);
>
> translator.setAdapter(node.getAdapter());
>
>
> translator.setEntityResolver(DataContext.getThreadDataContext().getEntityResolver());
>
>
>
>
> Connection con = null;
>
> PreparedStatement stmt = null;
>
> try {
>
> con = node.getDataSource().getConnection();
>
> translator.setConnection(con);
>
> stmt = translator.createStatement();
>
> ResultSet rs = stmt.executeQuery();
>
> if (rs.next()) {
>
> return rs.getInt(1);
>
> }
>
> throw new org.apache.cayenne.CayenneRuntimeException("Count query
> returned no result");
>
> } catch (Exception e) {
>
> throw new CayenneRuntimeException("Cannot count", e);
>
> } finally {
>
> try {
>
> if (stmt != null) {
>
> stmt.close();
>
> }
>
> if (con != null) {
>
> con.close();
>
> }
>
> } catch (Exception ex) {
>
> throw new CayenneRuntimeException("Cannot close connection",
> ex);
>
> }
>
> }
>
> }
>
>
>
> the only thing i nedeed was to get the current connection from the context
> which i did using something like
>
>
> DataContext.getThreadDataContext().getParentDataDomain().getDataNodes().iterator().next()
>
>
> but now in Cayenne 3.1 this method seems to be invalid 'cause i cannot get
> ParentDataDomain from ObjectContext.
> Besides that this works only if have a datanode set for the domain.
> Is there any other or better way to proceed?
>
> Thanks, Marco
>
>
>
>