[elephant-cvs] CVS elephant/src/db-bdb
ieslick
ieslick at common-lisp.net
Sat Dec 16 19:35:10 UTC 2006
Update of /project/elephant/cvsroot/elephant/src/db-bdb
In directory clnet:/tmp/cvs-serv4494/src/db-bdb
Modified Files:
bdb-collections.lisp bdb-controller.lisp libberkeley-db.c
package.lisp
Log Message:
Checkpoint for 0.6.1 feature set - BROKEN
--- /project/elephant/cvsroot/elephant/src/db-bdb/bdb-collections.lisp 2006/11/11 18:41:10 1.10
+++ /project/elephant/cvsroot/elephant/src/db-bdb/bdb-collections.lisp 2006/12/16 19:35:10 1.11
@@ -36,17 +36,17 @@
(let ((sc (get-con bt)))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf sc)
(let ((buf (db-get-key-buffered (controller-btrees sc)
key-buf value-buf)))
- (if buf (values (deserialize buf :sc sc) T)
+ (if buf (values (deserialize buf sc) T)
(values nil nil))))))
(defmethod existsp (key (bt bdb-btree))
(declare (optimize (speed 3) (safety 0) (space 0)))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf (get-con bt))
(let ((buf (db-get-key-buffered
(controller-btrees (get-con bt))
key-buf value-buf)))
@@ -57,25 +57,43 @@
(defmethod (setf get-value) (value key (bt bdb-btree))
(declare (optimize (speed 3) (safety 0) (space 0)))
(assert (or *auto-commit* (not (eq *current-transaction* 0))))
-;; (with-transaction (:store-controller (get-con bt))
- (with-buffer-streams (key-buf value-buf)
- (buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
- (serialize value value-buf)
- (db-put-buffered (controller-btrees (get-con bt))
- key-buf value-buf
- :auto-commit *auto-commit*)
- value))
+;; (with-transaction ()
+ (let ((sc (get-con bt)))
+ (with-buffer-streams (key-buf value-buf)
+ (buffer-write-int (oid bt) key-buf)
+ (serialize key key-buf sc)
+ (serialize value value-buf sc)
+ (db-put-buffered (controller-btrees sc)
+ key-buf value-buf
+ :auto-commit *auto-commit*)))
+;; )
+ value)
+
+;; (labels ((write-value ()
+;; (let ((sc (get-con bt)))
+;; (with-buffer-streams (key-buf value-buf)
+;; (buffer-write-int (oid bt) key-buf)
+;; (serialize key key-buf sc)
+;; (serialize value value-buf sc)
+;; (db-put-buffered (controller-btrees sc)
+;; key-buf value-buf
+;; :auto-commit *auto-commit*)
+;; value))))
+;; (if (eq *current-transaction* 0)
+;; (with-transaction (:store-controller (get-con bt))
+;; (write-value))
+;; (write-value))))
(defmethod remove-kv (key (bt bdb-btree))
(declare (optimize (speed 3) (space 0) (safety 0)))
(assert (or *auto-commit* (not (eq *current-transaction* 0))))
;; (with-transaction (:store-controller (get-con bt))
+ (let ((sc (get-con bt)) )
(with-buffer-streams (key-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
- (db-delete-buffered (controller-btrees (get-con bt))
- key-buf :auto-commit *auto-commit*)))
+ (serialize key key-buf sc)
+ (db-delete-buffered (controller-btrees sc)
+ key-buf :auto-commit *auto-commit*))))
;; Secondary indices
@@ -123,9 +141,9 @@
(with-buffer-streams (primary-buf secondary-buf)
(flet ((index (key skey)
(buffer-write-int (oid bt) primary-buf)
- (serialize key primary-buf)
+ (serialize key primary-buf sc)
(buffer-write-int (oid index) secondary-buf)
- (serialize skey secondary-buf)
+ (serialize skey secondary-buf sc)
;; should silently do nothing if
;; the key/value already exists
(db-put-buffered
@@ -175,8 +193,8 @@
(let ((indices (indices-cache bt)))
(with-buffer-streams (key-buf value-buf secondary-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
- (serialize value value-buf)
+ (serialize key key-buf sc)
+ (serialize value value-buf sc)
(with-transaction (:store-controller sc)
(db-put-buffered (controller-btrees sc)
key-buf value-buf)
@@ -187,7 +205,7 @@
(when index?
;; Manually write value into secondary index
(buffer-write-int (oid index) secondary-buf)
- (serialize secondary-key secondary-buf)
+ (serialize secondary-key secondary-buf sc)
;; should silently do nothing if the key/value already
;; exists
(db-put-buffered (controller-indices sc)
@@ -202,7 +220,7 @@
(let ((sc (get-con bt)))
(with-buffer-streams (key-buf secondary-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf sc)
(with-transaction (:store-controller sc)
(let ((value (get-value key bt)))
(when value
@@ -214,7 +232,7 @@
(funcall (key-fn index) index key value)
(when index?
(buffer-write-int (oid index) secondary-buf)
- (serialize secondary-key secondary-buf)
+ (serialize secondary-key secondary-buf sc)
;; need to remove kv pairs with a cursor! --
;; this is a C performance hack
(db-delete-kv-buffered
@@ -237,25 +255,26 @@
(declare (optimize (speed 3)))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf (get-con bt))
(let ((buf (db-get-key-buffered
(controller-indices-assoc (get-con bt))
key-buf value-buf)))
- (if buf (values (deserialize buf :sc (get-con bt)) T)
+ (if buf (values (deserialize buf (get-con bt)) T)
(values nil nil)))))
(defmethod get-primary-key (key (bt btree-index))
(declare (optimize (speed 3)))
- (with-buffer-streams (key-buf value-buf)
- (buffer-write-int (oid bt) key-buf)
- (serialize key key-buf)
- (let ((buf (db-get-key-buffered
- (controller-indices (get-con bt))
- key-buf value-buf)))
- (if buf
- (let ((oid (buffer-read-fixnum buf)))
- (values (deserialize buf :sc (get-con bt)) oid))
- (values nil nil)))))
+ (let ((sc (get-con bt)))
+ (with-buffer-streams (key-buf value-buf)
+ (buffer-write-int (oid bt) key-buf)
+ (serialize key key-buf sc)
+ (let ((buf (db-get-key-buffered
+ (controller-indices sc)
+ key-buf value-buf)))
+ (if buf
+ (let ((oid (buffer-read-fixnum buf)))
+ (values (deserialize buf sc) oid))
+ (values nil nil))))))
(defclass bdb-cursor (cursor)
((handle :accessor cursor-handle :initarg :handle))
@@ -286,20 +305,20 @@
(defmethod cursor-current ((cursor bdb-cursor))
(declare (optimize (speed 3)))
(when (cursor-initialized-p cursor)
- (with-buffer-streams (key-buf value-buf)
- (multiple-value-bind (key val)
- (db-cursor-move-buffered (cursor-handle cursor) key-buf value-buf
- :current t)
- (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
- (progn (setf (cursor-initialized-p cursor) t)
- (values t (deserialize key
- :sc (get-con (cursor-btree cursor)))
- (deserialize val
- :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil))))))
+ (let ((sc (get-con (cursor-btree cursor))))
+ (with-buffer-streams (key-buf value-buf)
+ (multiple-value-bind (key val)
+ (db-cursor-move-buffered (cursor-handle cursor) key-buf value-buf
+ :current t)
+ (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
+ (progn (setf (cursor-initialized-p cursor) t)
+ (values t (deserialize key sc)
+ (deserialize val sc)))
+ (setf (cursor-initialized-p cursor) nil)))))))
(defmethod cursor-first ((cursor bdb-cursor))
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (cursor-oid cursor) key-buf)
(multiple-value-bind (key val)
@@ -307,15 +326,15 @@
key-buf value-buf :set-range t)
(if (and key (= (buffer-read-int key) (cursor-oid cursor)))
(progn (setf (cursor-initialized-p cursor) t)
- (values t (deserialize key
- :sc (get-con (cursor-btree cursor)))
- (deserialize val
- :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil)))))
+ (values t
+ (deserialize key sc)
+ (deserialize val sc)))
+ (setf (cursor-initialized-p cursor) nil))))))
;;A bit of a hack.....
(defmethod cursor-last ((cursor bdb-cursor))
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (+ (cursor-oid cursor) 1) key-buf)
(if (db-cursor-set-buffered (cursor-handle cursor)
@@ -328,10 +347,8 @@
(if (and key (= (buffer-read-int key) (cursor-oid cursor)))
(progn
(setf (cursor-initialized-p cursor) t)
- (values t (deserialize key
- :sc (get-con (cursor-btree cursor)))
- (deserialize val
- :sc (get-con (cursor-btree cursor)))))
+ (values t (deserialize key sc)
+ (deserialize val sc)))
(setf (cursor-initialized-p cursor) nil))))
(multiple-value-bind (key val)
(db-cursor-move-buffered (cursor-handle cursor) key-buf
@@ -339,71 +356,75 @@
(if (and key (= (buffer-read-int key) (cursor-oid cursor)))
(progn
(setf (cursor-initialized-p cursor) t)
- (values t (deserialize key
- :sc (get-con (cursor-btree cursor)))
- (deserialize val
- :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil))))))
+ (values t (deserialize key sc)
+ (deserialize val sc )))
+ (setf (cursor-initialized-p cursor) nil)))))))
(defmethod cursor-next ((cursor bdb-cursor))
(declare (optimize (speed 3)))
(if (cursor-initialized-p cursor)
- (with-buffer-streams (key-buf value-buf)
- (multiple-value-bind (key val)
- (db-cursor-move-buffered (cursor-handle cursor)
- key-buf value-buf :next t)
- (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
- (values t (deserialize key :sc (get-con (cursor-btree cursor)))
- (deserialize val :sc (get-con (cursor-btree cursor))))
- (setf (cursor-initialized-p cursor) nil))))
+ (let ((sc (get-con (cursor-btree cursor))))
+ (with-buffer-streams (key-buf value-buf)
+ (multiple-value-bind (key val)
+ (db-cursor-move-buffered (cursor-handle cursor)
+ key-buf value-buf :next t)
+ (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
+ (values t (deserialize key sc)
+ (deserialize val sc))
+ (setf (cursor-initialized-p cursor) nil)))))
(cursor-first cursor)))
(defmethod cursor-prev ((cursor bdb-cursor))
(declare (optimize (speed 3)))
(if (cursor-initialized-p cursor)
- (with-buffer-streams (key-buf value-buf)
- (multiple-value-bind (key val)
- (db-cursor-move-buffered (cursor-handle cursor)
- key-buf value-buf :prev t)
- (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
- (values t (deserialize key :sc (get-con (cursor-btree cursor)))
- (deserialize val :sc (get-con (cursor-btree cursor))))
- (setf (cursor-initialized-p cursor) nil))))
- (cursor-last cursor)))
+ (let ((sc (get-con (cursor-btree cursor))))
+ (with-buffer-streams (key-buf value-buf)
+ (multiple-value-bind (key val)
+ (db-cursor-move-buffered (cursor-handle cursor)
+ key-buf value-buf :prev t)
+ (if (and key (= (buffer-read-int key) (cursor-oid cursor)))
+ (values t (deserialize key sc)
+ (deserialize val sc))
+ (setf (cursor-initialized-p cursor) nil))))
+ (cursor-last cursor))))
(defmethod cursor-set ((cursor bdb-cursor) key)
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (cursor-oid cursor) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf sc)
(multiple-value-bind (k val)
(db-cursor-set-buffered (cursor-handle cursor)
key-buf value-buf :set t)
(if k
- (progn (setf (cursor-initialized-p cursor) t)
- (values t key (deserialize val :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil)))))
+ (progn
+ (setf (cursor-initialized-p cursor) t)
+ (values t key (deserialize val sc)))
+ (setf (cursor-initialized-p cursor) nil))))))
(defmethod cursor-set-range ((cursor bdb-cursor) key)
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (cursor-oid cursor) key-buf)
- (serialize key key-buf)
+ (serialize key key-buf sc)
(multiple-value-bind (k val)
(db-cursor-set-buffered (cursor-handle cursor)
key-buf value-buf :set-range t)
(if (and k (= (buffer-read-int k) (cursor-oid cursor)))
(progn (setf (cursor-initialized-p cursor) t)
- (values t (deserialize k :sc (get-con (cursor-btree cursor)))
- (deserialize val :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil)))))
+ (values t (deserialize k sc)
+ (deserialize val sc)))
+ (setf (cursor-initialized-p cursor) nil))))))
(defmethod cursor-get-both ((cursor bdb-cursor) key value)
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (cursor-oid cursor) key-buf)
- (serialize key key-buf)
- (serialize value value-buf)
+ (serialize key key-buf sc)
+ (serialize value value-buf sc)
(multiple-value-bind (k v)
(db-cursor-get-both-buffered (cursor-handle cursor)
key-buf value-buf :get-both t)
@@ -411,21 +432,22 @@
(if k
(progn (setf (cursor-initialized-p cursor) t)
(values t key value))
- (setf (cursor-initialized-p cursor) nil)))))
+ (setf (cursor-initialized-p cursor) nil))))))
(defmethod cursor-get-both-range ((cursor bdb-cursor) key value)
(declare (optimize (speed 3)))
+ (let ((sc (get-con (cursor-btree cursor))))
(with-buffer-streams (key-buf value-buf)
(buffer-write-int (cursor-oid cursor) key-buf)
- (serialize key key-buf)
- (serialize value value-buf)
+ (serialize key key-buf sc)
+ (serialize value value-buf sc)
(multiple-value-bind (k v)
(db-cursor-get-both-buffered (cursor-handle cursor)
key-buf value-buf :get-both-range t)
(if k
(progn (setf (cursor-initialized-p cursor) t)
- (values t key (deserialize v :sc (get-con (cursor-btree cursor)))))
- (setf (cursor-initialized-p cursor) nil)))))
+ (values t key (deserialize v sc)))
+ (setf (cursor-initialized-p cursor) nil))))))
(defmethod cursor-delete ((cursor bdb-cursor))
(declare (optimize (speed 3)))
@@ -438,7 +460,7 @@
(when (and key (= (buffer-read-int key) (cursor-oid cursor)))
;; in case of a secondary index this should delete everything
;; as specified by the BDB docs.
- (remove-kv (deserialize key :sc (get-con (cursor-btree cursor)))
+ (remove-kv (deserialize key (get-con (cursor-btree cursor)))
(cursor-btree cursor)))
(setf (cursor-initialized-p cursor) nil)))
(error "Can't delete with uninitialized cursor!")))
@@ -458,7 +480,7 @@
(declare (ignore v))
(if (and k (= (buffer-read-int k) (cursor-oid cursor)))
(setf (get-value
- (deserialize k :sc (get-con (cursor-btree cursor)))
+ (deserialize k (get-con (cursor-btree cursor)))
(cursor-btree cursor))
value)
(setf (cursor-initialized-p cursor) nil))))
@@ -489,14 +511,11 @@
:current t)
(if (and key (= (buffer-read-int key) (cursor-oid cursor)))
(progn (setf (cursor-initialized-p cursor) t)
- (values t
- (deserialize
- key
- :sc (get-con (cursor-btree cursor)))
- (deserialize
- val
- :sc (get-con (cursor-btree cursor)))
- (progn (buffer-read-int pkey) (deserialize pkey))))
[275 lines skipped]
--- /project/elephant/cvsroot/elephant/src/db-bdb/bdb-controller.lisp 2006/11/11 18:41:10 1.13
+++ /project/elephant/cvsroot/elephant/src/db-bdb/bdb-controller.lisp 2006/12/16 19:35:10 1.14
@@ -25,6 +25,8 @@
:accessor controller-environment)
(oid-db :type (or null pointer-void) :accessor controller-oid-db)
(oid-seq :type (or null pointer-void) :accessor controller-oid-seq)
+ (symid-db :type (or null pointer-void) :accessor controller-symid-db)
+ (symid-seq :type (or null pointer-void) :accessor controller-symid-seq)
(btrees :type (or null pointer-void) :accessor controller-btrees)
(indices :type (or null pointer-void) :accessor controller-indices)
(indices-assoc :type (or null pointer-void)
@@ -55,7 +57,20 @@
(string t)
(otherwise nil))))
+(defmethod controller-version ((sc store-controller))
+ (let ((version (controller-version sc)))
+ (if version version
+ (let ((path (make-pathname :name "VERSION" :defaults (second (controller-spec sc)))))
+ (if (probe-file path)
+ (with-open-file (stream path :direction :input)
+ (read stream))
+ (with-open-file (stream path :direction :output)
+ (write *elephant-code-version* :stream stream)))))))
+
+;;
;; Open/close
+;;
+
(defmethod open-controller ((sc bdb-store-controller) &key (recover t)
(recover-fatal nil) (thread t)
(deadlock-detect nil))
@@ -78,20 +93,20 @@
:auto-commit t :type DB-BTREE :create t :thread thread)
(setf (controller-btrees sc) btrees)
- (db-bdb::db-set-lisp-compare btrees)
+ (db-bdb::db-set-lisp-compare btrees (controller-serializer-version sc))
(db-open btrees :file "%ELEPHANT" :database "%ELEPHANTBTREES"
:auto-commit t :type DB-BTREE :create t :thread thread)
(setf (controller-indices sc) indices)
- (db-bdb::db-set-lisp-compare indices)
- (db-bdb::db-set-lisp-dup-compare indices)
+ (db-bdb::db-set-lisp-compare indices (controller-serializer-version sc))
+ (db-bdb::db-set-lisp-dup-compare indices (controller-serializer-version sc))
(db-set-flags indices :dup-sort t)
(db-open indices :file "%ELEPHANT" :database "%ELEPHANTINDICES"
:auto-commit t :type DB-BTREE :create t :thread thread)
(setf (controller-indices-assoc sc) indices-assoc)
- (db-bdb::db-set-lisp-compare indices-assoc)
- (db-bdb::db-set-lisp-dup-compare indices-assoc)
+ (db-bdb::db-set-lisp-compare indices-assoc (controller-serializer-version sc))
+ (db-bdb::db-set-lisp-dup-compare indices-assoc (controller-serializer-version sc))
(db-set-flags indices-assoc :dup-sort t)
(db-open indices-assoc :file "%ELEPHANT" :database "%ELEPHANTINDICES"
:auto-commit t :type DB-UNKNOWN :thread thread :rdonly t)
@@ -110,6 +125,19 @@
:auto-commit t :create t :thread t)
(setf (controller-oid-seq sc) oid-seq)))
+ (let ((db (db-create env)))
+ (setf (controller-symid-db sc) db)
+ (db-open db :file "%ELEPHANTSYMID" :database "%ELEPHANTSYMID"
+ :auto-commit t :type DB-BTREE :create t :thread thread)
+ (let ((symid-seq (db-sequence-create db)))
+ (db-sequence-set-cachesize symid-seq *cachesize*)
+ (db-sequence-set-flags symid-seq :seq-inc t :seq-wrap t)
+ (db-sequence-set-range symid-seq 0 most-positive-fixnum)
+ (db-sequence-initial-value symid-seq 0)
+ (db-sequence-open symid-seq "%ELEPHANTSYMID"
+ :auto-commit t :create t :thread t)
+ (setf (controller-symid-seq sc) symid-seq)))
+
(setf (slot-value sc 'root)
(make-instance 'bdb-btree :from-oid -1 :sc sc))
@@ -121,6 +149,13 @@
sc)))
+;; NOTE: This was the easist way to do this. A BDB hash table would be better
+;; and perhaps generally a better thing to export; however I don't want to
+;; go through the effort at this time.
+
+(defparameter *symbol-to-id-table-oid* -3)
+(defparameter *id-to-symbol-table-oid* -4)
+
(defmethod close-controller ((sc bdb-store-controller))
(when (slot-value sc 'root)
(stop-deadlock-detector sc)
@@ -130,6 +165,10 @@
;; clean instance cache
(flush-instance-cache sc)
;; close handles / environment
+ (db-sequence-close (controller-symid-seq sc))
+ (setf (controller-symid-seq sc) nil)
+ (db-close (controller-symid-db sc))
+ (setf (controller-symid-db sc) nil)
(db-sequence-close (controller-oid-seq sc))
(setf (controller-oid-seq sc) nil)
(db-close (controller-oid-db sc))
@@ -152,6 +191,17 @@
(db-sequence-get-fixnum (controller-oid-seq sc) 1 :transaction +NULL-VOID+
:auto-commit t :txn-nosync t))
+(defmethod next-symid ((sc bdb-store-controller))
+ (declare (type bdb-store-controller sc))
+ (db-sequence-get-fixnum (controller-symid-seq sc) 1 :transaction +NULL-VOID+
+ :auto-commit t :txn-nosync t))
+
+
+
+;;
+;; Automated Deadlock Support
+;;
+
(defparameter *deadlock-type-alist*
'((:oldest . "o")
(:youngest . "y")
@@ -206,6 +256,10 @@
#+(and (not allegro) port) (port:run-prog "kill" :wait t :args (list "-9" (format nil "~A" pid)))
#+(and sbcl linux) (sb-ext:process-kill "/bin/kill" (list "-9" (format nil "~A" pid))))
+;;
+;; Take advantage of release 4.4's compact storage feature. Hidden features of BDB only
+;;
+
(defmethod optimize-storage ((ctrl bdb-store-controller) &key start-key stop-key
(freelist-only nil) (free-space t)
&allow-other-keys)
@@ -219,59 +273,12 @@
(db-compact (controller-indices-assoc ctrl) nil nil end)
(db-compact (controller-oid-db ctrl) nil nil end))
(progn
- (serialize start-key start)
+ (serialize start-key start ctrl)
(db-compact (controller-db ctrl) start
- (when stop-key (serialize stop-key stop) stop)
+ (when stop-key (serialize stop-key stop ctrl) stop)
end
:freelist-only freelist-only
:free-space free-space)))
- (values (deserialize end :sc ctrl))))
-
-;;
-;; Persistent slot protocol
-;;
+ (values (deserialize end ctrl))))
-(defmethod persistent-slot-reader ((sc bdb-store-controller) instance name)
-;; (declare (optimize (speed 3) (safety 1) (space 1)))
- (with-buffer-streams (key-buf value-buf)
- (buffer-write-int (oid instance) key-buf)
- (serialize name key-buf)
- (let ((buf (db-get-key-buffered (controller-db sc)
- key-buf value-buf)))
- (if buf (deserialize buf :sc sc)
- #+cmu
- (error 'unbound-slot :instance instance :slot name)
- #-cmu
- (error 'unbound-slot :instance instance :name name)))))
-
-(defmethod persistent-slot-writer ((sc bdb-store-controller) new-value instance name)
-;; (declare (optimize (speed 3) (safety 1) (space 1)))
-;; (format t "psw -- sc: ~A ct: ~A ac: ~A~%" *store-controller* *current-transaction* *auto-commit*)
- (with-buffer-streams (key-buf value-buf)
- (buffer-write-int (oid instance) key-buf)
- (serialize name key-buf)
- (serialize new-value value-buf)
- (db-put-buffered (controller-db sc)
- key-buf value-buf
- :transaction *current-transaction*
- :auto-commit *auto-commit*)
- new-value))
-
-(defmethod persistent-slot-boundp ((sc bdb-store-controller) instance name)
-;; (declare (optimize (speed 3) (safety 1) (space 1)))
- (with-buffer-streams (key-buf value-buf)
- (buffer-write-int (oid instance) key-buf)
- (serialize name key-buf)
- (let ((buf (db-get-key-buffered (controller-db sc)
- key-buf value-buf)))
- (if buf t nil))))
-
-(defmethod persistent-slot-makunbound ((sc bdb-store-controller) instance name)
-;; (declare (optimize (speed 3) (safety 1) (space 1)))
- (with-buffer-streams (key-buf)
- (buffer-write-int (oid instance) key-buf)
- (serialize name key-buf)
- (db-delete-buffered (controller-db sc) key-buf
- :transaction *current-transaction*
- :auto-commit *auto-commit*)))
--- /project/elephant/cvsroot/elephant/src/db-bdb/libberkeley-db.c 2006/11/11 18:41:10 1.1
+++ /project/elephant/cvsroot/elephant/src/db-bdb/libberkeley-db.c 2006/12/16 19:35:10 1.2
@@ -55,6 +55,7 @@
;;;
*/
+#include <stdint.h>
#include <string.h>
#include <wchar.h>
@@ -66,17 +67,41 @@
/* Pointer arithmetic utility functions */
/* should these be in network-byte order? probably not..... */
int read_int(char *buf, int offset) {
- int i;
+ int int;
memcpy(&i, buf+offset, sizeof(int));
return i;
}
-unsigned int read_uint(char *buf, int offset) {
- unsigned int ui;
+int read_uint(char *buf, int offset) {
+ unsigned int ui;
memcpy(&ui, buf+offset, sizeof(unsigned int));
return ui;
}
+int32_t read_int32(char *buf, int offset) {
+ int int32_t;
+ memcpy(&i, buf+offset, sizeof(int32_t));
+ return i;
+}
+
+uint32_t read_uint32(char *buf, int offset) {
+ uint32_t ui;
+ memcpy(&ui, buf+offset, sizeof(uint32_t));
+ return ui;
+}
+
+int64_t read_int64(char *buf, int offset) {
+ int64_t i;
+ memcpy(&i, buf+offset, sizeof(int64_t));
+ return i;
+}
+
+uint64_t read_uint64(char *buf, int offset) {
+ uint64_t ui;
+ memcpy(&ui, buf+offset, sizeof(uint64_t));
+ return ui;
+}
+
float read_float(char *buf, int offset) {
float f;
memcpy(&f, buf+offset, sizeof(float));
@@ -89,14 +114,33 @@
return d;
}
+/* Platform specific integer */
void write_int(char *buf, int num, int offset) {
memcpy(buf+offset, &num, sizeof(int));
}
-void write_uint(char *buf, unsigned int num, int offset) {
+void write_uint(char *buf, unsighed int num, int offset) {
memcpy(buf+offset, &num, sizeof(unsigned int));
}
+
+/* Well-defined integer widths */
+void write_int32(char *buf, int32_t num, int offset) {
+ memcpy(buf+offset, &num, sizeof(int32_t));
+}
+
+void write_uint32(char *buf, uint32_t num, int offset) {
+ memcpy(buf+offset, &num, sizeof(uint32_t));
+}
+
+void write_int64(char *buf, int64_t num, int offset) {
+ memcpy(buf+offset, &num, sizeof(int64_t));
+}
+
+void write_uint64(char *buf, uint64_t num, int offset) {
+ memcpy(buf+offset, &num, sizeof(uint64_t));
+}
+
void write_float(char *buf, float num, int offset) {
memcpy(buf+offset, &num, sizeof(float));
}
@@ -228,7 +272,7 @@
return db->set_dup_compare(db, dup_compare_fcn);
}
-#define type_numeric(c) ((c)<8)
+#define type_numeric1(c) ((c)<8)
#include <math.h>
double read_num(char *buf);
@@ -239,7 +283,9 @@
/* Inspired by the BDB docs. We have to memcpy to
insure memory alignment. */
-int lisp_compare(DB *dbp, const DBT *a, const DBT *b) {
+
+/* Original serializer */
+int lisp_compare1(DB *dbp, const DBT *a, const DBT *b) {
int difference;
double ddifference;
char *ad, *bd, at, bt;
@@ -262,7 +308,7 @@
at = ad[4]; bt = bd[4];
/* Compare numerics. */
- if (type_numeric(at) && type_numeric(bt)) {
+ if (type_numeric1(at) && type_numeric1(bt)) {
ddifference = read_num(ad+4) - read_num(bd+4);
if (ddifference > 0) return 1;
else if (ddifference < 0) return -1;
@@ -270,6 +316,7 @@
}
/* Compare types. */
+ if
difference = at - bt;
if (difference) return difference;
@@ -294,12 +341,81 @@
}
}
-int db_set_lisp_compare(DB *db) {
- return db->set_bt_compare(db, &lisp_compare);
+#define type_numeric2(c) ((c)<9)
+
+/* New serializer */
+int lisp_compare2(DB *dbp, const DBT *a, const DBT *b) {
+ int difference;
+ double ddifference;
+ char *ad, *bd, at, bt;
+ ad = (char*)a->data;
+ bd = (char*)b->data;
+
+ /* Compare OIDs: OIDs are limited by native integer width */
+ difference = read_int(ad, 0) - read_int(bd, 0);
+ if (difference) return difference;
+
+ /* Have a type tag? */
+ if (a->size == 4)
+ if (b->size == 4)
+ return 0;
+ else
+ return -1;
+ else if (b->size == 4)
+ return 1;
+
+ at = ad[4]; bt = bd[4];
+
+ /* Compare numerics. */
+ if (type_numeric2(at) && type_numeric2(bt)) {
+ ddifference = read_num2(ad+4) - read_num2(bd+4);
+ if (ddifference > 0) return 1;
+ else if (ddifference < 0) return -1;
+ return 0;
+ }
+
+ /* Compare types. */
+ if
+ difference = at - bt;
+ if (difference) return difference;
+
+ ;; TODO: compare strings of different sizes?
+ ;; TODO: compare symbol-ids?
+
+ /* Same type! */
+ switch (at) {
+ case #x3F: /* nil */
+ return 0;
+ case 9: /* 8-bit string */
+ if( bt == 9 )
+ return case_cmp(ad+9, read_int32(ad, 5), bd+9, read_int32(bd, 5));
+ else
+ return full_cmp(ad+9, read_int32(ad, 5), bd+9, read_int32(bd, 5))
+ case 10: /* 16-bit string */
+ return utf16_cmp(ad+9, read_int32(ad, 5), bd+9, read_int32(bd, 5));
+ case 11:
+ return wcs_cmp(ad+9, read_int32(ad, 5), bd+9, read_int32(bd, 5));
+ default:
+ return lex_cmp(ad+5, (a->size)-5, bd+5, (b->size)-5);
+ }
+}
+
+int db_set_lisp_compare(DB *db, int version) {
+ switch (version) {
+ case 1:
+ return db->set_bt_compare(db, &lisp_compare1);
+ default:
+ return db->set_bt_compare(db, &lisp_compare2);
+ }
}
-int db_set_lisp_dup_compare(DB *db) {
- return db->set_dup_compare(db, &lisp_compare);
+int db_set_lisp_dup_compare(DB *db, int version) {
+ switch (version) {
+ case 1:
+ return db->set_dup_compare(db, &lisp_compare1);
+ default:
+ return db->set_dup_compare(db, &lisp_compare2);
+ }
}
#ifndef exp2
--- /project/elephant/cvsroot/elephant/src/db-bdb/package.lisp 2006/11/11 18:41:10 1.2
+++ /project/elephant/cvsroot/elephant/src/db-bdb/package.lisp 2006/12/16 19:35:10 1.3
@@ -26,7 +26,7 @@
Elephant, but with some magic for Elephant. In general there
is a 1-1 mapping from functions here and functions in
Berkeley DB, so refer to their documentation for details.")
- (:use common-lisp uffi elephant-memutil elephant elephant-backend)
+ (:use common-lisp uffi elephant-memutil elephant-backend elephant)
#+cmu
(:use alien)
#+sbcl
@@ -40,4 +40,5 @@
#+openmcl
(:import-from :ccl
#:byte-length)
- )
+ (:export
+ #:optimize-storage))
More information about the Elephant-cvs
mailing list