db/sqlite3: add support for loading extensions
This commit is contained in:
parent
1e40af55bc
commit
aadbe1a7d2
|
@ -1,5 +1,6 @@
|
|||
#lang racket/base
|
||||
(require racket/class
|
||||
ffi/file
|
||||
ffi/unsafe
|
||||
ffi/unsafe/atomic
|
||||
ffi/unsafe/custodian
|
||||
|
@ -10,7 +11,10 @@
|
|||
"ffi.rkt"
|
||||
"dbsystem.rkt")
|
||||
(provide connection%
|
||||
handle-status*)
|
||||
handle-status*
|
||||
(protect-out unsafe-load-extension))
|
||||
|
||||
(define-local-member-name unsafe-load-extension)
|
||||
|
||||
;; == Connection
|
||||
|
||||
|
@ -359,6 +363,18 @@
|
|||
|
||||
;; ----
|
||||
|
||||
(define/public (unsafe-load-extension who lib)
|
||||
(define lib-path (cleanse-path (path->complete-path lib)))
|
||||
(security-guard-check-file who lib-path '(read execute))
|
||||
(call-with-lock who
|
||||
(lambda ()
|
||||
(HANDLE who (A (sqlite3_enable_load_extension -db 1)))
|
||||
(HANDLE who (A (sqlite3_load_extension -db lib-path)))
|
||||
(HANDLE who (A (sqlite3_enable_load_extension -db 0)))
|
||||
(void))))
|
||||
|
||||
;; ----
|
||||
|
||||
(define-syntax HANDLE
|
||||
(syntax-rules ()
|
||||
[(HANDLE who expr)
|
||||
|
|
|
@ -222,3 +222,19 @@
|
|||
(define-sqlite sqlite3_last_insert_rowid
|
||||
(_fun _sqlite3_database
|
||||
-> _int64))
|
||||
|
||||
;; ----------------------------------------
|
||||
|
||||
(define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005) ;; int int*
|
||||
|
||||
(define-sqlite sqlite3_db_config
|
||||
(_fun _sqlite3_database _int _int (out : (_ptr o _int))
|
||||
-> (r : _int) -> r)) ;; FIXME: return out?
|
||||
|
||||
(define-sqlite sqlite3_enable_load_extension
|
||||
(_fun _sqlite3_database _int -> _int))
|
||||
|
||||
(define-sqlite sqlite3_load_extension
|
||||
;; FIXME: handle error string?
|
||||
(_fun _sqlite3_database _path (_pointer = #f) (_pointer = #f)
|
||||
-> _int))
|
||||
|
|
Loading…
Reference in New Issue
Block a user