From 19ae1cd2dc28b83e0020819cd64bacbe541e960b Mon Sep 17 00:00:00 2001
From: Vasilij Schneidermann <mail@vasilij.de>
Date: Fri, 13 Aug 2021 14:32:10 +0200
Subject: [PATCH] Replace deprecated APIs

---
 sqlite3/3.7.2/sqlite3.scm | 42 ++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/sqlite3/3.7.2/sqlite3.scm b/sqlite3/3.7.2/sqlite3.scm
index 9d9440e..9be2faf 100644
--- a/sqlite3/3.7.2/sqlite3.scm
+++ b/sqlite3/3.7.2/sqlite3.scm
@@ -93,6 +93,7 @@
     database-memory-highwater
     enable-shared-cache!
     enable-load-extension!
+    load-extension!
   )
 
 (import
@@ -1070,27 +1071,36 @@ EOS
 ;; Enables (disables) the sharing of the database cache and schema data
 ;; structures between connections to the same database.
 (define (enable-shared-cache! enable?)
-  (cond-expand
-   [disable-shared-cache
-    #f]
-   [else
-    (cond
-     [((foreign-lambda sqlite3:status "sqlite3_enable_shared_cache" bool) enable?)
-      => (abort-sqlite3-error 'enable-shared-cache! #f)]
-     [else
-      enable?])]))
+  (error "Deprecated API"))
 
-;; Enables (disables) the loading of native extensions using SQL statements.
+;; Enables (disables) the loading of native extensions.
 (define (enable-load-extension! db enable?)
-  (cond-expand
-   [disable-load-extension
-    #f]
+  (define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION (foreign-value "SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION" int))
+  (cond
+   [((foreign-lambda sqlite3:status "sqlite3_db_config" sqlite3:database int bool (c-pointer int)) db SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION enable? #f)
+    => (abort-sqlite3-error 'enable-load-extension! db)]
    [else
+    enable?]))
+
+;; Loads a native extension.
+(define (load-extension! db path #!optional entry-point)
+  (let-location [(err c-pointer)
+                 (errlen int)]
     (cond
-     [((foreign-lambda sqlite3:status "sqlite3_enable_load_extension" sqlite3:database bool) db enable?)
-      => (abort-sqlite3-error 'enable-load-extension! db)]
+     [((foreign-lambda* c-string* ((sqlite3:database db) ((const c-string) path) ((const c-string) proc))
+         "char *errptr, *errstr;"
+         "if (sqlite3_load_extension(db, path, proc, &errptr) != SQLITE_OK) {"
+         " errstr = strdup(errptr);"
+         " sqlite3_free(errptr);"
+         " C_return(errstr);"
+         "}"
+         "C_return(NULL);")
+       db path entry-point)
+      => (lambda (err)
+           (abort (make-sqlite3-error-condition 'load-extension! err
+                                                'error path entry-point)))]
      [else
-      enable?])]))
+      (void)])))
 
 )
 
-- 
2.32.0

