Re: jdbc bug/feature? - Mailing list pgsql-jdbc

From Barry Lind
Subject Re: jdbc bug/feature?
Date
Msg-id 3DDBC908.4040306@xythos.com
Whole thread Raw
In response to Re: jdbc bug/feature?  (Marko Štrukelj <strukelj@parsek.net>)
List pgsql-jdbc
Marko,

You are correct.  It was a copy-paste error.  I will fix it up today.
Thanks for the quick code review.

--Barry

Marko Štrukelj wrote:
>
> I think the code is still buggy. Specifically:
>
>
> The following lines do not restore state:
>
>             //restore state of statement
>                     String[] m_sqlFragments = l_origSqlFragments;
>                         Object[] m_binds = l_origBinds;
>                         String[] m_bindTypes = l_origBindTypes;
>
>
> You are allocating new local variables here and you are setting them
> instead of inherited variables. I'm sure it's a copy-paste typo :)
> Should be like this:
>
>                     this.m_sqlFragments = l_origSqlFragments;
>                         this.m_binds = l_origBinds;
>                         this.m_bindTypes = l_origBindTypes;
>
>
>
> regards,
>
> -Marko
>
>
>  > -----Original Message-----
>  > From: Barry Lind [mailto:blind@xythos.com]
>  > Sent: Wednesday, November 20, 2002 9:08 AM
>  > To: Marko Štrukelj
>  > Cc: 'pgsql-jdbc@postgresql.org'
>  > Subject: Re: [JDBC] jdbc bug/feature?
>  >
>  >
>  > Marko,
>  >
>  > I checked in a fix for this problem.  It should appear in 7.3RC2 this
>  > weekend.
>  >
>  > thanks,
>  > --Barry
>  >
>  >
>  > Marko Štrukelj wrote:
>  > >
>  > > Hello,
>  > >
>  > > There is a bug (I say) or a lack of proper functionality in
>  > JDBC driver
>  > > regarding batch updates.
>  > >
>  > > The following code is expected to work by some library that
>  > I use and it
>  > > does work with inet tds driver for M$ SQL server. It
>  > however does not
>  > > work with the latest jdbc from cvs or anything older than
>  > that either.
>  > >
>  > >
>  > > PreparedStatements st = c.prepareStatement("insert into my_table
>  > > (field1, field2) values (?, ?)");
>  > >
>  > > // we have say 30 inserts to do
>  > > Iterator it = inserts.iterator();
>  > > int i=0;
>  > > while(it.hasNext()) {
>  > >
>  > >         // there is a maximum batch size of 15, so we must
>  > periodically
>  > > execute it
>  > >         if(i==batchMax) {
>  > >                 st.executeBatch();
>  > >                 i=0;
>  > >
>  > >                 // the problem - after this call a
>  > PreparedStatement is
>  > > empty and consequtive binds fail
>  > >         }
>  > >
>  > >         Object [] binds = (Object [])it.next();
>  > >         st.setString(binds[0]);
>  > >         st.setString(binds[1]);
>  > >         st.addBatch();
>  > >         i++;
>  > > }
>  > >
>  > >
>  > >
>  > > Upon some research I discovered the problem and found a very simple
>  > > solution:
>  > >
>  > > In org.postgresql.jdbc2.AbstractJdbc2Statement:
>  > >
>  > >         public int[] executeBatch() throws SQLException
>  > >         {
>  > > System.out.println("### executeBatch");
>  > >                 if (batch == null)
>  > >                         batch = new Vector();
>  > >                 int size = batch.size();
>  > >                 int[] result = new int[size];
>  > >                 int i = 0;
>  > >
>  > > // >>> added
>  > >                 // save m_binds and m_sqlFragments because
>  > > executeUpdate(String) will destroy them
>  > >                 String [] oldFrags = m_sqlFragments;
>  > >                 Object [] oldMBinds = m_binds;
>  > > // <<
>  > >
>  > >                 try
>  > >                 {
>  > >                         for (i = 0;i < size;i++)
>  > >                                 result[i] =
>  > > this.executeUpdate((String)batch.elementAt(i));
>  > >
>  > >                 }
>  > >                 catch (SQLException e)
>  > >                 {
>  > >                         int[] resultSucceeded = new int[i];
>  > >                         System.arraycopy(result, 0,
>  > resultSucceeded, 0, i);
>  > >
>  > >                         PBatchUpdateException updex =
>  > >                                 new
>  > > PBatchUpdateException("postgresql.stat.batch.error",
>  > >
>  >
>  > >           new Integer(i), batch.elementAt(i), resultSucceeded);
>  > >
>  > >                         updex.setNextException(e);
>  > >
>  > >                         throw updex;
>  > >                 }
>  > >                 finally
>  > >                 {
>  > >                         batch.removeAllElements();
>  > > // >> added
>  > >                         // restore m_binds and m_sqlFragments
>  > >                         m_sqlFragments = oldFrags;
>  > >                         m_binds = oldMBinds;
>  > > // <<
>  > >                 }
>  > >                 return result;
>  > >         }
>  > >
>  > >
>  > >
>  > >
>  > > Please consider this as a bug, and patch it in cvs. I did
>  > not test this
>  > > very well, so the described patch may possibly cause some
>  > incosistencies
>  > > somewhere - the people who wrote that class will know best.
>  > It does work
>  > > for my case though.
>  > >
>  > >
>  > > And thanks for PostgreSQL, I've just started using it and I love it.
>  > >
>  > >
>  > >
>  > > - Marko
>  > >
>  >
>  >
>  >
>  > ---------------------------(end of
>  > broadcast)---------------------------
>  > TIP 4: Don't 'kill -9' the postmaster
>  >
>




pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: default values
Next
From: Barry Lind
Date:
Subject: Re: streaming result sets: progress