Couple of things -

   1. Your dataSource is probably in readOnly mode. It is possible to fire
   updates, by specifying readOnly="false" in your dataSource.
   2. What you are trying achieve, is typically done using a "select for
   update". For MySql, here's the documentation -
   http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
   3. You don't need to create a separate "entity" for firing updates.
   Writing a database procedure might be a good idea. In that case your query
   will simply be  <entity name="mainEntity" query="call MyProcedure();" .../>.
   All the heavy lifting can be done by this query.

Moreover, update queries, only return the number of rows affected and not a
resultSet. DIH expects one and hence the exception.

Cheers
Avlesh

On Tue, Aug 4, 2009 at 1:49 AM, Jay Hill <jayallenh...@gmail.com> wrote:

> Is it possible for the DataImportHandler to update records in the table it
> is querying? For example, say I have a query like this in my entity:
>
> query="select field1, field2, from someTable where hasBeenIndexed=false"
>
> Is there a way I can mark each record processed by updating the
> hasBeenIndexed field? Here's a config I tried:
>
> <?xml version="1.0"?>
> <dataConfig>
>    <dataSource
>       type="JdbcDataSource"
>       driver="com.mysql.jdbc.Driver"
>       url="jdbc:mysql://localhost:3306/solrhacks"
>       user="user"
>       password="pass"/>
>
>  <document name="testingDIHupdate">
>    <entity name="mainEntity"
>            pk="id"
>            query="select id, name from tableToIndex where
> hasBeenIndexed=0">
>      <field column="id" template="dihTestUpdate-${main.id}"/>
>      <field column="name" name="name"/>
>
>      <entity name="updateEntity"
>              pk="id"
>              query="update tableToIndex set hasBeenIndexed=1 where
> id=${mainEntity.id}">
>      </entity>
>    </entity>
>  </document>
> </dataConfig>
>
> It does update the first record, but then an Exception is thrown:
> Aug 3, 2009 1:15:24 PM org.apache.solr.handler.dataimport.DocBuilder
> buildDocument
> SEVERE: Exception while processing: mainEntity document :
> SolrInputDocument[{id=id(1.0)={1}, name=name(1.0)={John Jones}}]
> org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to
> execute query: update tableToIndex set hasBeenIndexed=1 where id=1
> Processing Document # 1
>    at
>
> org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:250)
>    at
>
> org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:207)
>    at
>
> org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:40)
>    at
>
> org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:58)
>    at
>
> org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:71)
>    at
>
> org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:237)
>    at
>
> org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:344)
>    at
>
> org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:370)
>    at
>
> org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:225)
>    at
> org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:167)
>    at
>
> org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:333)
>    at
>
> org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:393)
>    at
>
> org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:372)
> Caused by: java.lang.NullPointerException
>    at
>
> org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:248)
>    ... 12 more
>
>
> -Jay
>

Reply via email to