leaked ODBC statement handles

Lionel Elie Mamane lionel at mamane.lu
Wed Jul 18 07:25:21 PDT 2012


On Wed, Jul 18, 2012 at 09:55:21AM -0400, Terrence Enger wrote:

> (*) Do you agree that ODatabaseMetaDataResultSet ctor should warn if
>     it does not get a statement handle?

It never gets a statement handle as an argument, it allocates it by
calling _pConnection->createStatementHandle(). If the latter fails,
throw an exception, the ODatabaseMetaDataResultSet will be unusable
anyway.

> On Wed, 2012-07-18 at 05:15 +0200, Lionel Elie Mamane wrote:
>> On Tue, Jul 17, 2012 at 03:46:14PM -0400, Terrence Enger wrote:
>>> On Tue, 2012-07-17 at 19:08 +0200, Lionel Elie Mamane wrote:
>>>> On Mon, Jul 16, 2012 at 10:15:02PM -0400, Terrence Enger wrote:

>>>> (...) I can easily believe the code was leaking statement handles
>>>> in this way even back then (or

>>> Well, I can demonstrate at least a leak.  Removing m_bCloseHandle
>>> will of course fix the leak.  Still, I wonder if the leak could be
>>> a sign of a bug is client code somewhere.  Thoughts?

>> I'm not sure what you mean there.

> Something created a ODatabaseMetaDataResultSet.  Presumably the client
> code had some intended purpose for the object.  But the statement
> handle appeared in the ODBC log file only in SQLAllocHandle.  I
> conclude that the client code did not do very much; as the client code
> did not even free the handle, there is no sign that the client made a
> deliberate decision to abandon its purpose.  Hmm, that sounds like it
> could be a bug, or an opportunity for optimization, or an opportunity
> for simplification.

I understand "client code" as "code that creates a
ODatabaseMetaDataResultSet". That code cannot possibly free the
handle, because it cannot possibly know the handle, since it is a
private value of ODatabaseMetaDataResultSet. However, indeed it
creates a ODatabaseMetaDataResultSet and then does nothing with it, so
it could be an opportunity for simplification / optimisation, yes.

I've looked at the first 5 or so ODatabaseMetaDataResultSet ctor calls
in ODatabaseMetaData.cxx, they look like when they don't do anything
with the created ResultSet, it is an error fall-over, to just have an
empty ResultSet to give their caller, which seems reasonable.

But if you find a scenario where there is a more genuine "object
construction not needed here", that would be an interesting place to
look at, yes.

> (*) I confused ODatabaseMetaDataResultSet::dispose, which the dtor
>     calls, with ODatabaseMetaDataResultSet::disposing, which frees the
>     statement handle.  Sheesh, it's not as if the names differed in
>     only one letter, or something.

::dispose calls ::disposing; see cppu::OComponentHelper::dispose in
cppuhelper/source/component.cxx

-- 
Lionel


More information about the LibreOffice mailing list