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
> 
> 
> 
> 

Reply via email to