db/sqlite3: add support for loading extensions
This commit is contained in:
parent
1e40af55bc
commit
aadbe1a7d2
|
@ -1,5 +1,6 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
(require racket/class
|
(require racket/class
|
||||||
|
ffi/file
|
||||||
ffi/unsafe
|
ffi/unsafe
|
||||||
ffi/unsafe/atomic
|
ffi/unsafe/atomic
|
||||||
ffi/unsafe/custodian
|
ffi/unsafe/custodian
|
||||||
|
@ -10,7 +11,10 @@
|
||||||
"ffi.rkt"
|
"ffi.rkt"
|
||||||
"dbsystem.rkt")
|
"dbsystem.rkt")
|
||||||
(provide connection%
|
(provide connection%
|
||||||
handle-status*)
|
handle-status*
|
||||||
|
(protect-out unsafe-load-extension))
|
||||||
|
|
||||||
|
(define-local-member-name unsafe-load-extension)
|
||||||
|
|
||||||
;; == Connection
|
;; == 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
|
(define-syntax HANDLE
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
[(HANDLE who expr)
|
[(HANDLE who expr)
|
||||||
|
|
|
@ -222,3 +222,19 @@
|
||||||
(define-sqlite sqlite3_last_insert_rowid
|
(define-sqlite sqlite3_last_insert_rowid
|
||||||
(_fun _sqlite3_database
|
(_fun _sqlite3_database
|
||||||
-> _int64))
|
-> _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