Mercurial > core / lisp/rocksdb/rdb.lisp
changeset 0: |
35b3dcda7839 |
author: |
ellis <ellis@rwest.io> |
date: |
Thu, 12 Oct 2023 22:36:34 -0400 |
permissions: |
-rw-r--r-- |
description: |
comp/core init |
1 ;;; rdb.lisp --- High-level RocksDB API 3 ;; a thin ORM for working with RocksDB storage. 5 ;; Low-level bindings are in rocksdb.lisp. 12 (:use :cl :rocksdb :sb-alien :alien) 13 (:import-from :sb-ext :string-to-octets :octets-to-string) 14 (:export :with-open-db :with-iter 16 :iter-key :iter-key-str 17 :iter-val :iter-val-str 18 :unable-to-open-db :unable-to-put-key-value-to-db :unable-to-get-value-to-db)) 20 (defmacro with-open-db ((db-var db-path &optional opt) &body body) 21 `(let ((,db-var (open-db ,db-path ,opt))) 22 (unwind-protect (progn ,@body) 23 (rocksdb-close ,db-var)))) 25 (defmacro with-iter ((iter-var db &optional opt) &body body) 26 `(let ((,iter-var (create-iter ,db ,opt))) 27 (unwind-protect (progn ,@body) 28 (rocksdb-iter-destroy ,iter-var)))) 32 (define-condition unable-to-open-db (error) 33 ((db-path :initarg :db-path 35 (error-message :initarg :error-message 36 :reader error-message))) 38 (defmethod print-object ((obj unable-to-open-db) stream) 39 (print-unreadable-object (obj stream :type t :identity t) 40 (format stream "error-message=~A" (error-message obj)))) 42 (define-condition unable-to-put-key-value-to-db (error) 49 (error-message :initarg :error-message 50 :reader error-message))) 52 (define-condition unable-to-get-value-to-db (error) 57 (error-message :initarg :error-message 58 :reader error-message))) 61 (defun open-db (db-path &optional opt) 63 (setq opt (rocksdb-options-create))) 64 (with-alien ((e rocksdb-errptr nil)) 65 (let* ((db-path (if (pathnamep db-path) 68 (db (rocksdb-open opt db-path e))) 71 (error 'unable-to-open-db 75 ;; (defmacro clone-octets-to-foreign (lisp-array foreign-array) 76 ;; (let ((i (gensym))) 77 ;; `(loop for ,i from 0 below (length ,lisp-array) 78 ;; do (setf (deref ,foreign-array ,i) 79 ;; (aref ,lisp-array ,i))))) 81 ;; (defmacro clone-octets-from-foreign (foreign-array lisp-array len) 82 ;; (let ((i (gensym))) 83 ;; `(loop for ,i from 0 below ,len 84 ;; do (setf (aref ,lisp-array ,i) 85 ;; (deref ,foreign-array ,i))))) 87 ;; (defun put-kv (db key val &optional opt) 89 ;; (setq opt (create-writeoptions))) 90 ;; (with-alien ((errptr (* t)) 91 ;; (key* unsigned-char (length key)) 92 ;; (val* unsigned-char (length val))) 93 ;; (clone-octets-to-foreign key key*) 94 ;; (clone-octets-to-foreign val val*) 102 ;; (let ((err errptr)) 103 ;; (unless (null-alien err) 104 ;; (error 'unable-to-put-key-value-to-db 108 ;; :error-message (sap-alien err c-string)))))) 110 ;; (defun put-kv-str (db key val &optional opt) 111 ;; (let ((key-octets (string-to-octets key)) 112 ;; (val-octets (string-to-octets val))) 113 ;; (put-kv db key-octets val-octets opt))) 115 ;; (defun get-kv (db key &optional opt) 117 ;; (setq opt (create-readoptions))) 119 ;; (with-alien ((val-len-ptr unsigned-int) 120 ;; (errptr system-area-pointer) 121 ;; (key* unsigned-char (length key))) 122 ;; (clone-octets-to-foreign key key*) 123 ;; ;; (setf (mem-ref errptr :pointer) (null-pointer)) 124 ;; (let ((val (get* db 130 ;; (let ((err errptr)) 131 ;; (unless (null-alien err) 132 ;; (error 'unable-to-get-value-to-db 135 ;; :error-message (sap-alien err c-string))) 137 ;; (unless (null-alien val) 138 ;; (let* ((val-len val-len-ptr) 139 ;; (val* (make-array val-len 140 ;; :element-type '(unsigned-byte 8)))) 141 ;; (clone-octets-from-foreign val val* val-len) 144 ;; (defun get-kv-str (db key &optional opt) 145 ;; (let ((key-octets (string-to-octets key))) 146 ;; (let ((#1=val-octets (get-kv db key-octets opt))) 148 ;; (octets-to-string #1#))))) 150 (defun create-iter (db &optional opt) 152 (setq opt (rocksdb-readoptions-create))) 153 (rocksdb-create-iterator db opt)) 155 ;; (defun iter-key (iter) 156 ;; (with-alien ((klen-ptr unsigned-int 0)) 157 ;; (let* ((key-ptr (rocksdb-iter-key iter klen-ptr)) 159 ;; (key (make-array klen :element-type '(unsigned-byte 8)))) 160 ;; (clone-octets-from-foreign key-ptr key klen) 163 ;; (defun iter-key-str (iter) 164 ;; (when-let ((key-octets (iter-key iter))) 165 ;; (octets-to-string key-octets))) 167 ;; (defun iter-val (iter) 168 ;; (with-alien ((len-ptr unsigned-int 0)) 169 ;; (let* ((value-ptr (rocksdb-iter-value iter len-ptr)) 171 ;; (value* (make-array vlen :element-type '(unsigned-byte 8)))) 172 ;; (clone-octets-from-foreign value-ptr value* vlen) 175 ;; (defun iter-val-str (iter) 176 ;; (let ((#1=val-octets (iter-value iter))) 178 ;; (octets-to-string #1#))))