filed as:
https://issues.apache.org/jira/browse/SYNAPSE-457
2008/10/2 Indika Kumara <[EMAIL PROTECTED]>
> Hi Harm
>
> Yes, Harm, you are correct. With using current DB report , DB lookup
> combination , there is no thread safe manner (clear) to retrieve latest
> insert record's identity other than workarounds such as you did.
> It may need a new abstraction, a DB report with return value (Currently, DB
> report has void behavior), where return value can be explicitly specify by a
> separate statement.
>
> It is great, if you could create a JIRA for this as an improvement. :-)
>
> Thanks
> Indika
> Harm Verhagen wrote:
>
> Hi,
>
> I am seeing a similar problem when using mysql as db backend.
> *How to get the ID of a NEWLY INSERTED ROW ?*
>
> *problem:*
> - I insert a new fow in a table with the dbreport module. It gets a new
> id. (it is an AUTO_INCREMENT variable).
> - further in my sequence, and in the 'out' sequence I need to update that
> row in the table, using the id.
> I couldn't find a clean (and threadsafe!!!) way to get the newly created id
> with wso2.
>
> The wso2 samples don't address this problem.
>
> mysql provides a function LAST_INSERT_ID() to get the newly inserted ID.
> However that can only be used in the *_same_* transaction.
> So I can use LAST_INSERT_ID() in the _same_ dbreport module (as 2nd or 3rd
> sql statement). However dbreport mediator CANNOT save this to a variable.
> (only dblookup can).
> A following dblookup mediator can however NOT use LAST_INSERT_ID() (it
> always returns zero, as this is a new db transaction).
> dblookup could do some MAX like magic... but thatis not threadsafe.
>
> *workaround*
> I found a (but-ugly) workaround:
> dbreport:
> sql1: insert into ..... (store my new row... creates a new
> ID).
> sql2: insert into transaction_uuid(id, uuid)
> values(LAST_INSERT_ID(),?)
> param:
> get-property('MessageID') (store the newly created ID in a
> new temp table, using the uuid of the message)
> dblookup: select id from transaction_uuid where uuid = ?
> param: get-property('MessageID')
> result: transaction_id (
> read the newly created id from the temp table, store it in a variable).
> dbreport: delete from transaction_uuid where id = ?
> param: get-property('transaction_id') (delete
> the temp table).
>
> From here on I can use get-property('transaction_id') to update the row in
> the same sequence, (and in the answer sequence).
>
> I would expect however that I can do the above with _one_ single dbreport
> mediator. Insert the new field, and store the id in
> set-property('transaction_id').
> I didn't measure my workaround but it must be slow. (the hole temp table
> should be unneeded, the above contains 3 unneeded db accesses and 2
> unneeded mediators).
>
> Do you see any way how wso2 could cleanly support this ? (Maybe an
> extension to the dbreport module ?)
>
> Regards,
> Harm
>
>
> 2008/10/2 Indika Kumara <[EMAIL PROTECTED]>
>
>> Here, you had done two wrongs
>>
>> 1) The IDENTITY_VAL_LOCAL function has no input parameters.
>> But, you have tried to set parameters – That is why you get exception.
>>
>> 2) You have called it in db report mediator. DB report mediator use
>> to add /update record …simply uses executeUpdate(). But values
>> IDENTITY_VAL_LOCAL() is for retrieving latest inserted record identity and
>> will throws errors.
>>
>> Please use values IDENTITY_VAL_LOCAL() with DB LookUp mediator
>> Thanks
>> Indika
>>
>> Schmilinsky, Remsy wrote:
>>
>> Thanks. I am trying to get the generated id after insert, I'm using
>> derby, with 'values IDENTITY_VAL_LOCAL()' in a second sql but doesn't work,
>> are these incompatible functions ?
>>
>> 2008-10-01 13:47:14,790 [169.254.7.221-WH24CU6052] [jms-Worker-1] ERROR
>> DBReportMediator Error execuring insert statement : values
>> IDENTITY_VAL_LOCAL() against DataSource :
>> jdbc:derby://localhost:1527/esbdb;create=false
>> java.sql.SQLException: The column position '1' is out of range. The
>> number of columns for this ResultSet is '0'.
>> at
>> org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown
>> Source)
>> at org.apache.derby.client.am.SqlException.getSQLException(Unknown
>> Source)
>> at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown
>> Source)
>>
>> the insert statement alone works though.
>>
>> here dbreport config, for the moment I assign value 1 to test it out:
>>
>> <syn:dbreport>
>> <syn:connection>
>> <syn:pool>
>>
>> <syn:driver>org.apache.derby.jdbc.ClientDriver</syn:driver>
>> <syn:password>esb</syn:password>
>> <syn:user>esb</syn:user>
>>
>> <syn:url>jdbc:derby://localhost:1527/esbdb;create=false</syn:url>
>> </syn:pool>
>> </syn:connection>
>> <syn:statement>
>> <syn:sql><![CDATA[insert into sample values (DEFAULT,
>> ?)]]></syn:sql>
>> <syn:parameter xmlns:ns1="http://org.apache.synapse/xsd"
>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
>> expression="//*/*" type="VARCHAR"/>
>> </syn:statement>
>> <syn:statement>
>> <syn:sql><![CDATA[values IDENTITY_VAL_LOCAL()]]></syn:sql>
>> <syn:parameter value="1" type="INTEGER"/>
>> </syn:statement>
>> </syn:dbreport>
>>
>> remsy
>>
>> -----Original Message-----
>> *From:* [EMAIL PROTECTED] [
>> mailto:[EMAIL PROTECTED] <[EMAIL PROTECTED]>]*On
>> Behalf Of *Indika Kumara
>> *Sent:* October 1, 2008 1:21 PM
>> *To:* [email protected]
>> *Subject:* Re: [esb-java-user] dbreport question
>>
>> Hi Remsy
>>
>> All the samples in [1] show a scenario somewhat similar to your scenario
>> (I believe). In those samples, get an ID from DB and set it as message
>> context property
>> and then perform conditional switching based on the value of that
>> property. On the out path, some result form response is stored in the DB
>> too.
>> By going through [2], it will be easy to understand the current behavior
>> of the DB -mediators
>>
>>
>> [1]
>> http://wso2.org/project/esb/java/1.7.1/docs/ESB_Samples.html#DBMediators
>>
>> [2]
>> http://wso2.org/project/esb/java/1.7.1/docs/ESB_Configuration_Language.html#dblookup
>>
>> Thanks
>> Indika
>> Schmilinsky, Remsy wrote:
>>
>> I need ro propagate the result of a query (id number) from dbreport to the
>> mediators along with the message.
>>
>> The idea is that the mediators will perform some actions on the message and
>> then log results in the db, so we need the id to reference the original data.
>>
>> is this possible ? how ?
>>
>> thanks
>>
>> Remsy
>>
>> _______________________________________________
>> Esb-java-user mailing [EMAIL
>> PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>>
>> ------------------------------
>>
>>
>> No virus found in this incoming message.
>> Checked by AVG - http://www.avg.com
>> Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008
>> 7:25 PM
>>
>>
>>
>>
>> ------------------------------
>>
>> _______________________________________________
>> Esb-java-user mailing [EMAIL
>> PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>>
>> ------------------------------
>>
>>
>> No virus found in this incoming message.
>> Checked by AVG - http://www.avg.com
>> Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008
>> 7:25 PM
>>
>>
>>
>>
>>
>> _______________________________________________
>> Esb-java-user mailing list
>> [email protected]
>> http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>>
>>
> ------------------------------
>
> _______________________________________________
> Esb-java-user mailing [EMAIL
> PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>
> ------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com
> Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008
> 7:25 PM
>
>
>
>
>
> _______________________________________________
> Esb-java-user mailing list
> [email protected]
> http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>
>
_______________________________________________
Esb-java-user mailing list
[email protected]
http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user