db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-5872) Inconsistency between isWrapperFor() and unwrap() in logical statements
Date Sat, 21 Jul 2012 09:58:34 GMT

    [ https://issues.apache.org/jira/browse/DERBY-5872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13419788#comment-13419788
] 

Knut Anders Hatlen commented on DERBY-5872:
-------------------------------------------

The other implementations of isWrapperFor() and unwrap() in the logical classes (LogicalConnection40
and LogicalDatabaseMetaData40) work strictly at the logical level. That is, their unwrap()
methods behave the same way as in the statement classes, but their isWrapperFor() methods
don't. In those classes, isWrapperFor() returns true if and only if unwrap() would succeed,
and unwrap() succeeds if and only if the instance implements/extends the specified interface/class.
I think we should change the statement classes to behave the same way.
                
> Inconsistency between isWrapperFor() and unwrap() in logical statements
> -----------------------------------------------------------------------
>
>                 Key: DERBY-5872
>                 URL: https://issues.apache.org/jira/browse/DERBY-5872
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.4.1.3, 10.5.1.1, 10.6.1.0, 10.7.1.1, 10.8.1.2, 10.9.1.0
>            Reporter: Knut Anders Hatlen
>
> I noticed this when I refactored the logical statement classes in DERBY-5868. The isWrapperFor()
method forwards calls to the underlying physical statement, but the unwrap() method works
purely at the logical level.
> For example, if you produce a LogicalPreparedStatement40 instance with this code
>         ClientConnectionPoolDataSource ds = new ClientConnectionPoolDataSource();
>         ds.setDatabaseName("testdb");
>         ds.setCreateDatabase("create");
>         ds.setMaxStatements(10);
>         PooledConnection pc = ds.getPooledConnection();
>         Connection c = pc.getConnection();
>         PreparedStatement ps = c.prepareStatement("values 1");
> you'll see that
>         System.out.println(ps.isWrapperFor(LogicalPreparedStatement40.class));
> prints false, telling that ps is not a wrapper for LogicalPreparedStatement40. However,
trying to unwrap ps as a LogicalPreparedStatement succeeds:
>         LogicalPreparedStatement40 lps = ps.unwrap(LogicalPreparedStatement40.class);
> On the other hand
>         System.out.println(ps.isWrapperFor(PreparedStatement40.class));
> prints true, indicating that ps is a wrapper for PreparedStatement40, but trying to unwrap
it as one, fails:
>         PreparedStatement40 ps4 = ps.unwrap(PreparedStatement40.class);
> Exception in thread "main" java.sql.SQLException: Unable to unwrap for 'class org.apache.derby.client.am.PreparedStatement40'
> 	at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:108)
> 	at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:364)
> 	at org.apache.derby.client.am.LogicalStatementEntity.unwrap(LogicalStatementEntity.java:258)
> 	at org.apache.derby.client.am.LogicalPreparedStatement.unwrap(LogicalPreparedStatement.java:57)
> 	at Test.main(Test.java:37)
> Caused by: org.apache.derby.client.am.SqlException: Unable to unwrap for 'class org.apache.derby.client.am.PreparedStatement40'
> 	... 3 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message