download-sqlite.scm
(module download-sqlite mzscheme
  (require (lib "url.ss" "net")
           (lib "port.ss")
           (lib "file.ss")
           (planet "unzip.ss" ("dherman" "zip.plt")))
  
  (define FORCE-DOWNLOAD-OF-SQLITE-DLL? (make-parameter #f))
  (define FILENAME-FOR-SQLITE-DLL       (make-parameter "libsqlite3.dll"))
  
  (define WINDOWS-DLL-ZIP-URL 
    (make-parameter 
     (string->url 
      "http://www.sqlite.org/sqlitedll-3_3_2.zip"
      ;"http://www.sqlite.org/sqlitedll-3_2_8.zip"
      )))
  
  ; download sqlite3.dll to current-directory
  (define (download-sqlite)
    (define temp "temporary-dir-to-download-sqlite")
    (when (or (not (file-exists? (FILENAME-FOR-SQLITE-DLL)))
              (FORCE-DOWNLOAD-OF-SQLITE-DLL?))
      (make-directory* temp)
      (current-directory temp)
      ; download sqlite
      (let ([in-port (get-pure-port (WINDOWS-DLL-ZIP-URL))])
        (call-with-output-file "sqlite.zip"
          (lambda (out-port)
            (copy-port in-port out-port))
          'replace)
        (close-input-port in-port))
      ; unzip it
      (when (directory-exists? temp)
        (delete-directory/files temp))
      (call-with-input-file "sqlite.zip"
        (lambda (in-port)
          (unzip in-port)))
      ; copy it to parent directory
      (call-with-input-file "sqlite3.dll"
        (lambda (in)
          (call-with-output-file* (build-path ".." (FILENAME-FOR-SQLITE-DLL))
                                  (lambda (out)
                                    (copy-port in out))
                                  'replace)))
      ; clean up
      (current-directory "..")
      (delete-directory/files temp)))
  
  ;; -----------------
  ;; Do it!
  
  (download-sqlite))