[Haskell] Re: ANN: HDBC (Haskell Database Connectivity)
Benjamin Franksen
benjamin.franksen at bessy.de
Mon Jan 9 05:33:12 EST 2006
On Monday 09 January 2006 10:03, Axel Simon wrote:
> On Sun, 2006-01-08 at 14:51 +0000, Keean Schupke wrote:
> > My solution to this when developing a database library for my own
> > use was to define the API
> > in a bracket notation style, and only provide safe functions. The
> > idea is that the function obtains the resource, calls a function
> > passed as an argument, then frees the resource, so all resouces are
> > guaranteed to be freed in the correct order... for example:
> >
> > dbConnectWith :: DbName -> (DbHandle -> IO Result) -> Result
> > dbConnectWith name workFn = do
> > handle <- dbConnectTo name
> > workFn handle `finally` dbDisconnect handle
> >
> > In this way you avoid finalizers... and everthing is safe providing
> > you only export the "with" style functions from the library...
> > Here's an example from the library, the connect function:
>
> I suppose you meant to write "result" rather than "Result". This
> style of functions is only safe if the user ensures that DbHandle is
> never returned as part of the result. You should have that in your
> documentation.
I wanted to mention this too, but you were quicker ;)
> As far as I can tell, the only general solution is to use finalizers
> and, if you really need to enforce a sequence of finialization,
> touchForeignPtr.
Repeat: touchForeignPtr can NOT be used to enforce finalization order.
> A practical issue with touchForeignPtr is that it
> cannot be conveniently called from another finalizer, since the
> latter live in C.
What do you mean "live in C"? Can't or shouldn't finalizers be written
in Haskell, too?
Ben
More information about the Haskell
mailing list