changeset 112: | 430e69339ac3 |
parent: | 2aec94d6a480 |
child: | afcb1f02bb66 |
author: | ellis <ellis@rwest.io> |
date: | Tue, 19 Dec 2023 18:10:02 -0500 |
permissions: | -rw-r--r-- |
description: | fixed rdb tests |
93 | 1 | (in-package :rdb) |
2 | ||
3 | ;;; rdb-opts |
|
94 | 4 | (defvar *rdb-opts-lookup-table* |
5 | (let ((table (make-hash-table :test #'equal))) |
|
6 | (mapc (lambda (x) (setf (gethash (car x) table) (cdr x))) |
|
7 | (loop for y across *rocksdb-options* |
|
8 | collect (cons y (format nil "rocksdb-options-set-~x" y)))) |
|
9 | table)) |
|
10 | ||
102 | 11 | (defmacro rdb-opt-setter (key) |
12 | `(symbolicate (format nil "rocksdb-options-set-~x" ,key))) |
|
94 | 13 | |
14 | (defun %set-rocksdb-option (opt key val) |
|
15 | (funcall (rdb-opt-setter key) opt val)) |
|
16 | ||
17 | ;; (funcall (rdb-opt-setter "create-if-missing") (rocksdb-options-create) nil) |
|
18 | ||
19 | (defclass rdb-opts () |
|
102 | 20 | ((table :initarg :table :type hash-table :accessor rdb-opts-table) |
21 | (sap :initarg :sap :type (or null alien) :accessor rdb-opts-sap))) |
|
93 | 22 | |
112 | 23 | (defmethod initialize-instance ((self rdb-opts) &rest initargs &key &allow-other-keys) |
102 | 24 | (with-slots (sap table) self |
25 | (unless (getf initargs :table) (setf table (make-hash-table :test #'equal))) |
|
94 | 26 | (unless (getf initargs :sap) (setf sap (rocksdb-options-create))) |
27 | (loop for (k v) on initargs by #'cddr while v |
|
28 | do (let ((k (typecase k |
|
29 | (string (string-downcase k)) |
|
30 | (symbol (string-downcase (symbol-name k))) |
|
102 | 31 | (t (string-downcase (format nil "~s" k)))))) |
94 | 32 | (set-opt self k v))) |
33 | self)) |
|
34 | ||
99 | 35 | (defun make-rdb-opts (&rest values) |
36 | (apply #'make-instance 'rdb-opts values)) |
|
37 | ||
94 | 38 | (defmethod get-opt ((self rdb-opts) key) |
39 | "Return the current value of KEY in SELF if found, else return nil." |
|
40 | (gethash key (rdb-opts-table self))) |
|
41 | ||
42 | (defmethod set-opt ((self rdb-opts) key val &key push) |
|
43 | "Set the VAL of KEY in SELF with '(setf (gethash SELF KEY) VAL)'." |
|
44 | (prog1 |
|
45 | (setf (gethash key (rdb-opts-table self)) val) |
|
46 | (when push (push-sap self key)))) |
|
47 | ||
48 | (defmethod push-sap ((self rdb-opts) key) |
|
49 | "Push KEY from slot :TABLE to the instance :SAP." |
|
102 | 50 | (%set-rocksdb-option (rdb-opts-sap self) key (get-opt self key))) |
94 | 51 | |
52 | (defmethod push-sap* ((self rdb-opts)) |
|
53 | "Initialized the SAP slot with values from TABLE." |
|
54 | (with-slots (table) self |
|
55 | (loop for k across (hash-table-keys table) |
|
56 | do (push-sap self k)))) |
|
57 | ||
93 | 58 | (defun default-rdb-opts () |
112 | 59 | (make-rdb-opts :create-if-missing t)) |
93 | 60 | |
97 | 61 | ;;; bytes |
94 | 62 | (defclass rdb-bytes (sequence) |
63 | ((buffer :initarg :buffer :type (array unsigned-byte) :accessor rdb-bytes-buffer)) |
|
64 | (:documentation "RDB unsigned-byte array. Implements the iterator protocol.")) |
|
65 | ||
66 | (defmethod sequence:length ((self rdb-bytes)) |
|
67 | (length (rdb-bytes-buffer self))) |
|
68 | ||
69 | (defmethod sequence:elt ((self rdb-bytes) index) |
|
70 | (elt (rdb-bytes-buffer self) index)) |
|
71 | ||
72 | (defmethod sequence:make-sequence-like ((self rdb-bytes) length &key initial-element initial-contents) |
|
73 | (let ((res (make-instance 'rdb-bytes))) |
|
74 | (cond |
|
75 | ((and initial-element initial-contents) (error "supplied both ~S and ~S to ~S" :initial-element :initial-contents 'make-sequence-like)) |
|
76 | (initial-element (setf (rdb-bytes-buffer res) (make-array length :element-type (array-element-type self) |
|
77 | :initial-element initial-element))) |
|
78 | (initial-contents (setf (rdb-bytes-buffer res) (make-array length :element-type (array-element-type self) |
|
79 | :initial-contents initial-contents))) |
|
80 | (t (setf (rdb-bytes-buffer res) (make-array length :element-type (array-element-type self))))))) |
|
81 | ||
82 | ;; (sequence:make-sequence-iterator (make-instance 'rdb-bytes :buffer (vector 1 2 3))) |
|
83 | (defmethod sequence:make-sequence-iterator ((self rdb-bytes) &key from-end start end) |
|
84 | (sequence:make-sequence-iterator (rdb-bytes-buffer self) :from-end from-end :start start :end end)) |
|
85 | ||
86 | ;; (defmethod sequence:subseq ((self rdb-bytes) start &optional end)) |
|
87 | ;; (defmethod sequence:concatenate ((self rdb-bytes) &rest sequences)) |
|
88 | ||
89 | (defclass rdb-val (rdb-bytes) |
|
90 | () |
|
91 | (:documentation "RDB value protocol. |
|
92 | ||
93 | Values must be able to be encoded to and from (array unsigned-byte).")) |
|
94 | ||
97 | 95 | (defun make-rdb-val (val) |
96 | "Convert VAL to an object of type RDB-VAL." |
|
97 | (make-instance 'rdb-val :buffer val)) |
|
98 | ||
94 | 99 | (defclass rdb-key (rdb-bytes) |
100 | () |
|
101 | (:documentation "RDB key protocol. |
|
102 | ||
103 | Keys must be able to be encoded to and from (array unsigned-byte).")) |
|
104 | ||
97 | 105 | (defun make-rdb-key (key) |
106 | "Convert KEY to an object of type RDB-KEY." |
|
107 | (make-instance 'rdb-key :buffer key)) |
|
108 | ||
94 | 109 | (defclass rdb-kv (rdb-bytes) |
110 | ((key :initarg :key :type rdb-key) |
|
111 | (val :initarg :val :type rdb-val))) |
|
112 | ||
97 | 113 | (defun make-rdb-kv (key val) |
114 | "Generate a new RDB-KV pair." |
|
115 | (make-instance 'rdb-kv |
|
116 | :key (make-rdb-key key) |
|
117 | :val (make-rdb-val val))) |
|
94 | 118 | |
97 | 119 | ;;; rdb-cf |
93 | 120 | (defstruct rdb-cf |
94 | 121 | "RDB Column Family structure. Contains a name, a cons of (rdb-key-type |
122 | . rdb-val-type), and a system-area-pointer to the underlying |
|
123 | rocksdb_cf_t handle." |
|
93 | 124 | (name "" :type string) |
94 | 125 | (kv (make-instance 'rdb-kv) :type rdb-kv) |
93 | 126 | (sap nil :type (or null alien))) |
127 | ||
110
cae8da4b1415
rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents:
102
diff
changeset
|
128 | ;; TODO: fix |
93 | 129 | (defun create-cf (db cf) |
130 | (setf (rdb-cf-sap cf) |
|
111 | 131 | (create-cf-raw db (rdb-cf-name cf)))) |
93 | 132 | |
133 | ;;; rdb |
|
111 | 134 | (defstruct rdb |
93 | 135 | (name "" :type string) |
136 | (opts (default-rdb-opts) :type rdb-opts) |
|
100 | 137 | (cfs (make-array 0 :element-type 'rdb-cf :adjustable t :fill-pointer 0) :type (array rdb-cf)) |
138 | (db nil :type (or null alien))) |
|
93 | 139 | |
112 | 140 | (defun create-db (name &key opts cfs) |
100 | 141 | "Construct a new RDB instance from NAME and optional OPTS and DB-PTR." |
112 | 142 | (make-rdb :name name |
143 | :opts (or opts (default-rdb-opts)) |
|
144 | :cfs (or cfs (make-array 0 :element-type 'rdb-cf :adjustable t :fill-pointer 0)) |
|
145 | :db (open-db-raw name (if opts (rdb-opts-sap opts) (default-rocksdb-options))))) |
|
99 | 146 | |
93 | 147 | (defmethod push-cf ((cf rdb-cf) (db rdb)) |
148 | (vector-push cf (rdb-cfs db))) |
|
149 | ||
111 | 150 | ;; (defmethod open-db ((self rdb) (opts rdb-opts)) |
151 | ;; (open-db-raw (rdb-name self) (rdb-opts-sap opts))) |
|
93 | 152 | |
94 | 153 | (defmethod close-db ((self rdb)) |
112 | 154 | (with-slots (db) self |
155 | (close-db-raw db) |
|
156 | (setf db nil))) |
|
93 | 157 | |
94 | 158 | (defmethod destroy-db ((self rdb)) |
97 | 159 | (when (rdb-db self) (close-db self)) |
93 | 160 | (destroy-db-raw (rdb-name self))) |
161 | ||
94 | 162 | (defmethod init-db ((self rdb)) |
93 | 163 | (loop for cf across (rdb-cfs self) |
164 | do (create-cf (rdb-db self) cf))) |
|
165 | ||
94 | 166 | (defmethod insert-key ((self rdb) key val &key cf) |
93 | 167 | (if cf |
168 | (put-cf-raw |
|
169 | (rdb-db self) |
|
170 | (rdb-cf-sap (find cf (rdb-cfs self) :key #'rdb-cf-name :test #'equal)) |
|
171 | key |
|
172 | val) |
|
173 | (put-kv-raw |
|
174 | (rdb-db self) |
|
175 | key |
|
176 | val))) |