Database interface
Tim Docker
timd@macquarie.com.au
Thu, 14 Aug 2003 18:50:29 +1000
Tom Pledger writes:
> | > doquery :: (DeepSeq v) =>
> | > Process -> String -> IO v -> IO [v]
> |
> | Can you explain what the constraint does here?
>
> Yes. It soothes my superstitious fears about unsafeInterleaveIO.
>
> I imagined that:
>
> - doquery (like getContents) uses unsafeInterleaveIO to make the
> resulting list lazy, i.e. avoid grabbing all the rows at the
> outset,
Actually no. I'm not sure of the correct terminology
here, but my implementation was strict wrt to reading
from the database - all records are read during the IO
action, and not secretly later on.
Whilst I can see some benefits of reading the records
lazily, wouldn't this result in problems with database
connection management, locks, transactions, etc. From
reading the list, it sounds like equivalent issues crop
up pretty regularly with getContents.
If you used the fold variant,
doquery :: Process -> String -> (a -> b -> IO b) -> b -> IO b
where the folding function returns an IO action, then
you could process rows as you go in any case, without
requiring unsafeInterleaveIO.
Tim