From 88435da36bbff264ec13961c06b68560beb43de4 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 31 Dec 2013 06:42:14 -0700 Subject: [PATCH] db/odbc: make library-missing failure lazy --- pkgs/db-pkgs/db-lib/db/private/odbc/ffi.rkt | 36 +++++++++++---------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/pkgs/db-pkgs/db-lib/db/private/odbc/ffi.rkt b/pkgs/db-pkgs/db-lib/db/private/odbc/ffi.rkt index 92e7657980..e409940949 100644 --- a/pkgs/db-pkgs/db-lib/db/private/odbc/ffi.rkt +++ b/pkgs/db-pkgs/db-lib/db/private/odbc/ffi.rkt @@ -115,25 +115,26 @@ Docs at http://msdn.microsoft.com/en-us/library/ms712628%28v=VS.85%29.aspx (case (system-type) ((windows) ;; Windows ODBC defines wchar_t (thus WCHAR, thus SQLWCHAR) as 16-bit - (values (ffi-lib "odbc32.dll") + (values (ffi-lib "odbc32.dll" #:fail (lambda () #f)) 2)) ((macosx) ;; Mac OS X uses iodbc, which defines SQLWCHAR as wchar_t, as 32-bit - (values (ffi-lib "libiodbc" '("2" #f)) + (values (ffi-lib "libiodbc" '("2" #f) #:fail (lambda () #f)) 4)) ((unix) (cond [(member (path->string (system-library-subpath #f)) '("i386-openbsd" "x86_64-openbsd")) ;; OpenBSD uses iodbc - (values (ffi-lib "libiodbc" '("3.16" #f)) + (values (ffi-lib "libiodbc" '("3.16" #f) #:fail (lambda () #f)) 4)] [else ;; Other unixes use unixodbc, which defines WCHAR as 16-bit ;; for compat w/ Windows (even though Linux wchar_t is 32-bit) - (values (ffi-lib "libodbc" '("1" #f)) + (values (ffi-lib "libodbc" '("1" #f) #:fail (lambda () #f)) 2)])))) -(define-ffi-definer define-odbc odbc-lib) +(define-ffi-definer define-odbc odbc-lib + #:default-make-fail make-not-available) (define (ok-status? n) (or (= n SQL_SUCCESS) @@ -174,18 +175,19 @@ Docs at http://msdn.microsoft.com/en-us/library/ms712628%28v=VS.85%29.aspx -> (status : _sqlreturn) -> (values status value))) -(define SQLGetInfo-string - (get-ffi-obj "SQLGetInfo" odbc-lib - (_fun (handle info) :: - (handle : _sqlhdbc) - (info : _sqlusmallint) - (value : _bytes = (make-bytes 250)) - (250 : _sqlsmallint) - (len : (_ptr o _sqlsmallint)) - -> (status : _sqlreturn) - -> (values status - (and (ok-status? status) - (bytes->string/utf-8 value #f 0 len)))))) +(define-odbc SQLGetInfo-string + (_fun (handle info) :: + (handle : _sqlhdbc) + (info : _sqlusmallint) + (value : _bytes = (make-bytes 250)) + (250 : _sqlsmallint) + (len : (_ptr o _sqlsmallint)) + -> (status : _sqlreturn) + -> (values status + (and (ok-status? status) + (bytes->string/utf-8 value #f 0 len)))) + #:c-id SQLGetInfo) + (define-odbc SQLGetFunctions (_fun (handle : _sqlhdbc)