changelog shortlog graph tags branches changeset files revisions annotate raw help

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
2 
3 ;; a thin ORM for working with RocksDB storage.
4 
5 ;; Low-level bindings are in rocksdb.lisp.
6 
7 ;; Commentary:
8 
9 ;; Code:
10 (in-package :rocksdb)
11 (defpackage :rdb
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
15  :create-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))
19 
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))))
24 
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))))
29 
30 
31 ;;; Conditions
32 (define-condition unable-to-open-db (error)
33  ((db-path :initarg :db-path
34  :reader db-path)
35  (error-message :initarg :error-message
36  :reader error-message)))
37 
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))))
41 
42 (define-condition unable-to-put-key-value-to-db (error)
43  ((db :initarg :db
44  :reader db)
45  (key :initarg :key
46  :reader key)
47  (val :initarg :val
48  :reader val)
49  (error-message :initarg :error-message
50  :reader error-message)))
51 
52 (define-condition unable-to-get-value-to-db (error)
53  ((db :initarg :db
54  :reader db)
55  (key :initarg :key
56  :reader key)
57  (error-message :initarg :error-message
58  :reader error-message)))
59 
60 ;;; API
61 (defun open-db (db-path &optional opt)
62  (unless opt
63  (setq opt (rocksdb-options-create)))
64  (with-alien ((e rocksdb-errptr nil))
65  (let* ((db-path (if (pathnamep db-path)
66  (namestring db-path)
67  db-path))
68  (db (rocksdb-open opt db-path e)))
69  (if (null-alien e)
70  db
71  (error 'unable-to-open-db
72  :db-path db-path
73  :error-message e)))))
74 
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)))))
80 
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)))))
86 
87 ;; (defun put-kv (db key val &optional opt)
88 ;; (unless 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*)
95 ;; (put* db
96 ;; opt
97 ;; key*
98 ;; (length key)
99 ;; val*
100 ;; (length val)
101 ;; errptr)
102 ;; (let ((err errptr))
103 ;; (unless (null-alien err)
104 ;; (error 'unable-to-put-key-value-to-db
105 ;; :db db
106 ;; :key key
107 ;; :val val
108 ;; :error-message (sap-alien err c-string))))))
109 
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)))
114 
115 ;; (defun get-kv (db key &optional opt)
116 ;; (unless opt
117 ;; (setq opt (create-readoptions)))
118 
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
125 ;; opt
126 ;; key*
127 ;; (length key)
128 ;; val-len-ptr
129 ;; errptr)))
130 ;; (let ((err errptr))
131 ;; (unless (null-alien err)
132 ;; (error 'unable-to-get-value-to-db
133 ;; :db db
134 ;; :key key
135 ;; :error-message (sap-alien err c-string)))
136 
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)
142 ;; val*))))))
143 
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)))
147 ;; (when #1#
148 ;; (octets-to-string #1#)))))
149 
150 (defun create-iter (db &optional opt)
151  (unless opt
152  (setq opt (rocksdb-readoptions-create)))
153  (rocksdb-create-iterator db opt))
154 
155 ;; (defun iter-key (iter)
156 ;; (with-alien ((klen-ptr unsigned-int 0))
157 ;; (let* ((key-ptr (rocksdb-iter-key iter klen-ptr))
158 ;; (klen klen-ptr)
159 ;; (key (make-array klen :element-type '(unsigned-byte 8))))
160 ;; (clone-octets-from-foreign key-ptr key klen)
161 ;; key)))
162 
163 ;; (defun iter-key-str (iter)
164 ;; (when-let ((key-octets (iter-key iter)))
165 ;; (octets-to-string key-octets)))
166 
167 ;; (defun iter-val (iter)
168 ;; (with-alien ((len-ptr unsigned-int 0))
169 ;; (let* ((value-ptr (rocksdb-iter-value iter len-ptr))
170 ;; (vlen len-ptr)
171 ;; (value* (make-array vlen :element-type '(unsigned-byte 8))))
172 ;; (clone-octets-from-foreign value-ptr value* vlen)
173 ;; value*)))
174 
175 ;; (defun iter-val-str (iter)
176 ;; (let ((#1=val-octets (iter-value iter)))
177 ;; (when #1#
178 ;; (octets-to-string #1#))))