[elephant-cvs] CVS update: elephant/src/controller.lisp

blee at common-lisp.net blee at common-lisp.net
Fri Aug 27 02:58:09 UTC 2004


Update of /project/elephant/cvsroot/elephant/src
In directory common-lisp.net:/tmp/cvs-serv23899/src

Modified Files:
	controller.lisp 
Log Message:
the great simplification effort - specials

Date: Thu Aug 26 19:58:09 2004
Author: blee

Index: elephant/src/controller.lisp
diff -u elephant/src/controller.lisp:1.1.1.1 elephant/src/controller.lisp:1.2
--- elephant/src/controller.lisp:1.1.1.1	Thu Aug 19 10:05:14 2004
+++ elephant/src/controller.lisp	Thu Aug 26 19:58:09 2004
@@ -1,21 +1,14 @@
 (in-package "ELEPHANT")
 
-(defparameter *store-controller* nil 
-  "The default store controller which persistent objects talk to.")
-
 (defclass store-controller ()  
-  ((path :reader path
+  ((path :type (or pathname string)
+	 :reader path
 	 :initarg :path)
-   (environment :accessor environment)
+   (environment :type (or null pointer-void) :accessor environment)
+   (db :type (or null pointer-void) :accessor db)
    (root :accessor root)
-   ;(oid-counter :reader oid-counter)
-   (persistent-classes :accessor persistent-classes
-		       :initform (make-hash-table))
-   (collections :accessor collections
-		:initform (make-hash-table :test 'eql))
    (instance-cache :accessor instance-cache
-		   :initform (make-hash-table :test 'eql))
-   (dbs :accessor dbs :initform nil))
+		   :initform (make-cache-table :test 'eql)))
   (:documentation "Class of objects responsible for handling
 the book-keeping of holding DB handles, the cache, table
 creation, counters, locks, the root and garbage collection,
@@ -33,112 +26,58 @@
   "Get a persistent thing from the root."
   (get-value key (root sc)))
 
-(defmethod register-class-slots ((sc store-controller) class slots)
-  "Register a user-defined subclass of persistent-class with
-the controller."
-  (setf (gethash class (persistent-classes sc)) slots))
-
-(defmethod register-class-slots (sc class slots)
-  nil)
-
-(defmethod register-collection ((sc store-controller) col)
-  "Register a collection instance with the controller."
-  (setf (gethash (oid col) (collections sc)) col))
-
-(defmethod register-instance ((sc store-controller) obj)
+(defmethod cache-instance ((sc store-controller) obj)
   "Register an instance of a user persistent-class with the
 controller."
-  (setf (gethash (oid obj) (instance-cache sc)) obj))
+  (setf (get-cache (oid obj) (instance-cache sc)) obj))
 
-(defmethod open-controller ((sc store-controller) &key recover)
+(defmethod get-cached-instance ((sc store-controller) oid class-name)
+  (let ((obj (get-cache oid (instance-cache sc) nil)))
+    (if obj obj
+	;; Should get cached since make-instance calls cache-instance
+	(make-instance class-name :from-oid oid))))
+
+(defmethod open-controller ((sc store-controller))
   "Opens the underlying environment and all the necessary
-database tables.  Initializes registered persistent-classes."
-  (let ((env (db-create-environment)))
+database tables."
+  (let ((env (db-env-create)))
     ;; thread stuff?
-    (db-open-environment env (path sc) :create t :recover recover)
     (setf (environment sc) env)
-    (let ((root (make-instance 'p-btree :from-oid -1
-			       :store-controller sc)))
-      (setf (root sc) root)
-      (initialize-classes sc)
-      sc)))
-
-(defmethod initialize-classes ((sc store-controller))
-  "Setup class slots which point to the tables which store
-the persisted slots.  This is hacky because i don't know how
-to set the class-slots of a class without an instance"
-  (loop for pclass being the hash-key in (persistent-classes sc) using (hash-value slots)
-	for obj = (make-instance pclass :from-oid -1 :store-controller sc)
-	do
-	(remhash -1 (instance-cache sc))
-	(loop for slot in slots
-	      for db = (create-table sc (concatenate 'string "CLASS:"
-						     (symbol-name pclass))
-				     (symbol-name slot)
-				     :type :btree)
-	      do (setf (slot-value obj slot) db))))
+    (db-env-open env (path sc) :create t :init-txn t :init-lock t 
+		 :init-mpool t :init-log t :thread t :recover-fatal t)
+    (let ((db (db-create env)))
+      (setf (db sc) db)
+      (db-open db :auto-commit t :type DB-BTREE :create t :thread t)
+      (let ((root (make-instance 'btree :from-oid -1)))
+	(setf (root sc) root)
+	sc))))
 
 (defmethod close-controller ((sc store-controller))
   "Close the db handles and environment.  Tries to wipe out
 references to the db handles."
   ; no root
   (setf (root sc) nil)
-  ; clean collections
-  (maphash #'(lambda (k v) (declare (ignore k))
-	       (setf (db v) nil))
-	   (collections sc))
-  (setf (collections sc) (make-hash-table :test 'eql))
-  ; clean classes
-  (deinitialize-classes sc)
-  ;(setf (persistent-classes sc) (make-hash-table))
-  ; close dbs
-  (mapc #'(lambda (v) (db-close v)) (dbs sc))
-  (setf (dbs sc) nil)
   ; clean instance cache
-  (setf (instance-cache sc) (make-hash-table :test 'eql))
+  (setf (instance-cache sc) (make-cache-table :test 'eql))
   ; close environment
-  (db-close (environment sc))
+  (db-close (db sc))
+  (setf (db sc) nil)
+  (db-env-close (environment sc))
   (setf (environment sc) nil)
-  t)
-
-(defmethod deinitialize-classes ((sc store-controller))
-  (loop for pclass being the hash-key in (persistent-classes sc) using (hash-value slots)
-	for obj = (make-instance pclass :from-oid -1)
-	do
-	(remhash -1 (instance-cache sc))))
-
-;; diked out, since our new methodology doesn't allow this
-;; (loop for slot in slots 
-;;	do (setf obj slot nil))))
-
-(defmethod create-table ((sc store-controller) file name &rest args)
-  (let ((db (db-create :environment (environment sc))))
-    (apply #'db-open `(,db ,file ,name :create t :auto-commit t , at args))
-    (push db (dbs sc))
-    db))
-
-(defmethod get-instance ((sc store-controller) oid classname)
-  (let ((obj (gethash oid (instance-cache sc) nil)))
-    (if obj obj
-	(setf (gethash oid (instance-cache sc))
-	      (make-instance (find-class (intern classname))
-			     :from-oid oid)))))
-
-(defmethod get-collection ((sc store-controller) oid class)
-  (gethash oid (collections sc)
-	   :default (make-instance class :from-oid oid)))
-
-(defconstant max-oid (- (expt 2 64) 1))
-
-(defmethod next-oid ((sc store-controller))
-  (random max-oid))
+  nil)
 
-(defmacro with-open-controller ((&optional (sc *store-controller*)
-					   &key recover)
+(defmacro with-open-controller ((&optional (sc *store-controller*))
 				&body body)
   `(unwind-protect
        (progn
-	 (open-controller ,sc :recover ,recover)
+	 (open-controller ,sc)
 	 , at body)
      (close-controller ,sc)))
+
+;; This stuff is all a hack until sequences appear in Sleepycat 4.3
+(defconstant max-oid most-positive-fixnum)
+
+(defmethod next-oid ((sc store-controller))
+  (random max-oid))
+
      





More information about the Elephant-cvs mailing list