Amita, Yes, I agree with this approach to solving the problem. Since Derby is a first-class DAS citizen, I confirm that it makes sense for it to have special code to ensure it works "out-of-the-box" with no special Config attribute. Thanks for persevering with this issue. Also, thanks in advance for your patch.
Regards, - Ron --- Amita Vadhavkar <[EMAIL PROTECTED]> wrote: > True, with the approach, DAS can use Metadata API > and treat Derby specially > (as > Derby Embedded Driver API returns FALSE, set it to > TRUE) > > 1) If provided in Config - it will be used, no > Metadata API check > 2) If not provided in Config - Metadata API check - > In this for Derby ALWAYS > SET TO TRUE, and for > anything else, set based on API return value. In > case of exception set to > FALSE. > 3) Also for existing test cases - default TRUE will > be assumed as they run > using Derby and will not fail > 4) For PostgreSQL - this approach will work as > Metadata API returns FALSE > for JDBC 3 compliant driver > 5) In case there is any driver used which is not > JDBC 3 compliant and the > API is absent, then > it will again be caught as exception and value set > to FALSE. > > Please see if there are any further places for > modification in the above. > > Regards, > Amita > > On 7/24/07, Ron Gavlin <[EMAIL PROTECTED]> wrote: > > > > Hi Amita, > > > > Since DAS has JDK 1.4 as a requirement and the > JDBC 3.0 APIs are built > > into JDK 1.4, isn't it sufficient to interpret a > JDBC 2.0 driver throwing > > a exception from supportsGetGeneratedKeys() as a > false. Also, since the DAS > > is currently a pre-1.0 release, I don't think our > solution needs to be > > driven by backwards-compatibility or whether test > cases get broken or not. > > From my perspective, the default case (the absence > of the attribute) should > > be driven by the JDBC driver's > DatabaseMetadata.supportsGetGeneratedKeys() > > value. The useGetGeneratedKeys attribute could be > explicitly set to true for > > cases like Derby where the driver's partial > support for this feature is > > sufficient for the needs of the DAS. In the case > of Oracle, they just > > started supporting getGeneratedKeys() in Oracle > 10g R2. It is not supported > > in earlier versions of the database or drivers. > So, using the > > DatabaseMetadata-driven approach, the DAS should > be able to support all > > Oracle versions out > > of the box with no special config attribute. In > the future, hopefully > > Derby will implement full getGeneratedKeys() > support and thus would not > > require special configuration within the DAS. My > two cents... > > > > - Ron > > > > ----- Original Message ---- > > From: Amita Vadhavkar <[EMAIL PROTECTED]> > > To: [EMAIL PROTECTED]; > [email protected] > > Sent: Tuesday, July 24, 2007 8:56:36 AM > > Subject: Re: Flexibility in supporting JDBC's > > Statement.RETURN_GENERATED_KEYS in RDB DAS > (JIRA-1417) > > > > Hi, > > Below are some details about the solution for > JIRA-1353. > > Please review the patch. > > > > http://issues.apache.org/jira/browse/DERBY-242 - > indicates that for > > 10.1.1.0, > > > > DatabaseMetadata.supportsGetGeneratedKeys() > returns false. Also, checked > > that for the current Maven Repo's Derby version > (10.1.2.1) same is > > happening. > > > > DatabaseMetadata.supportsGetGeneratedKeys() is not > available in JDBC 2.0. > > (We can catch exception if it is thrown in the > supports...() , but we can > > not detect > > cases like above - Derby) > > > > So, using > DatabaseMetadata.supportsGetGeneratedKeys() (when > config > > attribute > > is not set) > > may not be reliable in all cases. > > > > To keep the fix simple and also not to break > existing test cases (which > > assume default > > TRUE), the following is changed in patch > > > > 1) New <Config> attribute > > <xsd:attribute name="useGetGeneratedKeys" > type="xsd:boolean" > > default="true"/> > > > > 2) Default to TRUE - so old test cases and old > configs continue to work > > > > 3) Remove vendor name hardcoding logic to set flag > useGetGeneratedKeys > > > > So, in effect, with this patch (JIRA-1353) user > will get an option to pass > > FALSE, when it is > > sure that the dbms driver in use does not support > this feature. Thus, > > instead of hardcoding vendor names (without driver > versions), the > > responsibility is given to user to pass FALSE when > needed. > > > > Have tested this fix on Derby, DB2, MySQL and > PostgreSQL. Also, new > > testcases (6) added - CheckSupportGeneratedKeys > > > > example Config XML using the above attribute (say > for PostgreSQL), the XML > > will look as > > > > > below-------------------------------------------------------------------------------------------- > > <Config > xmlns="http:///org.apache.tuscany.das.rdb/config.xsd"; > > useGetGeneratedKeys="false"> > > </Config> > > > > > -------------------------------------------------------------------------------------------------- > > User will need to pass the Config during creation > of DAS instance. > > DAS.FACTORY.createDAS(config, getConnection()) > > or > > DAS.FACTORY.createDAS(config) > > or > > DAS.FACTORY.createDAS(InputStream > configStream) > > > > The value of the attrib can be true/false. And > Driver may/may not support > > GeneratedKeys. > > Based on this, following situations can arrive- > > > > A> Driver supports GeneratedKeys > > 1]Table is created with one column having > GENERATED ALWAYS AS IDENTITY > > clause, > > Irrespective of value of useGetGeneratedKeys flag, > insert command will > > succeed > > > > true flag value - insert.getGeneratedKey() will > return key value > > > > false flag value - insert.getGeneratedKey() will > throw RuntimeException - > > "Could not obtain generated key!" > > > > 2]Table is created with no column having GENERATED > ALWAYS AS IDENTITY > > clause, > > Irrespective of value of useGetGeneratedKeys flag, > insert command will > > succeed > > > > true flag value - insert.getGeneratedKey() - how > should it behave? In case > > of Derby it is returning wrong results. > > > > false flag value - insert.getGeneratedKey() will > throw RuntimeException - > > "Could not obtain generated key!" > > > > B> Driver does not support GeneratedKeys (say > PostgreSQL) - tested with a > > test client - > > 1]Table can be created with no column having > GENERATED === message truncated === --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
