[elephant-cvs] CVS elephant/src/elephant

ieslick ieslick at common-lisp.net
Wed Feb 22 21:03:47 UTC 2006


Update of /project/elephant/cvsroot/elephant/src/elephant
In directory common-lisp:/tmp/cvs-serv18474/src/elephant

Modified Files:
	classes.lisp metaclasses.lisp 
Log Message:

Quick fix for config.lisp not having a package designator.  Also my tweaks
to fix a BDB bug, adding transacctions to btree writes for increased safety
and various tweaks I made trying to fix the slot-boundp bug in indexing-redef-class



--- /project/elephant/cvsroot/elephant/src/elephant/classes.lisp	2006/02/22 20:18:51	1.3
+++ /project/elephant/cvsroot/elephant/src/elephant/classes.lisp	2006/02/22 21:03:47	1.4
@@ -42,6 +42,10 @@
     automatically inherited if you use the persistent-metaclass
     metaclass."))
 
+;; ================================================
+;; METACLASS INITIALIZATION AND CHANGES
+;; ================================================
+
 (defmethod shared-initialize :around ((class persistent-metaclass) slot-names &rest args &key direct-superclasses)
   "Ensures we inherit from persistent-object."
   (let* ((persistent-metaclass (find-class 'persistent-metaclass))
@@ -54,59 +58,8 @@
 					  direct-superclasses) args)
 	(call-next-method))))
 
-#+allegro
-(defun make-persistent-reader (name slot-definition class class-name)
-  (eval `(defmethod ,name ((instance ,class-name))
-	  (slot-value-using-class ,class instance ,slot-definition))))
-
-#+allegro
-(defun make-persistent-writer (name slot-definition class class-name)
-  (let ((name (if (and (consp name)
-		       (eq (car name) 'setf))
-		  name
-		  `(setf ,name))))
-    (eval `(defmethod ,name ((instance ,class-name) value)
-	     (setf (slot-value-using-class ,class instance ,slot-definition)
-		   value)))))
-
-#+allegro
-(defmethod initialize-accessors ((slot-definition persistent-slot-definition) class)
-  (let ((readers (slot-definition-readers slot-definition))
-	(writers (slot-definition-writers slot-definition))
-	(class-name (class-name class)))
-    (loop for reader in readers
-	  do (make-persistent-reader reader slot-definition class class-name))
-    (loop for writer in writers
-	  do (make-persistent-writer writer slot-definition class class-name))))
-
-#+allegro
-(defmethod reinitialize-instance :around ((instance persistent-metaclass) &rest initargs &key &allow-other-keys)
-  (declare (ignore initargs))
-  (prog1
-      (call-next-method)
-    (when (class-finalized-p instance)
-      (update-persistent-slots instance (persistent-slot-names instance))
-      (update-indexed-record instance (indexed-slot-names-from-defs instance))
-      (set-db-synch instance :class)
-      (loop with persistent-slots = (persistent-slots instance)
-	    for slot-def in (class-direct-slots instance)
-	    when (member (slot-definition-name slot-def) persistent-slots)
-	    do (initialize-accessors slot-def instance))
-      (make-instances-obsolete instance))))
-
-#+(or cmu sbcl openmcl)
-(defmethod reinitialize-instance :around ((instance persistent-metaclass) &rest initargs &key &allow-other-keys)
-  (declare (ignore initargs))
-  (prog1
-      (call-next-method)
-    (when (class-finalized-p instance)
-      (update-persistent-slots instance (persistent-slot-names instance))
-      (update-indexed-record instance (indexed-slot-names-from-defs instance))
-      (set-db-synch instance :class)
-      (make-instances-obsolete instance))))
-
-;; #+allegro
 (defmethod finalize-inheritance :around ((instance persistent-metaclass))
+  "Update the persistent slot records in the metaclass"
   (prog1
       (call-next-method)
     (when (not (slot-boundp instance '%persistent-slots))
@@ -115,13 +68,9 @@
     (when (not (slot-boundp instance '%indexed-slots))
       (update-indexed-record instance (indexed-slot-names-from-defs instance)))))
 
-;; #+(or cmu sbcl)
-;; (defmethod finalize-inheritance :around ((instance persistent-metaclass))
-;;   (prog1
-;;       (call-next-method)
-;;     (if (not (slot-boundp instance '%persistent-slots))
-;; 	(setf (%persistent-slots instance) 
-;; 	      (cons (persistent-slot-names instance) nil)))))
+;; ================================================
+;; PERSISTENT OBJECT MAINTENANCE
+;; ================================================
 
 (defmethod shared-initialize :around ((instance persistent-object) slot-names &rest initargs &key from-oid &allow-other-keys)
   "Initializes the persistent slots via initargs or forms.
@@ -151,9 +100,10 @@
 		    with slot-initargs = (slot-definition-initargs slot-def)
 		    when (member initarg slot-initargs :test #'eq)
 		    do 
-		    (setf (slot-value-using-class class instance slot-def) 
-			  (getf initargs initarg))
-		    (return t))))
+		      (setf (slot-value-using-class class instance slot-def) 
+			    (getf initargs initarg))
+		      (return t))))
+	  (with-transaction (:store-controller (get-con instance))
 	  (loop for slot-def in (class-slots class)
 	     unless (initialize-from-initarg slot-def)
 	     when (member (slot-definition-name slot-def) persistent-slot-inits :test #'eq)
@@ -162,7 +112,7 @@
 	     (let ((initfun (slot-definition-initfunction slot-def)))
 	       (when initfun
 		 (setf (slot-value-using-class class instance slot-def)
-		       (funcall initfun)))))
+		       (funcall initfun))))))
 ;; 	  (format t "transient-slot-inits ~A~%" transient-slot-inits)
 ;; 	  (format t "indices boundp ~A~%" (slot-boundp instance 'indices))
 ;; 	  (format t "indices-caches boundp ~A~%" (slot-boundp instance 'indices-cache))
@@ -177,12 +127,12 @@
 	  (when (and (indexed class) (not from-oid))
 	    (let ((class-index (find-class-index class)))
 	      (when class-index
-		(with-transaction (:store-controller (get-con class-index))
-		  (setf (get-value oid class-index) instance)))))
+		(setf (get-value oid class-index) instance))))
 	  ))))
 
-(defmethod update-instance-for-redefined-class :around ((instance persistent-object) added-slots discarded-slots property-list &rest initargs &key &allow-other-keys)
+(defmethod update-instance-for-redefined-class ((instance persistent-object) added-slots discarded-slots property-list &rest initargs &key &allow-other-keys)
   ;; NOTE: probably should delete discarded slots, but we'll worry about that later
+  ;;       (also will want to delete discarded indices since we don't have a good GC)
   (declare (ignore property-list discarded-slots added-slots))
   (prog1
       (call-next-method)
@@ -210,14 +160,15 @@
     ;; Apply default values for unbound & new slots (updates class index)
     (apply #'shared-initialize current (append new-persistent-slots retained-unbound-slots) initargs)
     ;; Copy values from old class (NOTE: should delete discarded slots?) (updates class index)
-    (loop for slot-def in (class-slots new-class)
-	  when (member (slot-definition-name slot-def) retained-persistent-slots)
-	  do (setf (slot-value-using-class new-class
-					   current
-					   slot-def)
-		   (slot-value-using-class old-class
-					   previous
-					   (find-slot-def-by-name old-class (slot-definition-name slot-def)))))
+    (with-transaction (:store-controller (get-con current))
+      (loop for slot-def in (class-slots new-class)
+	 when (member (slot-definition-name slot-def) retained-persistent-slots)
+	 do (setf (slot-value-using-class new-class
+					  current
+					  slot-def)
+		  (slot-value-using-class old-class
+					  previous
+					  (find-slot-def-by-name old-class (slot-definition-name slot-def))))))
     ;; Delete this instance from its old class index, if exists
     (when (indexed old-class)
       (remove-kv (oid previous) (find-class-index old-class)))
@@ -229,14 +180,6 @@
   (let ((name (slot-definition-name slot-def)))
     (persistent-slot-reader (get-con instance) instance name)))
 
-;; ORIGINAL METHOD
-;; (defmethod (setf slot-value-using-class) :around (new-value (class persistent-metaclass) (instance persistent-object) (slot-def persistent-slot-definition))
-;;   "Set the slot value in the database."
-;;   (declare (optimize (speed 3)))
-;;   (let ((name (slot-definition-name slot-def)))
-;;     (persistent-slot-writer new-value instance name)))
-
-;; SUPPORT FOR INVERTED INDEXES
 (defmethod (setf slot-value-using-class) :around (new-value (class persistent-metaclass) (instance persistent-object) (slot-def persistent-slot-definition))
   "Set the slot value in the database."
   (declare (optimize (speed 3)))
@@ -270,7 +213,15 @@
     (unregister-indexed-slot class (slot-definition-name slot-def)))
   (persistent-slot-makunbound (get-con instance) instance (slot-definition-name slot-def)))
 
-;; NOTE: Closer to MOP will fix this
+;; ======================================================
+;; Handling metaclass overrides of normal slot operation
+;; NOTE: Closer to MOP should replace this need...
+;; ======================================================
+
+;;
+;; ALLEGRO 
+;;
+
 #+allegro
 (defmethod slot-makunbound-using-class :around ((class persistent-metaclass) (instance persistent-object) (slot-name symbol))
   (loop for slot in (class-slots class)
@@ -278,3 +229,93 @@
 	finally (return (if (typep slot 'persistent-slot-definition)
 			    (slot-makunbound-using-class class instance slot)
 			    (call-next-method)))))
+
+
+#+allegro
+(defun make-persistent-reader (name slot-definition class class-name)
+  (eval `(defmethod ,name ((instance ,class-name))
+	  (slot-value-using-class ,class instance ,slot-definition))))
+
+#+allegro
+(defun make-persistent-writer (name slot-definition class class-name)
+  (let ((name (if (and (consp name)
+		       (eq (car name) 'setf))
+		  name
+		  `(setf ,name))))
+    (eval `(defmethod ,name ((instance ,class-name) value)
+	     (setf (slot-value-using-class ,class instance ,slot-definition)
+		   value)))))
+
+#+allegro
+(defmethod initialize-accessors ((slot-definition persistent-slot-definition) class)
+  (let ((readers (slot-definition-readers slot-definition))
+	(writers (slot-definition-writers slot-definition))
+	(class-name (class-name class)))
+    (loop for reader in readers
+	  do (make-persistent-reader reader slot-definition class class-name))
+    (loop for writer in writers
+	  do (make-persistent-writer writer slot-definition class class-name))))
+
+#+allegro
+(defmethod reinitialize-instance :around ((instance persistent-metaclass) &rest initargs &key &allow-other-keys)
+  (declare (ignore initargs))
+  (prog1
+      (call-next-method)
+    (when (class-finalized-p instance)
+      (update-persistent-slots instance (persistent-slot-names instance))
+      (update-indexed-record instance (indexed-slot-names-from-defs instance))
+      (set-db-synch instance :class)
+      (loop with persistent-slots = (persistent-slots instance)
+	    for slot-def in (class-direct-slots instance)
+	    when (member (slot-definition-name slot-def) persistent-slots)
+	    do (initialize-accessors slot-def instance))
+      (make-instances-obsolete instance))))
+
+;;
+;; CMU / SBCL
+;;
+
+#+(or cmu sbcl)
+(defun make-persistent-reader (name)
+  (lambda (instance)
+    (declare (optimize (speed 3))
+	     (type persistent-object instance))
+    (persistent-slot-reader (get-con instance) instance name)))
+
+#+(or cmu sbcl)
+(defun make-persistent-writer (name)
+  (lambda (new-value instance)
+    (declare (optimize (speed 3))
+	     (type persistent-object instance))
+    (persistent-slot-writer (get-con instance) new-value instance name)))
+
+#+(or cmu sbcl)
+(defun make-persistent-slot-boundp (name)
+  (lambda (instance)
+    (declare (optimize (speed 3))
+	     (type persistent-object instance))
+    (persistent-slot-boundp (get-con instance) instance name)))
+
+#+(or cmu sbcl)
+(defmethod initialize-internal-slot-functions ((slot-def persistent-slot-definition))
+  (let ((name (slot-definition-name slot-def)))
+    (setf (slot-definition-reader-function slot-def)
+	  (make-persistent-reader name))
+    (setf (slot-definition-writer-function slot-def)
+	  (make-persistent-writer name))
+    (setf (slot-definition-boundp-function slot-def)
+	  (make-persistent-slot-boundp name)))
+  slot-def)
+
+#+(or cmu sbcl openmcl)
+(defmethod reinitialize-instance :around ((instance persistent-metaclass) &rest initargs &key &allow-other-keys)
+  (declare (ignore initargs))
+  (prog1
+      (call-next-method)
+    (when (class-finalized-p instance)
+      (update-persistent-slots instance (persistent-slot-names instance))
+      (update-indexed-record instance (indexed-slot-names-from-defs instance))
+      (set-db-synch instance :class)
+;;      (initialize-internal-slot-functions 
+      (make-instances-obsolete instance))))
+
--- /project/elephant/cvsroot/elephant/src/elephant/metaclasses.lisp	2006/02/21 19:40:03	1.3
+++ /project/elephant/cvsroot/elephant/src/elephant/metaclasses.lisp	2006/02/22 21:03:47	1.4
@@ -326,37 +326,6 @@
 	when (eq (slot-definition-name slot-def) slot-name)
 	do (return slot-def)))
 
-#+(or cmu sbcl)
-(defun make-persistent-reader (name)
-  (lambda (instance)
-    (declare (optimize (speed 3))
-	     (type persistent-object instance))
-    (persistent-slot-reader (get-con instance) instance name)))
-
-#+(or cmu sbcl)
-(defun make-persistent-writer (name)
-  (lambda (new-value instance)
-    (declare (optimize (speed 3))
-	     (type persistent-object instance))
-    (persistent-slot-writer (get-con instance) new-value instance name)))
-
-#+(or cmu sbcl)
-(defun make-persistent-slot-boundp (name)
-  (lambda (instance)
-    (declare (optimize (speed 3))
-	     (type persistent-object instance))
-    (persistent-slot-boundp (get-con instance) instance name)))
-
-#+(or cmu sbcl)
-(defmethod initialize-internal-slot-functions ((slot-def persistent-slot-definition))
-  (let ((name (slot-definition-name slot-def)))
-    (setf (slot-definition-reader-function slot-def)
-	  (make-persistent-reader name))
-    (setf (slot-definition-writer-function slot-def)
-	  (make-persistent-writer name))
-    (setf (slot-definition-boundp-function slot-def)
-	  (make-persistent-slot-boundp name)))
-  slot-def)
 
 (defun persistent-slot-defs (class)
   (let ((slot-definitions (class-slots class)))
@@ -374,4 +343,7 @@
   (mapcar #'slot-definition-name (persistent-slot-defs class)))
 
 (defun transient-slot-names (class)
-  (mapcar #'slot-definition-name (transient-slot-defs class)))
\ No newline at end of file
+  (mapcar #'slot-definition-name (transient-slot-defs class)))
+
+
+




More information about the Elephant-cvs mailing list