changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/rdb/pkg.lisp

changeset 84: ecee0eb96f9f
parent: dcab745f42ba
child: 17b6d1f39506
author: ellis <ellis@rwest.io>
date: Fri, 08 Dec 2023 21:05:11 -0500
permissions: -rw-r--r--
description: rocksdb cfs
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; rdb.lisp --- High-level RocksDB API
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
3
 ;; a thin ORM for working with RocksDB storage. 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
4
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
5
 ;; Low-level bindings are in rocksdb.lisp.
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
6
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
7
 ;; Commentary:
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
8
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
9
 ;; Code:
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
10
 (uiop:define-package :rdb/pkg
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
11
   (:nicknames :rdb)
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
12
   (:use :cl :std/alien :std/fu :std/sym :rocksdb)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
13
   (:import-from :sb-ext :string-to-octets :octets-to-string)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
14
   (:export 
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
15
    ;; rdb
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
16
    :rdb :make-rdb :open-rdb :close-rdb :destroy-rdb
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
17
    :rdb-db :rdb-name :rdb-cfs :rdb-opts
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
18
    :push-cf :init-cfs
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
19
    :insert-kv :insert-kv-str
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
20
    ;; opts
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
21
    :rdb-opts :make-rdb-opts
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
22
    :default-rdb-opts
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
23
    ;; db
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
24
    :open-db :with-open-db 
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
25
    :close-db :destroy-db
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
26
    ;; cfs
ellis <ellis@rwest.io>
parents: 82
diff changeset
27
    :rdb-cf :make-rdb-cf
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
28
    :rdb-cf-sap :rdb-cf-name
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
29
    :with-cf :create-cf
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
30
    ;; ops
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
31
    :put-kv :put-kv-str
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
32
    :get-kv :get-kv-str
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
33
    :put-cf :put-cf-str
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
34
    :get-cf :get-cf-str
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
35
    ;; iter
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
36
    :create-iter :with-iter
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
37
    :iter-key :iter-key-str
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
38
    :iter-val :iter-val-str
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
39
    ;; err
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
40
    :open-db-error
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
41
    :put-kv-error
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
42
    :get-kv-error))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
43
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
44
 (in-package :rdb/pkg)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
45
 
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
46
 (defmacro with-errptr (e &body body)
ellis <ellis@rwest.io>
parents: 82
diff changeset
47
     `(with-alien ((,e rocksdb-errptr))
ellis <ellis@rwest.io>
parents: 82
diff changeset
48
        ,@body))
ellis <ellis@rwest.io>
parents: 82
diff changeset
49
 
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
50
 (defstruct rdb-opts
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
51
   (create-if-missing nil :type boolean)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
52
   (total-threads 1 :type integer) ;; numcpus is default
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
53
   (max-open-files 10000 :type integer)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
54
   (use-fsync nil :type boolean)
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
55
   (destroy nil :type boolean) ;; *
45
ad67a57b0134 rocksdb bindings and emacs config
ellis <ellis@rwest.io>
parents: 18
diff changeset
56
   (disable-auto-compactions nil :type boolean))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
57
 
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
58
 (defstruct rdb-cf
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
59
   (name "" :type string)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
60
   (sap nil :type (or null alien)))
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
61
 
ellis <ellis@rwest.io>
parents: 82
diff changeset
62
 (defun create-cf (db cf)
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
63
   (setf (rdb-cf-sap cf)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
64
         (with-errptr err
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
65
           (rocksdb-create-column-family db (rocksdb-options-create) (rdb-cf-name cf) err))))
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
66
 
ellis <ellis@rwest.io>
parents: 82
diff changeset
67
 (defmacro with-cf ((cf-var cf) &body body)
ellis <ellis@rwest.io>
parents: 82
diff changeset
68
   `(let ((,cf-var ,cf))
ellis <ellis@rwest.io>
parents: 82
diff changeset
69
     ,@body))
ellis <ellis@rwest.io>
parents: 82
diff changeset
70
 
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
71
 ;; unsafe
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
72
 (defun bind-rocksdb-opts% (opts)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
73
   (let ((o (rocksdb-options-create)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
74
     (with-slots (create-if-missing total-threads) opts
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
75
       (rocksdb-options-set-create-if-missing o create-if-missing)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
76
       (rocksdb-options-increase-parallelism o total-threads))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
77
     o))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
78
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
79
 (defun default-rdb-opts () 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
80
   (make-rdb-opts
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
81
    :create-if-missing t 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
82
    :total-threads 4))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
83
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
84
 (defun default-rocksdb-options% ()
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
85
   (bind-rocksdb-opts% (default-rdb-opts)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
86
 
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
87
 (defun open-db (db-path &optional opts)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
88
   (let ((opts (if opts (bind-rocksdb-opts% opts) (default-rocksdb-options%))))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
89
     (with-alien ((e rocksdb-errptr))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
90
       (let* ((db-path (if (pathnamep db-path)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
91
                           (namestring db-path)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
92
                           db-path))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
93
              (db (rocksdb-open opts db-path e))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
94
              (err e))
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
95
 	(unless (null-alien err)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
96
           (error 'open-db-error
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
97
                  :db-path db-path
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
98
                  :error-message e))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
99
         db))))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
100
 
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
101
 (defun close-db (db)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
102
   (rocksdb-close db))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
103
 
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
104
 (defun destroy-db (path)
83
ellis <ellis@rwest.io>
parents: 82
diff changeset
105
   (with-alien ((err rocksdb-errptr))
ellis <ellis@rwest.io>
parents: 82
diff changeset
106
     (rocksdb-destroy-db (rocksdb-options-create) path err)))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
107
 
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
108
 (defmacro with-open-db ((db-var db-path &optional opt) &body body)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
109
   `(let ((,db-var (open-db ,db-path ,opt)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
110
      (unwind-protect (progn ,@body)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
111
        (close-db ,db-var)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
112
        (when (and ,opt (rdb-opts-destroy ,opt))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
113
          (destroy-db ,db-path)))))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
114
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
115
 (defmacro with-iter ((iter-var db &optional opt) &body body)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
116
   `(let ((,iter-var (create-iter ,db ,opt)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
117
      (unwind-protect (progn ,@body)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
118
        (rocksdb-iter-destroy ,iter-var))))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
119
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
120
 ;;; Conditions
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
121
 (define-condition open-db-error (error)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
122
   ((db-path :initarg :db-path
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
123
             :reader db-path)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
124
    (error-message :initarg :error-message
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
125
                   :reader error-message)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
126
 
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
127
 (defmethod print-object ((obj open-db-error) stream)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
128
   (print-unreadable-object (obj stream :type t :identity t)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
129
     (format stream "error-message=~A" (error-message obj))))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
130
 
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
131
 (define-condition put-kv-error (error)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
132
   ((db :initarg :db
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
133
        :reader db)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
134
    (key :initarg :key
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
135
         :reader key)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
136
    (val :initarg :val
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
137
         :reader val)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
138
    (error-message :initarg :error-message
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
139
                   :reader error-message)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
140
 
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
141
 (define-condition get-kv-error (error)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
142
   ((db :initarg :db
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
143
        :reader db)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
144
    (key :initarg :key
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
145
         :reader key)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
146
    (error-message :initarg :error-message
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
147
                   :reader error-message)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
148
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
149
 (defun put-kv (db key val &optional opts)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
150
   (let ((opts (or opts (rocksdb-writeoptions-create)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
151
 	(klen (length key))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
152
 	(vlen (length val)))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
153
     (with-alien ((k (* char) (make-alien char klen))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
154
 		 (v (* char) (make-alien char vlen))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
155
                  (errptr rocksdb-errptr nil))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
156
       (setfa k key)
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
157
       (setfa v val)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
158
       (rocksdb-put db
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
159
 		   opts
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
160
 		   k
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
161
 		   klen
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
162
 		   v
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
163
 		   vlen
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
164
 		   errptr)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
165
       (unless (null-alien errptr)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
166
         (error 'put-kv-error
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
167
                 :db db
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
168
                 :key key
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
169
                 :val val
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
170
                 :error-message (alien-sap errptr))))))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
171
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
172
 (defun put-kv-str (db key val &optional opt)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
173
   (let ((key-octets (string-to-octets key))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
174
         (val-octets (string-to-octets val)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
175
     (put-kv db key-octets val-octets opt)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
176
 
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
177
 (defun put-cf (db cf key val &optional opt)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
178
   (let ((opts (or opt (rocksdb-writeoptions-create)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
179
 	(klen (length key))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
180
 	(vlen (length val)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
181
     (with-alien ((k (* char) (make-alien char klen))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
182
 		 (v (* char) (make-alien char vlen))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
183
                  (errptr rocksdb-errptr nil))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
184
       (setfa k key)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
185
       (setfa v val)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
186
       (rocksdb-put-cf db
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
187
 		      opts
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
188
                       cf
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
189
 		      k
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
190
 		      klen
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
191
 		      v
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
192
 		      vlen
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
193
 		      errptr)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
194
       (unless (null-alien errptr)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
195
         (error 'put-kv-error
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
196
                 :db db
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
197
                 :key key
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
198
                 :val val
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
199
                 :error-message (alien-sap errptr))))))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
200
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
201
 (defun put-cf-str (db cf key val &optional opt)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
202
   (let ((key-octets (string-to-octets key))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
203
         (val-octets (string-to-octets val)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
204
     (put-cf db cf key-octets val-octets opt)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
205
 
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
206
 (defun get-kv (db key &optional opt)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
207
   (let ((opt (or opt (rocksdb-readoptions-create)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
208
 	(klen (length key)))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
209
     (with-alien ((vlen (* size-t) (make-alien size-t 0))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
210
 		 (errptr rocksdb-errptr nil)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
211
 		 (k (* char) (make-alien char klen)))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
212
       (setfa k key)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
213
       (let* ((val (rocksdb-get db
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
214
 			       opt
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
215
 			       k
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
216
 			       klen
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
217
                                vlen
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
218
 			       errptr)))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
219
 	(unless (null-alien errptr)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
220
           (error 'get-kv-error
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
221
 		 :db db
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
222
 		 :key key
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
223
 		 :error-message (alien-sap errptr)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
224
 	;; helps if we know the vlen beforehand, would need a custom
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
225
 	;; C-side function probably.
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
226
 	(let ((v (make-array (deref vlen) :element-type 'unsigned-byte)))
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
227
           (clone-octets-from-alien val v (deref vlen))
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
228
 	  v)))))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
229
 
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
230
 (defun get-kv-str (db key &optional opt)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
231
    (let ((k (string-to-octets key)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
232
      (let ((v (get-kv db k opt)))
47
01f7dc4d7a8e rocksdb macros
ellis <ellis@rwest.io>
parents: 45
diff changeset
233
        (when v (concatenate 'string (map 'vector #'code-char v))))))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
234
 
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
235
 (defun get-cf (db cf key &optional opt)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
236
   (let ((opt (or opt (rocksdb-readoptions-create)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
237
 	(klen (length key)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
238
     (with-alien ((vlen (* size-t) (make-alien size-t 0))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
239
 		 (errptr rocksdb-errptr nil)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
240
 		 (k (* char) (make-alien char klen)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
241
       (setfa k key)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
242
       (let* ((val (rocksdb-get-cf db
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
243
 			          opt
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
244
                                   cf
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
245
 			          k
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
246
 			          klen
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
247
                                   vlen
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
248
 			          errptr)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
249
 	(unless (null-alien errptr)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
250
           (error 'get-kv-error
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
251
 		 :db db
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
252
 		 :key key
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
253
 		 :error-message (alien-sap errptr)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
254
 	;; helps if we know the vlen beforehand, would need a custom
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
255
 	;; C-side function probably.
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
256
 	(let ((v (make-array (deref vlen) :element-type 'unsigned-byte)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
257
           (clone-octets-from-alien val v (deref vlen))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
258
 	  v)))))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
259
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
260
 (defun get-cf-str (db cf key &optional opt)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
261
    (let ((k (string-to-octets key)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
262
      (let ((v (get-cf db cf k opt)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
263
        (when v (concatenate 'string (map 'vector #'code-char v))))))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
264
 
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
265
 (defun create-iter (db &optional opt)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
266
   (unless opt
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
267
     (setq opt (rocksdb-readoptions-create)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
268
   (rocksdb-create-iterator db opt))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
269
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
270
 (defun iter-key (iter)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
271
   (with-alien ((klen-ptr (* size-t) (make-alien size-t 0)))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
272
     (let* ((key-ptr (rocksdb-iter-key iter klen-ptr))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
273
            (klen (deref klen-ptr))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
274
            (k (make-array klen :element-type '(unsigned-byte 8))))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
275
       (clone-octets-from-alien key-ptr k klen)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
276
       k)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
277
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
278
 (defun iter-key-str (iter)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
279
   (when-let ((k (iter-key iter)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
280
     (octets-to-string k)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
281
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
282
  (defun iter-val (iter)
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
283
    (with-alien ((vlen-ptr (* size-t) (make-alien size-t 0)))
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
284
      (let* ((val-ptr (rocksdb-iter-value iter vlen-ptr))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
285
             (vlen (deref vlen-ptr))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
286
             (v (make-array vlen :element-type '(unsigned-byte 8))))
82
a606978326c7 rocksdb ffi
ellis <ellis@rwest.io>
parents: 47
diff changeset
287
        (clone-octets-from-alien val-ptr v vlen)
18
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
288
        v)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
289
 
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
290
  (defun iter-val-str (iter)
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
291
    (when-let ((v (iter-val iter)))
61482ce290f9 migration complete
ellis <ellis@rwest.io>
parents:
diff changeset
292
      (octets-to-string v)))
84
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
293
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
294
 (defstruct rdb 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
295
   (name "" :type string)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
296
   (opts (default-rdb-opts) :type rdb-opts)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
297
   (db nil :type (or null alien))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
298
   (cfs (make-array 0 :element-type 'rdb-cf :adjustable t :fill-pointer 0) :type (array rdb-cf)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
299
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
300
 (defmethod push-cf ((cf rdb-cf) (db rdb))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
301
   (vector-push cf (rdb-cfs db)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
302
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
303
 (defmethod open-rdb ((self rdb))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
304
   (setf (rdb-db self) 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
305
         (open-db (rdb-name self) (rdb-opts self))))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
306
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
307
 (defmethod close-rdb ((self rdb))  
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
308
   (close-db (rdb-db self))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
309
   (setf (rdb-db self) nil))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
310
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
311
 (defmethod destroy-rdb ((self rdb))  
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
312
   (when (rdb-db self) (close-rdb self))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
313
   (destroy-db (rdb-name self)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
314
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
315
 (defmethod init-cfs ((self rdb))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
316
   (loop for cf across (rdb-cfs self)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
317
         do (create-cf (rdb-db self) cf)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
318
 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
319
 (defmethod insert-kv ((self rdb) key val &optional cf-name)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
320
   (if cf-name
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
321
     (put-cf
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
322
      (rdb-db self)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
323
      (rdb-cf-sap (find cf-name (rdb-cfs self) :key #'rdb-cf-name :test #'equal))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
324
      key
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
325
      val)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
326
     (put-kv 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
327
      (rdb-db self)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
328
      key 
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
329
      val)))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
330
   
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
331
 (defmethod insert-kv-str ((self rdb) key val &optional cf-name)
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
332
   (insert-kv self (string-to-octets key) (string-to-octets val) cf-name))
ecee0eb96f9f rocksdb cfs
ellis <ellis@rwest.io>
parents: 83
diff changeset
333