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

blee at common-lisp.net blee at common-lisp.net
Fri Aug 27 17:31:59 UTC 2004


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

Modified Files:
	controller.lisp 
Log Message:
license, name changes, with-transaction* defaulters

Date: Fri Aug 27 10:31:59 2004
Author: blee

Index: elephant/src/controller.lisp
diff -u elephant/src/controller.lisp:1.2 elephant/src/controller.lisp:1.3
--- elephant/src/controller.lisp:1.2	Thu Aug 26 19:58:09 2004
+++ elephant/src/controller.lisp	Fri Aug 27 10:31:59 2004
@@ -1,12 +1,51 @@
+;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;;;
+;;; controller.lisp -- Lisp interface to a Berkeley DB store
+;;; 
+;;; Initial version 8/26/2004 by Ben Lee
+;;; <blee at common-lisp.net>
+;;; 
+;;; part of
+;;;
+;;; Elephant: an object-oriented database for Common Lisp
+;;;
+;;; Copyright (c) 2004 by Andrew Blumberg and Ben Lee
+;;; <ablumberg at common-lisp.net> <blee at common-lisp.net>
+;;;
+;;; This program is free software; you can redistribute it
+;;; and/or modify it under the terms of the GNU General
+;;; Public License as published by the Free Software
+;;; Foundation; either version 2 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the
+;;; implied warranty of MERCHANTABILITY or FITNESS FOR A
+;;; PARTICULAR PURPOSE. See the GNU General Public License
+;;; for more details.
+;;;
+;;; The GNU General Public License can be found in the file
+;;; LICENSE which should have been distributed with this
+;;; code.  It can also be found at
+;;;
+;;; http://www.opensource.org/licenses/gpl-license.php
+;;;
+;;; You should have received a copy of the GNU General
+;;; Public License along with this program; if not, write
+;;; to the Free Software Foundation, Inc., 59 Temple Place,
+;;; Suite 330, Boston, MA 02111-1307 USA
+;;;
+
 (in-package "ELEPHANT")
 
 (defclass store-controller ()  
   ((path :type (or pathname string)
-	 :reader path
+	 :accessor controller-path
 	 :initarg :path)
-   (environment :type (or null pointer-void) :accessor environment)
-   (db :type (or null pointer-void) :accessor db)
-   (root :accessor root)
+   (environment :type (or null pointer-void) 
+		:accessor controller-environment)
+   (db :type (or null pointer-void) :accessor controller-db)
+   (root :reader controller-root)
    (instance-cache :accessor instance-cache
 		   :initform (make-cache-table :test 'eql)))
   (:documentation "Class of objects responsible for handling
@@ -20,11 +59,15 @@
 persistables as well (though note collection key semantics!)
 N.B. this means it (and everything it points to) won't get
 gc'd."
-  (setf (get-value key (root sc)) value))
+  (setf (get-value key (controller-root sc)) value))
 
 (defmethod get-from-root ((sc store-controller) key)
   "Get a persistent thing from the root."
-  (get-value key (root sc)))
+  (get-value key (controller-root sc)))
+
+(defmethod remove-from-root ((sc store-controller) key)
+  "Get a persistent thing from the root."
+  (remove-kv key (controller-root sc)))
 
 (defmethod cache-instance ((sc store-controller) obj)
   "Register an instance of a user persistent-class with the
@@ -32,38 +75,41 @@
   (setf (get-cache (oid obj) (instance-cache sc)) obj))
 
 (defmethod get-cached-instance ((sc store-controller) oid class-name)
-  (let ((obj (get-cache oid (instance-cache sc) nil)))
+  (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))))
 
-(defmethod open-controller ((sc store-controller))
+(defmethod open-controller ((sc store-controller) &key (recover nil)
+			    (recover-fatal nil) (thread t))
   "Opens the underlying environment and all the necessary
 database tables."
   (let ((env (db-env-create)))
     ;; thread stuff?
-    (setf (environment sc) env)
-    (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)
+    (setf (controller-environment sc) env)
+    (db-env-open env (controller-path sc) :create t :init-txn t :init-lock t 
+		 :init-mpool t :init-log t :thread thread
+		 :recover recover :recover-fatal recover-fatal)
     (let ((db (db-create env)))
-      (setf (db sc) db)
-      (db-open db :auto-commit t :type DB-BTREE :create t :thread t)
+      (setf (controller-db sc) db)
+      (db-open db :file "%ELEPHANT" :database "%ELEPHANTDB" 
+	       :auto-commit t :type DB-BTREE :create t :thread thread)
       (let ((root (make-instance 'btree :from-oid -1)))
-	(setf (root sc) root)
+	(setf (slot-value sc 'root) 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)
+  (setf (slot-value sc 'root) nil)
   ; clean instance cache
   (setf (instance-cache sc) (make-cache-table :test 'eql))
   ; close environment
-  (db-close (db sc))
-  (setf (db sc) nil)
-  (db-env-close (environment sc))
-  (setf (environment sc) nil)
+  (db-close (controller-db sc))
+  (setf (controller-db sc) nil)
+  (db-env-close (controller-environment sc))
+  (setf (controller-environment sc) nil)
   nil)
 
 (defmacro with-open-controller ((&optional (sc *store-controller*))
@@ -73,6 +119,43 @@
 	 (open-controller ,sc)
 	 , at body)
      (close-controller ,sc)))
+
+(defmacro with-transaction ((&key transaction 
+				  (environment (controller-environment
+						*store-controller*))
+				  (globally t)
+				  (parent *current-transaction*)
+				  dirty-read txn-nosync
+				  txn-nowait txn-sync)
+			    &body body)
+  `(sleepycat:with-transaction (:transaction ,transaction
+				:environment ,environment
+				:globally ,globally
+				:parent ,parent
+				:dirty-read ,dirty-read
+				:txn-nosync ,txn-nosync
+				:txn-nowait ,txn-nowait
+				:txn-sync ,txn-sync)
+    , at body))
+
+(defmacro with-transaction-retry ((&key transaction environment 
+					(globally t) 
+					(parent *current-transaction*)
+					(retries 100)
+					dirty-read txn-nosync 
+					txn-nowait txn-sync)
+				  &body body)
+  `(sleepycat:with-transaction-retry (:transaction ,transaction
+				      :environment ,environment
+				      :globally ,globally
+				      :parent ,parent
+				      :retries ,retries
+				      :dirty-read ,dirty-read
+				      :txn-nosync ,txn-nosync
+				      :txn-nowait ,txn-nowait
+				      :txn-sync ,txn-sync)
+    , at body))
+
 
 ;; This stuff is all a hack until sequences appear in Sleepycat 4.3
 (defconstant max-oid most-positive-fixnum)





More information about the Elephant-cvs mailing list