changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/lib/rdb/raw.lisp

changeset 680: 5f88b237ce29
parent: 97dd03beda03
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 27 Sep 2024 20:19:10 -0400
permissions: -rw-r--r--
description: added skc, fixed alien c-string functions, upgrades and fixes for rocksdb/rdb
1 ;;; rdb/raw.lisp --- Raw wrappers for ROCKSDB alien interface
2 
3 ;;; Code:
4 (in-package :rdb)
5 
6 ;;; Options
7 (defun make-rocksdb-options (&optional init-fn)
8  "Make and return RDB-OPTS. INIT-FN is an optional argument which must be a
9 lambda which takes a single parameter (the RDB-OPTS sap). It is used
10 to initialize the instance with custom configuration."
11  (let ((opts (rocksdb-options-create)))
12  (when init-fn (funcall init-fn opts))
13  opts))
14 
15 (defun default-rocksdb-options ()
16  (make-rocksdb-options
17  (lambda (o) (rocksdb-options-set-create-if-missing o t))))
18 
19 (defun load-opts-raw (dir)
20  (rocksdb::with-latest-options dir (db-opts names cf-opts)
21  (values db-opts names cf-opts)))
22 
23 (defun get-stats-raw (opt htype)
24  (with-alien ((hist (* rocksdb-statistics-histogram-data) (rocksdb-statistics-histogram-data-create)))
25  (rocksdb-options-statistics-get-histogram-data opt htype hist)
26  (deref hist)))
27 
28 ;;; DB
29 (defun open-db-raw (db-path &optional (opts (default-rocksdb-options)))
30  (with-errptr (err 'open-db-error (list :db db-path))
31  (let* ((db-path (if (pathnamep db-path)
32  (namestring db-path)
33  db-path)))
34  (rocksdb-open opts db-path err))))
35 
36 (defun close-db-raw (db)
37  (rocksdb-close db))
38 
39 (defun destroy-db-raw (path &optional (opt (rocksdb-options-create)))
40  (with-errptr (err 'destroy-db-error (list :db path))
41  (rocksdb-destroy-db opt (namestring (uiop:ensure-directory-pathname path)) err)
42  (rocksdb-options-destroy opt)))
43 
44 (defun get-property-raw (db str)
45  (rocksdb-property-value db (make-alien-string str)))
46 
47 (defun get-metadata-raw (db &optional cf)
48  (if cf
49  (rocksdb-get-column-family-metadata-cf db cf)
50  (rocksdb-get-column-family-metadata db)))
51 
52 (defun flush-db-raw (db &optional (opts (rocksdb-flushoptions-create)))
53  (with-errptr (err 'flush-db-error (list :db db))
54  (rocksdb-flush db opts err)))
55 
56 (defun repair-db-raw (name &optional (opts (rocksdb-options-create)))
57  (with-errptr (err 'repair-db-error (list :name name))
58  (rocksdb-repair-db opts name err)))
59 
60 (defun ingest-db-raw (db files &optional (opts (rocksdb-ingestexternalfileoptions-create)))
61  (let ((flen (length files)))
62  (with-errptr (err 'ingest-db-error)
63  (with-alien ((flist (* c-string) (make-alien c-string flen)))
64  (loop for f in files
65  for i from 0 to flen
66  do (setf (deref flist i) (make-alien-string f :null-terminate nil)))
67  (rocksdb-ingest-external-file db flist flen opts err)))))
68 
69 (defun ingest-db-cf-raw (db cf files &optional (opts (rocksdb-ingestexternalfileoptions-create)))
70  (let ((flen (length files)))
71  (with-errptr (err 'ingest-db-error)
72  (with-alien ((flist (* c-string) (make-alien c-string flen)))
73  (loop for f in files
74  for i from 0 to flen
75  do (setf (deref flist i) (make-alien-string f :null-terminate nil)))
76  (rocksdb-ingest-external-file-cf db cf flist flen opts err)))))
77 
78 ;;; KVs
79 (defun put-kv-raw (db key val &optional (opts (rocksdb-writeoptions-create)))
80  (let ((klen (length key))
81  (vlen (length val)))
82  (with-alien ((k (* unsigned-char) (make-alien unsigned-char klen))
83  (v (* unsigned-char) (make-alien unsigned-char vlen)))
84  (setfa k key)
85  (setfa v val)
86  (with-errptr (err 'put-kv-error (list :db db :kv (cons key val)))
87  (rocksdb-put db
88  opts
89  k
90  klen
91  v
92  vlen
93  err)))))
94 
95 (defun put-kv-str-raw (db key val &optional (opts (rocksdb-writeoptions-create)))
96  (let ((key-octets (string-to-octets key :null-terminate nil))
97  (val-octets (string-to-octets val :null-terminate nil)))
98  (put-kv-raw db key-octets val-octets opts)))
99 
100 (defun get-kv-raw (db key &optional (opt (rocksdb-readoptions-create)))
101  (let ((klen (length key)))
102  (with-errptr (err 'get-kv-error (list :db db :key key))
103  (with-alien ((vlen size-t)
104  (k (* unsigned-char) (make-alien unsigned-char klen)))
105  (setfa k key)
106  (let* ((val (rocksdb-get db
107  opt
108  k klen
109  (addr vlen)
110  err)))
111  ;; helps if we know the vlen beforehand, would need a custom
112  ;; C-side function probably.
113  (let ((v (make-array vlen :element-type 'octet)))
114  (clone-octets-from-alien val v vlen)
115  (coerce v 'octet-vector)))))))
116 
117 (defun get-kv-str-raw (db key &optional (opt (rocksdb-readoptions-create)))
118  (let ((k (string-to-octets key)))
119  (let ((v (get-kv-raw db k opt)))
120  (when v (octets-to-string v)))))
121 
122 ;;; Column Family
123 (defun open-cfs-raw (db-opt name names opts)
124  (let ((n (length names)))
125  (with-alien ((cf-names (* c-string) (clone-strings names))
126  (cf-opts (* (* rocksdb-options)))
127  (cf-handles (* (* rocksdb-column-family-handle))))
128  (loop for opt in opts
129  for i below n
130  do (setf (deref cf-opts i) opt))
131  (with-errptr (err 'rocksdb-cf-error (list :cf name))
132  (let ((db (rocksdb-open-column-families db-opt name n cf-names cf-opts cf-handles err)))
133  (values db cf-handles))))))
134 
135 (defun create-cf-raw (db name &optional (opt (rocksdb-options-create)))
136  (with-errptr (err 'rocksdb-cf-error (list :db db :cf name))
137  (rocksdb-create-column-family db opt name err)))
138 
139 (defun destroy-cf-raw (cf)
140  (rocksdb-column-family-handle-destroy cf))
141 
142 (defun get-cf-raw (db cf key &optional (opt (rocksdb-readoptions-create)))
143  (let ((klen (length key)))
144  (with-errptr (err 'get-kv-error (list :db db :key key))
145  (with-alien ((vlen (* size-t) (make-alien size-t 0))
146  (k (* unsigned-char) (make-alien unsigned-char klen)))
147  (setfa k key)
148  (let* ((val (rocksdb-get-cf db
149  opt
150  cf
151  k klen
152  vlen
153  err)))
154  ;; helps if we know the vlen beforehand, would need a custom
155  ;; C-side function probably.
156  (let ((v (make-array (deref vlen) :element-type 'unsigned-byte)))
157  (clone-octets-from-alien val v (deref vlen))
158  v))))))
159 
160 (defun get-cf-str-raw (db cf key &optional (opt (rocksdb-readoptions-create)))
161  (let ((k (string-to-octets key :null-terminate nil)))
162  (let ((v (get-cf-raw db cf k opt)))
163  (when v (concatenate 'string (map 'vector #'code-char v))))))
164 
165 (defun put-cf-raw (db cf key val &optional (opts (rocksdb-writeoptions-create)))
166  (let ((klen (length key))
167  (vlen (length val)))
168  (with-errptr (err 'put-kv-error (list :db db :kv (cons key val)))
169  (with-alien ((k (* unsigned-char) (make-alien unsigned-char klen))
170  (v (* unsigned-char) (make-alien unsigned-char vlen)))
171  (setfa k key)
172  (setfa v val)
173  (rocksdb-put-cf db
174  opts
175  cf
176  k klen
177  v vlen
178  err)))))
179 
180 (defun put-cf-str-raw (db cf key val &optional (opt (rocksdb-writeoptions-create)))
181  (let ((key-octets (string-to-octets key :null-terminate nil))
182  (val-octets (string-to-octets val :null-terminate nil)))
183  (put-cf-raw db cf key-octets val-octets opt)))
184 
185 (defun cf-name-raw (cf-handle)
186  (rocksdb-column-family-handle-get-name cf-handle (make-alien unsigned-long)))
187 
188 (defun cf-id-raw (cf-handle)
189  (rocksdb-column-family-handle-get-id cf-handle))
190 
191 ;;; Iterators
192 (defun create-iter-raw (db &optional (opt (rocksdb-readoptions-create)))
193  (rocksdb-create-iterator db opt))
194 
195 (defun create-cf-iter-raw (db cf &optional (opt (rocksdb-readoptions-create)))
196  (rocksdb-create-iterator-cf db opt cf))
197 
198 (defun destroy-iter-raw (iter)
199  (rocksdb-iter-destroy iter))
200 
201 (defun iter-key-raw (iter)
202  (with-alien ((klen-ptr (* size-t) (make-alien size-t 0)))
203  (let* ((key-ptr (rocksdb-iter-key iter klen-ptr))
204  (klen (deref klen-ptr))
205  (k (make-array klen :element-type '(unsigned-byte 8))))
206  (clone-octets-from-alien key-ptr k klen)
207  k)))
208 
209 (defun iter-key-str-raw (iter)
210  (when-let ((k (iter-key-raw iter)))
211  (octets-to-string k)))
212 
213 (defun iter-val-raw (iter)
214  (with-alien ((vlen-ptr (* size-t) (make-alien size-t 0)))
215  (let* ((val-ptr (rocksdb-iter-value iter vlen-ptr))
216  (vlen (deref vlen-ptr))
217  (v (make-array vlen :element-type '(unsigned-byte 8))))
218  (clone-octets-from-alien val-ptr v vlen)
219  v)))
220 
221 (defun iter-val-str-raw (iter)
222  (when-let ((v (iter-val-raw iter)))
223  (octets-to-string v)))
224 
225 ;;; Backup Engine
226 (defun open-backup-engine-raw (be-path &optional (opts (rocksdb-options-create)))
227  (with-errptr (err 'open-backup-engine-error (list :db be-path))
228  (let ((be-path (if (pathnamep be-path)
229  (namestring be-path)
230  be-path)))
231  (rocksdb-backup-engine-open opts be-path err))))
232 
233 (defun close-backup-engine-raw (be)
234  (rocksdb-backup-engine-close be))
235 
236 (defun create-new-backup-raw (be db)
237  (with-errptr (err 'rocksdb-error)
238  (rocksdb-backup-engine-create-new-backup be db err)))
239 
240 (defun restore-from-latest-backup-raw (be db-path backup-path &optional (opt (rocksdb-restore-options-create)))
241  (with-errptr (err 'rocksdb-error)
242  (rocksdb-backup-engine-restore-db-from-latest-backup be db-path backup-path opt err)))
243 
244 (defun restore-from-backup-raw (be db-path backup-path backup-id &optional (opt (rocksdb-restore-options-create)))
245  (with-errptr (err 'rocksdb-error)
246  (rocksdb-backup-engine-restore-db-from-backup be db-path backup-path opt backup-id err)))
247 
248 ;;; Snapshot
249 (defun create-snapshot-raw (db)
250  (rocksdb-create-snapshot db))
251 
252 (defun release-snapshot-raw (db snapshot)
253  (rocksdb-release-snapshot db snapshot))
254 
255 ;;; SST
256 (defun create-sst-writer-raw (&optional (env-opts (rocksdb-envoptions-create)) (io-opts (rocksdb-options-create)))
257  (rocksdb-sstfilewriter-create env-opts io-opts))
258 
259 (defun create-sst-writer-with-comparator-raw (comparator
260  &optional
261  (env-opts (rocksdb-envoptions-create))
262  (io-opts (rocksdb-options-create)))
263  (rocksdb-sstfilewriter-create-with-comparator env-opts io-opts comparator))
264 
265 (defun finish-sst-writer-raw (writer)
266  (with-errptr (err 'rocksdb-error)
267  (rocksdb-sstfilewriter-finish writer err)))
268 
269 (defun destroy-sst-writer-raw (writer)
270  (rocksdb-sstfilewriter-destroy writer))
271 
272 (defun open-sst-writer-raw (writer name)
273  (with-errptr (err 'rocksdb-error)
274  (rocksdb-sstfilewriter-open writer name err)))
275 
276 ;; this function is deprecated in the Java API:
277 ;; https://javadoc.io/doc/org.rocksdb/rocksdbjni/6.6.4/org/rocksdb/SstFileWriter.html
278 
279 ;; (defun sst-add-raw (writer key val)
280 ;; (with-errptr (err 'rocksdb-error)
281 ;; (rocksdb-sstfilewriter-add writer key (length key) val (length val) err)))
282 
283 (defun sst-put-raw (writer key val)
284  (let ((klen (length key))
285  (vlen (length val)))
286  (with-errptr (err 'rocksdb-error)
287  (with-alien ((k (* unsigned-char) (make-alien unsigned-char klen))
288  (v (* unsigned-char) (make-alien unsigned-char vlen)))
289  (setfa k key)
290  (setfa v val)
291  (rocksdb-sstfilewriter-put writer k klen v vlen err)))))
292 
293 (defun sst-put-str-raw (writer key val)
294  (let ((key-octets (string-to-octets key :null-terminate nil))
295  (val-octets (string-to-octets val :null-terminate nil)))
296  (sst-put-raw writer key-octets val-octets)))
297 
298 (defun sst-put-ts-raw (writer key val ts)
299  (with-errptr (err 'rocksdb-error)
300  (rocksdb-sstfilewriter-put-with-ts writer key (length key) val (length val) ts (length ts) err)))
301 
302 (defun sst-delete-raw (writer key)
303  (with-errptr (err 'rocksdb-error)
304  (rocksdb-sstfilewriter-delete writer key (length key) err)))
305 
306 (defun sst-delete-ts-raw (writer key ts)
307  (with-errptr (err 'rocksdb-error)
308  (rocksdb-sstfilewriter-delete-with-ts writer key (length key) ts (length ts) err)))
309 
310 (defun sst-delete-range-raw (writer start-key end-key)
311  (with-errptr (err 'rocksdb-error)
312  (rocksdb-sstfilewriter-delete-range writer start-key (length start-key) end-key (length end-key) err)))
313 
314 (defun sst-file-size-raw (writer)
315  (with-errptr (err 'rocksdb-error)
316  (with-alien ((ret unsigned-long))
317  (rocksdb-sstfilewriter-file-size writer (addr ret) err)
318  ret)))