Which version of Racket are you using? I think Ryan pushed some custodian related improvements to the db library recently. <div><br><div>Robby<span></span><br><br>On Friday, December 26, 2014, Dmitry Pavlov <<a href="mailto:dpavlov@ipa.nw.ru">dpavlov@ipa.nw.ru</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
Let us say I put this program into DrRacket's Definitions window:<br>
<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
#lang racket<br>
(require db)<br>
<br>
(define path "aaa.db")<br>
<br>
(when (file-exists? path)<br>
  (delete-directory/files path))<br>
<br>
(define conn (sqlite3-connect #:database path #:mode 'create))<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
<br>
and then press the "Run" button. After that, I play with conn<br>
in the Interactions window. When I have played enough,<br>
I press the "Run" button again. Here is what I get:<br>
<br>
delete-file: cannot delete file<br>
  path: [...]\aaa.db<br>
  system error: Permission denied; errno=13<br>
<br>
The reason is that I forgot to (disconnect conn) in the end.<br>
(I get that only on Windows; Linux is OK with removing opened files).<br>
<br>
How do I disconnect automatically? Putting the (disconnect conn)<br>
into the Definitions window is not a solution, as I want to use<br>
conn in the Interactions (also I want to be safe against the<br>
"Stop" button pressed in the middle of the program before the<br>
disconnect happens)<br>
<br>
I tried to use a will executor:<br>
<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
(define an-executor (make-will-executor))<br>
(void<br>
   (thread<br>
    (lambda ()<br>
      (let loop ()<br>
        (will-execute an-executor)<br>
        (loop)))))<br>
<br>
(define (executor-proc v) (printf "I am now garbage\n") (disconnect v))<br>
(will-register an-executor conn executor-proc)<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
<br>
Surprisingly, it did not work for the database connection (while it<br>
does work for other kinds of objects), and I have no idea why. It<br>
does not work even with I call the GC explicitly:<br>
<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
(set! conn #f)<br>
(collect-garbage)<br>
------------------------------<u></u>------------------------------<u></u>-----<br>
<br>
Is it possible to make the will executor work?<br>
Generally speaking, what is the recommended way to do this kind<br>
of thing?<br>
<br>
<br>
Best regards,<br>
<br>
Dmitry<br>
<br>
____________________<br>
 Racket Users list:<br>
 <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/<u></u>users</a><br>
</blockquote></div></div>