1.1--- a/lisp/ffi/rocksdb/opts.lisp Wed Dec 13 20:02:36 2023 -0500
1.2+++ b/lisp/ffi/rocksdb/opts.lisp Wed Dec 13 22:25:47 2023 -0500
1.3@@ -85,7 +85,7 @@
1.4
1.5 (define-opaque rocksdb-block-based-table-options)
1.6 (define-alien-routine rocksdb-block-based-options-create (* rocksdb-block-based-table-options))
1.7-(define-alien-routine rocksdb-block-based-options-destroy void (* rocksdb-block-based-table-options))
1.8+(define-alien-routine rocksdb-block-based-options-destroy void (self (* rocksdb-block-based-table-options)))
1.9
1.10 (define-alien-routine rocksdb-block-based-options-set-checksum void
1.11 (opt (* rocksdb-block-based-table-options)) (val char))
2.1--- a/lisp/ffi/rocksdb/pkg.lisp Wed Dec 13 20:02:36 2023 -0500
2.2+++ b/lisp/ffi/rocksdb/pkg.lisp Wed Dec 13 22:25:47 2023 -0500
2.3@@ -358,10 +358,9 @@
2.4
2.5 (in-package :rocksdb)
2.6
2.7-(eval-always
2.8- (defun load-rocksdb ()
2.9- (unless (member :rocksdb *features*)
2.10- (sb-alien:load-shared-object "librocksdb.so" :dont-save t)
2.11- (push :rocksdb *features*)))
2.12+(defun load-rocksdb ()
2.13+ (unless (member :rocksdb *features*)
2.14+ (sb-alien:load-shared-object "librocksdb.so" :dont-save t)
2.15+ (push :rocksdb *features*)))
2.16
2.17- (load-rocksdb))
2.18+(load-rocksdb)
3.1--- a/lisp/ffi/rocksdb/tests.lisp Wed Dec 13 20:02:36 2023 -0500
3.2+++ b/lisp/ffi/rocksdb/tests.lisp Wed Dec 13 22:25:47 2023 -0500
3.3@@ -2,7 +2,7 @@
3.4
3.5 ;;; Code:
3.6 (defpackage :rocksdb/tests
3.7- (:use :cl :std :rt :rocksdb :sb-ext))
3.8+ (:use :cl :std :rt :rocksdb :sb-ext :sb-alien))
3.9
3.10 (in-package :rocksdb/tests)
3.11
3.12@@ -43,6 +43,9 @@
3.13 (rocksdb-readoptions-destroy ropts)
3.14 (rocksdb-block-based-options-destroy bopts)))
3.15
3.16+(defun make-errptr ()
3.17+ (make-alien rocksdb-errptr))
3.18+
3.19 (deftest db-basic ()
3.20 "Test basic RocksDB functionality. Inserts KV pair into a temporary
3.21 DB where K and V are both Lisp strings."
3.22@@ -57,7 +60,7 @@
3.23 (ropts (rocksdb-readoptions-create)))
3.24 (with-alien ((k (* char) (make-alien char klen))
3.25 (v (* char) (make-alien char vlen))
3.26- (errptr rocksdb-errptr nil))
3.27+ (errptr (* (* t)) (make-errptr)))
3.28 ;; copy KEY to K
3.29 (setfa k key)
3.30 ;; copy VAL to V
3.31@@ -70,23 +73,23 @@
3.32 v
3.33 vlen
3.34 errptr)
3.35- (is (null-alien errptr))
3.36+ (is (null-alien (deref errptr)))
3.37 ;; get V from DB given K
3.38 (rocksdb:rocksdb-cancel-all-background-work db t)
3.39 (rocksdb-get db ropts k klen (make-alien size-t vlen) errptr)
3.40- (is (null-alien errptr))
3.41+ (is (null-alien (deref errptr)))
3.42 ;; copy V to RVAL and validate
3.43 (let ((rval (make-array vlen :element-type 'unsigned-byte)))
3.44 (loop for i from 0 below vlen do (let ((x (deref v i))) (setf (aref rval i) x)))
3.45 (is (string= (octets-to-string val) (concatenate 'string (map 'vector #'code-char rval)))))
3.46 ;; cleanup
3.47 (rocksdb-delete db wopts k klen errptr)
3.48- (is (null-alien errptr))
3.49+ (is (null-alien (deref errptr)))
3.50 (rocksdb-writeoptions-destroy wopts)
3.51 (rocksdb-readoptions-destroy ropts)
3.52 ;; final cleanup
3.53 (rocksdb-cancel-all-background-work db nil)
3.54 (rocksdb-close db)
3.55 (rocksdb-destroy-db opts path errptr)
3.56- (is (null-alien errptr))
3.57+ (is (null-alien (deref errptr)))
3.58 (rocksdb-options-destroy opts))))
4.1--- a/lisp/lib/rdb/obj.lisp Wed Dec 13 20:02:36 2023 -0500
4.2+++ b/lisp/lib/rdb/obj.lisp Wed Dec 13 22:25:47 2023 -0500
4.3@@ -58,11 +58,7 @@
4.4 :total-threads 4
4.5 :max-open-files 10000))
4.6
4.7-;;; rdb-cf
4.8-
4.9-;; NOTE: read-sequence and write-sequence now accept user-extended
4.10-;; sequences
4.11-
4.12+;;; bytes
4.13 (defclass rdb-bytes (sequence)
4.14 ((buffer :initarg :buffer :type (array unsigned-byte) :accessor rdb-bytes-buffer))
4.15 (:documentation "RDB unsigned-byte array. Implements the iterator protocol."))
4.16@@ -96,20 +92,31 @@
4.17
4.18 Values must be able to be encoded to and from (array unsigned-byte)."))
4.19
4.20+(defun make-rdb-val (val)
4.21+ "Convert VAL to an object of type RDB-VAL."
4.22+ (make-instance 'rdb-val :buffer val))
4.23+
4.24 (defclass rdb-key (rdb-bytes)
4.25 ()
4.26 (:documentation "RDB key protocol.
4.27
4.28 Keys must be able to be encoded to and from (array unsigned-byte)."))
4.29
4.30+(defun make-rdb-key (key)
4.31+ "Convert KEY to an object of type RDB-KEY."
4.32+ (make-instance 'rdb-key :buffer key))
4.33+
4.34 (defclass rdb-kv (rdb-bytes)
4.35 ((key :initarg :key :type rdb-key)
4.36 (val :initarg :val :type rdb-val)))
4.37
4.38-(defun make-rdb-key (key)
4.39- "Convert KEY to an object of type RDB-KEY."
4.40- (make-instance 'rdb-key :buffer key))
4.41+(defun make-rdb-kv (key val)
4.42+ "Generate a new RDB-KV pair."
4.43+ (make-instance 'rdb-kv
4.44+ :key (make-rdb-key key)
4.45+ :val (make-rdb-val val)))
4.46
4.47+;;; rdb-cf
4.48 (defstruct rdb-cf
4.49 "RDB Column Family structure. Contains a name, a cons of (rdb-key-type
4.50 . rdb-val-type), and a system-area-pointer to the underlying
4.51@@ -145,7 +152,7 @@
4.52 (setf (rdb-db self) nil))
4.53
4.54 (defmethod destroy-db ((self rdb))
4.55- (when (rdb-db self) (close-rdb self))
4.56+ (when (rdb-db self) (close-db self))
4.57 (destroy-db-raw (rdb-name self)))
4.58
4.59 (defmethod init-db ((self rdb))
5.1--- a/lisp/lib/rdb/pkg.lisp Wed Dec 13 20:02:36 2023 -0500
5.2+++ b/lisp/lib/rdb/pkg.lisp Wed Dec 13 22:25:47 2023 -0500
5.3@@ -38,7 +38,7 @@
5.4 :rdb :make-rdb
5.5 :rdb-db :rdb-name :rdb-cfs :rdb-opts
5.6 :rdb-bytes :rdb-bytes-buffer
5.7- :make-rdb-key :rdb-kv :rdb-key :rdb-val
5.8+ :make-rdb-key :make-rdb-kv :make-rdb-val :rdb-kv :rdb-key :rdb-val
5.9 :rdb-opts :make-rdb-opts
5.10 :default-rdb-opts
5.11 :rdb-cf :make-rdb-cf :create-cf
6.1--- a/lisp/lib/rdb/tests.lisp Wed Dec 13 20:02:36 2023 -0500
6.2+++ b/lisp/lib/rdb/tests.lisp Wed Dec 13 22:25:47 2023 -0500
6.3@@ -1,5 +1,5 @@
6.4 (defpackage :rdb/tests
6.5- (:use :cl :std :rt :rdb :rocksdb))
6.6+ (:use :cl :std :rt :rocksdb :rdb :sb-ext :sb-alien))
6.7
6.8 (in-package :rdb/tests)
6.9
6.10@@ -8,34 +8,33 @@
6.11
6.12 (rocksdb:load-rocksdb)
6.13
6.14-(defmacro with-test-db-raw ((db-var path) &body body)
6.15- `(let* ((opt (rdb::default-rocksdb-options))
6.16- (,db-var (open-db-raw ,path opt)))
6.17- (unwind-protect (progn ,@body)
6.18- (with-errptr e
6.19- (rocksdb-close ,db-var)
6.20- (rocksdb-destroy-db opt ,path e)))))
6.21+(defvar *rdb-test-opts* (rdb::default-rocksdb-options))
6.22+
6.23+(defun test-cleanup (db opt path)
6.24+ (with-errptr err
6.25+ (rocksdb-close db)
6.26+ (rocksdb-destroy-db opt path err)))
6.27
6.28 (deftest rdb ()
6.29 "Test RDB struct and methods."
6.30 (let ((db (make-rdb :name "/tmp/rdb" :opts (make-rdb-opts :create-if-missing t))))
6.31- (open-rdb db)
6.32+ (open-db db)
6.33 (put-kv-str-raw (rdb-db db) "key" "val")
6.34 (is (equal (get-kv-str-raw (rdb-db db) "key") "val"))
6.35 (let ((cfs (list (make-rdb-cf :name "foo") (make-rdb-cf :name "bar") (make-rdb-cf :name "baz"))))
6.36 (dolist (cf cfs)
6.37 (push-cf cf db)))
6.38- (init-cfs db)
6.39+ (init-db db)
6.40 (loop for cf across (rdb-cfs db)
6.41 do
6.42 (progn
6.43- (insert-kv-str db "key" "val" :cf (rdb-cf-name cf))
6.44+ (insert-kv db (make-rdb-kv "key" "val") :cf (rdb-cf-name cf))
6.45 (is (equal (get-cf-str-raw (rdb-db db) (rdb-cf-sap cf) "key") "val"))))
6.46 (rocksdb:rocksdb-cancel-all-background-work (rdb-db db) t)
6.47- (insert-kv-str db "test" "zaa")
6.48+ ;; (insert-kv-str db "test" "zaa")
6.49 ;; cleanup
6.50- (close-rdb db)
6.51- (destroy-rdb db)))
6.52+ (close-db db)
6.53+ (destroy-db db)))
6.54
6.55 (deftest with-db-raw ()
6.56 "Test the WITH-OPEN-DB macro and some basic functions."
6.57@@ -68,7 +67,7 @@
6.58
6.59 (deftest with-cf ()
6.60 "Test rdb-cf operations"
6.61- (with-open-db-raw (db "/tmp/rdb-with-cf")
6.62+ (with-test-db-raw (db "/tmp/rdb-with-cf")
6.63 (with-cf (cf (make-rdb-cf :name "foobar"))
6.64 (is (create-cf db cf))
6.65 (is (null (put-cf-str-raw db (rdb-cf-sap cf) "key" "val")))
7.1--- a/lisp/lib/rdb/util.lisp Wed Dec 13 20:02:36 2023 -0500
7.2+++ b/lisp/lib/rdb/util.lisp Wed Dec 13 22:25:47 2023 -0500
7.3@@ -1,9 +1,9 @@
7.4 (in-package :rdb)
7.5
7.6 (defmacro with-errptr (e &body body)
7.7- `(with-alien ((,e rocksdb-errptr (make-alien rocksdb-errptr)))
7.8- ,@body))
7.9-
7.10+ `(progn
7.11+ (with-alien ((,e (* (* t)) (make-alien rocksdb-errptr)))
7.12+ ,@body)))
7.13
7.14 (defun default-rocksdb-options ()
7.15 (let ((opts (rocksdb-options-create)))
7.16@@ -11,16 +11,16 @@
7.17 opts))
7.18
7.19 (defun open-db-raw (db-path opts)
7.20- (with-errptr e
7.21+ (with-errptr err
7.22 (let* ((db-path (if (pathnamep db-path)
7.23 (namestring db-path)
7.24 db-path))
7.25- (db (rocksdb-open opts db-path e))
7.26- (err e))
7.27+ (db (rocksdb-open opts db-path err))
7.28+ (err (deref err)))
7.29 (unless (null-alien err)
7.30 (error 'open-db-error
7.31 :db-path db-path
7.32- :error-message e))
7.33+ :error-message (cast err c-string)))
7.34 db)))
7.35
7.36 (defun close-db-raw (db)
7.37@@ -36,8 +36,8 @@
7.38 `(let ((,db-var (open-db-raw ,db-path ,opt)))
7.39 (unwind-protect (progn ,@body)
7.40 (rocksdb-close ,db-var)
7.41- (with-errptr e
7.42- (rocksdb-destroy-db ,opt ,db-path e))
7.43+ (with-errptr err
7.44+ (rocksdb-destroy-db ,opt ,db-path err))
7.45 (rocksdb-options-destroy ,opt))))
7.46
7.47 (defun put-kv-raw (db key val &optional (opts (rocksdb-writeoptions-create)))
7.48@@ -98,7 +98,7 @@
7.49 (defun get-kv-raw (db key &optional (opt (rocksdb-readoptions-create)))
7.50 (let ((klen (length key)))
7.51 (with-alien ((vlen (* size-t) (make-alien size-t 0))
7.52- (errptr rocksdb-errptr nil)
7.53+ (errptr rocksdb-errptr)
7.54 (k (* char) (make-alien char klen)))
7.55 (setfa k key)
7.56 (let* ((val (rocksdb-get db
7.57@@ -111,7 +111,7 @@
7.58 (error 'get-kv-error
7.59 :db db
7.60 :key key
7.61- :error-message (alien-sap errptr)))
7.62+ :error-message errptr))
7.63 ;; helps if we know the vlen beforehand, would need a custom
7.64 ;; C-side function probably.
7.65 (let ((v (make-array (deref vlen) :element-type 'unsigned-byte)))