db/sqlite3: add support for loading extensions

This commit is contained in:
Ryan Culpepper 2018-04-03 03:06:24 +02:00
parent 1e40af55bc
commit aadbe1a7d2
2 changed files with 33 additions and 1 deletions

View File

@ -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)

View File

@ -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))