changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate src/db.lisp

changeset 22: ba323d8c0f93
parent: db.lisp@4230ce61dcfa
author: ellis <ellis@rwest.io>
date: Sat, 03 Jun 2023 22:48:46 -0400
permissions: -rw-r--r--
description: refactor1
3
ellis <ellis@rwest.io>
parents: 0
diff changeset
1
 (in-package :demo)
5
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
2
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
3
 (define-foreign-library rocksdb
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
4
   (:win32 "rocksdb")
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
5
   (t (:default "librocksdb")))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
6
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
7
 (use-foreign-library rocksdb)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
8
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
9
 (defcfun ("rocksdb_options_create" create-options) :pointer)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
10
 (defcfun ("rocksdb_options_destroy" destroy-options) :void (options :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
11
 (defcfun ("rocksdb_options_increase_parallelism" increase-parallelism) :void (opt :pointer) (total-threads :int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
12
 (defcfun ("rocksdb_options_optimize_level_style_compaction" optimize-level-style-compaction) :void (opt :pointer) (memtable_memory_budget :uint64))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
13
 (defcfun ("rocksdb_options_set_create_if_missing" set-create-if-missing) :void (opt :pointer) (val :boolean))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
14
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
15
 (defcfun ("rocksdb_writeoptions_create" create-writeoptions) :pointer)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
16
 (defcfun ("rocksdb_writeoptions_destroy" destroy-writeoptions) :void (opt :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
17
 (defcfun ("rocksdb_readoptions_create" create-readoptions) :pointer)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
18
 (defcfun ("rocksdb_readoptions_destroy" destroy-readoptions) :void (opt :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
19
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
20
 (defcfun ("rocksdb_open" open-db*) :pointer (opt :pointer) (name :string) (errptr :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
21
 (defcfun ("rocksdb_close" close-db) :void (opt :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
22
 (defcfun ("rocksdb_cancel_all_background_work" cancel-all-background-work) :void (db :pointer) (wait :boolean))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
23
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
24
 (defcfun ("rocksdb_put" put*) :void (db :pointer) (options :pointer) (key :pointer) (keylen :unsigned-int) (val :pointer) (vallen :unsigned-int) (errptr :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
25
 (defcfun ("rocksdb_get" get*) :pointer (db :pointer) (options :pointer) (key :pointer) (keylen :unsigned-int) (vallen :pointer) (errptr :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
26
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
27
 (defcfun ("rocksdb_create_iterator" create-iter*) :pointer (db :pointer) (opt :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
28
 (defcfun ("rocksdb_iter_destroy" destroy-iter) :void (iter :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
29
 (defcfun ("rocksdb_iter_seek_to_first" move-iter-to-first) :void (iter :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
30
 (defcfun ("rocksdb_iter_valid" valid-iter-p) :boolean (iter :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
31
 (defcfun ("rocksdb_iter_next" move-iter-forward) :void (iter :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
32
 (defcfun ("rocksdb_iter_prev" move-iter-backward) :void (iter :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
33
 (defcfun ("rocksdb_iter_key" iter-key*) :pointer (iter :pointer) (klen-ptr :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
34
 (defcfun ("rocksdb_iter_value" iter-value*) :pointer (iter :pointer) (vlen-ptr :pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
35
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
36
 (define-condition unable-to-open-db (error)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
37
   ((db-path :initarg :db-path
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
38
             :reader db-path)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
39
    (error-message :initarg :error-message
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
40
                   :reader error-message)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
41
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
42
 (defmethod print-object ((obj unable-to-open-db) stream)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
43
   (print-unreadable-object (obj stream :type t :identity t)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
44
     (format stream "error-message=~A" (error-message obj))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
45
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
46
 (define-condition unable-to-put-key-value-to-db (error)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
47
   ((db :initarg :db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
48
        :reader db)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
49
    (key :initarg :key
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
50
         :reader key)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
51
    (val :initarg :val
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
52
         :reader val)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
53
    (error-message :initarg :error-message
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
54
                   :reader error-message)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
55
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
56
 (define-condition unable-to-get-value-to-db (error)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
57
   ((db :initarg :db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
58
        :reader db)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
59
    (key :initarg :key
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
60
         :reader key)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
61
    (error-message :initarg :error-message
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
62
                   :reader error-message)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
63
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
64
 (defun open-db (db-path &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
65
   (unless opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
66
     (setq opt (create-options)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
67
   (let ((errptr (foreign-alloc :pointer)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
68
     (setf (mem-ref errptr :pointer) (null-pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
69
     (let* ((db-path (if (pathnamep db-path)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
70
                         (namestring db-path)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
71
                         db-path))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
72
            (db (open-db* opt db-path errptr))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
73
            (err (mem-ref errptr :pointer)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
74
       (unless (null-pointer-p err)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
75
         (error 'unable-to-open-db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
76
                :db-path db-path
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
77
                :error-message (foreign-string-to-lisp err)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
78
       db)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
79
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
80
 (defmacro clone-octets-to-foreign (lisp-array foreign-array)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
81
   (let ((i (gensym)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
82
     `(loop for ,i from 0 below (length ,lisp-array)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
83
            do (setf (mem-aref ,foreign-array :unsigned-char ,i)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
84
                     (aref ,lisp-array ,i)))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
85
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
86
 (defmacro clone-octets-from-foreign (foreign-array lisp-array len)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
87
   (let ((i (gensym)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
88
     `(loop for ,i from 0 below ,len
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
89
            do (setf (aref ,lisp-array ,i)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
90
                     (mem-aref ,foreign-array :unsigned-char ,i)))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
91
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
92
 (defun put-kv (db key val &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
93
   (unless opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
94
     (setq opt (create-writeoptions)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
95
   (with-foreign-objects ((errptr :pointer)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
96
                          (key* :unsigned-char (length key))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
97
                          (val* :unsigned-char (length val)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
98
     (clone-octets-to-foreign key key*)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
99
     (clone-octets-to-foreign val val*)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
100
     (setf (mem-ref errptr :pointer) (null-pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
101
     (put* db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
102
           opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
103
           key*
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
104
           (length key)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
105
           val*
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
106
           (length val)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
107
           errptr)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
108
     (let ((err (mem-ref errptr :pointer)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
109
       (unless (null-pointer-p err)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
110
         (error 'unable-to-put-key-value-to-db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
111
                :db db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
112
                :key key
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
113
                :val val
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
114
                :error-message (foreign-string-to-lisp err))))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
115
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
116
 (defun put-kv-str (db key val &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
117
   (let ((key-octets (babel:string-to-octets key))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
118
         (val-octets (babel:string-to-octets val)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
119
     (put-kv db key-octets val-octets opt)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
120
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
121
 (defun get-kv (db key &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
122
   (unless opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
123
     (setq opt (create-readoptions)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
124
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
125
   (with-foreign-objects ((val-len-ptr :unsigned-int)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
126
                          (errptr :pointer)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
127
                          (key* :unsigned-char (length key)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
128
     (clone-octets-to-foreign key key*)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
129
     (setf (mem-ref errptr :pointer) (null-pointer))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
130
     (let ((val (get* db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
131
                      opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
132
                      key*
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
133
                      (length key)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
134
                      val-len-ptr
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
135
                      errptr)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
136
       (let ((err (mem-ref errptr :pointer)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
137
         (unless (null-pointer-p err)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
138
           (error 'unable-to-get-value-to-db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
139
                  :db db
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
140
                  :key key
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
141
                  :error-message (foreign-string-to-lisp err)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
142
         
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
143
         (unless (null-pointer-p val)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
144
           (let* ((val-len (mem-ref val-len-ptr :unsigned-int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
145
                  (val* (make-array val-len
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
146
                                       :element-type '(unsigned-byte 8))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
147
             (clone-octets-from-foreign val val* val-len)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
148
             val*))))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
149
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
150
 (defun get-kv-str (db key &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
151
   (let ((key-octets (babel:string-to-octets key)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
152
     (let ((#1=val-octets (get-kv db key-octets opt)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
153
       (when #1#
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
154
         (babel:octets-to-string #1#)))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
155
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
156
 (defun create-iter (db &optional opt)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
157
   (unless opt
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
158
     (setq opt (create-readoptions)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
159
   (create-iter* db opt))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
160
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
161
 (defun iter-key (iter)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
162
   (with-foreign-objects ((klen-ptr :unsigned-int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
163
     (setf (mem-ref klen-ptr :unsigned-int) 0)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
164
     (let* ((key-ptr (iter-key* iter klen-ptr))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
165
            (klen (mem-ref klen-ptr :unsigned-int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
166
            (key (make-array klen :element-type '(unsigned-byte 8))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
167
       (clone-octets-from-foreign key-ptr key klen)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
168
       key)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
169
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
170
 (defun iter-key-str (iter)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
171
   (let ((#1=key-octets (iter-key iter)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
172
     (when #1#
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
173
       (babel:octets-to-string #1#))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
174
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
175
 (defun iter-value (iter)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
176
   (with-foreign-objects ((len-ptr :unsigned-int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
177
     (setf (mem-ref len-ptr :unsigned-int) 0)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
178
     (let* ((value-ptr (iter-value* iter len-ptr))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
179
            (vlen (mem-ref len-ptr :unsigned-int))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
180
            (value* (make-array vlen :element-type '(unsigned-byte 8))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
181
       (clone-octets-from-foreign value-ptr value* vlen)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
182
       value*)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
183
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
184
 (defun iter-value-str (iter)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
185
   (let ((#1=val-octets (iter-value iter)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
186
     (when #1#
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
187
       (babel:octets-to-string #1#))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
188
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
189
 (defmacro with-open-db ((db-var db-path &optional opt) &body body)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
190
   `(let ((,db-var (open-db ,db-path ,opt)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
191
      (unwind-protect (progn ,@body)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
192
        (close-db ,db-var))))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
193
 
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
194
 (defmacro with-iter ((iter-var db &optional opt) &body body)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
195
   `(let ((,iter-var (create-iter ,db ,opt)))
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
196
      (unwind-protect (progn ,@body)
4230ce61dcfa db ffi from cl-rocksdb
ellis <ellis@rwest.io>
parents: 3
diff changeset
197
        (destroy-iter ,iter-var))))