From aadbe1a7d2af5a20d19d4097cabfa458350808b6 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Tue, 3 Apr 2018 03:06:24 +0200 Subject: [PATCH] db/sqlite3: add support for loading extensions --- .../collects/db/private/sqlite3/connection.rkt | 18 +++++++++++++++++- racket/collects/db/private/sqlite3/ffi.rkt | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/racket/collects/db/private/sqlite3/connection.rkt b/racket/collects/db/private/sqlite3/connection.rkt index a51f0fd1a2..9ecd7a4632 100644 --- a/racket/collects/db/private/sqlite3/connection.rkt +++ b/racket/collects/db/private/sqlite3/connection.rkt @@ -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) diff --git a/racket/collects/db/private/sqlite3/ffi.rkt b/racket/collects/db/private/sqlite3/ffi.rkt index 2da349fe35..29831d59e0 100644 --- a/racket/collects/db/private/sqlite3/ffi.rkt +++ b/racket/collects/db/private/sqlite3/ffi.rkt @@ -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))