[elephant-cvs] CVS elephant/src/elephant

ieslick ieslick at common-lisp.net
Tue Mar 7 14:12:22 UTC 2006


Update of /project/elephant/cvsroot/elephant/src/elephant
In directory clnet:/tmp/cvs-serv556/src/elephant

Modified Files:
	classindex.lisp controller.lisp 
Log Message:
Added legacy upgrade support, fixed some store-controller base class functionality for SQL to properly delete connections on close

--- /project/elephant/cvsroot/elephant/src/elephant/classindex.lisp	2006/03/01 18:57:34	1.6
+++ /project/elephant/cvsroot/elephant/src/elephant/classindex.lisp	2006/03/07 14:12:22	1.7
@@ -368,9 +368,9 @@
   (get-instances-by-value (find-class class) slot-name value))
 
 (defmethod get-instances-by-value ((class persistent-metaclass) slot-name value)
-  (declare 
-   (optimize (speed 3) (safety 1) (space 1))
-   (type (or string symbol) slot-name))
+;;  (declare 
+;;   (optimize (speed 3) (safety 1) (space 1))
+;;   (type (or string symbol) slot-name))
   (let ((instances nil))
     (with-btree-cursor (cur (find-inverted-index class slot-name))
       (multiple-value-bind (exists? skey val pkey) (cursor-pset cur value)
@@ -388,9 +388,9 @@
   (get-instances-by-range (find-class class) slot-name start end))
 
 (defmethod get-instances-by-range ((class persistent-metaclass) idx-name start end)
-  (declare (optimize speed (safety 1) (space 1))
-	   (type fixnum start end)
-	   (type string idx-name))
+;;  (declare (optimize speed (safety 1) (space 1))
+;;	   (type fixnum start end)
+;;	   (type string idx-name))
   (with-inverted-cursor (cur class idx-name)
     (labels ((next-range (instances)
 	       (multiple-value-bind (exists? skey val pkey) (cursor-pnext-nodup cur)
--- /project/elephant/cvsroot/elephant/src/elephant/controller.lisp	2006/02/21 19:40:03	1.6
+++ /project/elephant/cvsroot/elephant/src/elephant/controller.lisp	2006/03/07 14:12:22	1.7
@@ -178,7 +178,8 @@
   (let ((obj (get-cache oid (instance-cache sc))))
     (if obj obj
 	;; Should get cached since make-instance calls cache-instance
-	(make-instance class-name :from-oid oid :sc sc))))
+	(make-instance (handle-legacy-classes class-name)
+		       :from-oid oid :sc sc))))
 
 (defmethod flush-instance-cache ((sc store-controller))
   "Reset the instance cache (flush object lookups).  Useful 
@@ -187,6 +188,24 @@
   (setf (instance-cache sc)
 	(make-cache-table :test 'eql)))
 
+(defun handle-legacy-classes (name)
+  (let ((entry (assoc (symbol->string-pair name) *legacy-conversions-db* :test #'equal)))
+    (if entry
+	(string-pair->symbol (cdr entry))
+	name)))
+
+(defun symbol->string-pair (name)
+  (cons (string-downcase (package-name (symbol-package name)))
+	(string-downcase (symbol-name name))))
+
+(defun string-pair->symbol (name)
+  (intern (string-upcase (cdr name)) (car name)))
+
+(defparameter *legacy-conversions-db*
+  '((("elephant" . "bdb-btree") . ("sleepycat" . "bdb-btree"))
+    (("elephant" . "bdb-indexed-btree") . ("sleepycat" . "bdb-indexed-btree"))
+    (("elephant" . "bdb-btree-index") . ("sleepycat" . "bdb-btree-index"))))
+
 ;;
 ;; STORE CONTROLLER PROTOCOL
 ;; 
@@ -212,6 +231,12 @@
   (:documentation
    "Provides a persistent source of unique id's"))
 
+;; Handling dbconnection specs
+
+(defmethod close-controller :after ((sc store-controller))
+  "Delete connection spec so object ops on cached db info fail"
+  (remhash (controller-spec sc) *dbconnection-spec*))
+
 ;; Low-level support for metaclass protocol 
 
 (defgeneric persistent-slot-reader (sc instance name)
@@ -262,4 +287,23 @@
   "Map over all key-value pairs in the root"
   (map-btree fn (controller-root store-controller)))
 
+;;
+;; Explicit storage reclamation
+;;
+
+(defmethod drop-pobject ((inst persistent-object))
+  "Reclaim persistent object storage by unbinding slot values.
+   This also drops references to the instance from any index
+   it partipates in.  This does not delete the cached object
+   instance or any serialized references still in the db. 
+   Need a migration or GC for that!"
+  (when (indexed (class-of inst))
+    (drop-instances (list inst)))
+  (let ((pslots (persistent-slots (class-of inst))))
+    (dolist (slot pslots)
+      (slot-makunbound inst slot))))
+;;      (slot-makunbound-using-class (class-of inst)
+;;				   inst
+;;				   (find-effective-slot-def (class-of inst) slot)))))
+      
 




More information about the Elephant-cvs mailing list