Update of /project/cl-prevalence/cvsroot/cl-prevalence/src
In directory common-lisp.net:/tmp/cvs-serv18557/src
Modified Files:
package.lisp prevalence.lisp
Log Message:
preparing to support new serialization protocol
Date: Mon Jun 21 08:26:21 2004
Author: scaekenberghe
Index: cl-prevalence/src/package.lisp
diff -u cl-prevalence/src/package.lisp:1.2 cl-prevalence/src/package.lisp:1.3
--- cl-prevalence/src/package.lisp:1.2 Mon Jun 21 07:38:39 2004
+++ cl-prevalence/src/package.lisp Mon Jun 21 08:26:21 2004
@@ -1,6 +1,6 @@
;;;; -*- Mode: LISP -*-
;;;;
-;;;; $Id: package.lisp,v 1.2 2004/06/21 14:38:39 scaekenberghe Exp $
+;;;; $Id: package.lisp,v 1.3 2004/06/21 15:26:21 scaekenberghe Exp $
;;;;
;;;; Package definitions for the CL-PREVALENCE project
;;;;
@@ -39,6 +39,7 @@
#:transaction
#:no-rollback-error
#:initiates-rollback
+ #:totally-destroy
#:print-transaction-log #:show-transaction-log #:print-snapshot #:transaction-log-tail
Index: cl-prevalence/src/prevalence.lisp
diff -u cl-prevalence/src/prevalence.lisp:1.1.1.1 cl-prevalence/src/prevalence.lisp:1.2
--- cl-prevalence/src/prevalence.lisp:1.1.1.1 Sun Jun 20 12:13:39 2004
+++ cl-prevalence/src/prevalence.lisp Mon Jun 21 08:26:21 2004
@@ -1,6 +1,6 @@
;;;; -*- mode: Lisp -*-
;;;;
-;;;; $Id: prevalence.lisp,v 1.1.1.1 2004/06/20 19:13:39 scaekenberghe Exp $
+;;;; $Id: prevalence.lisp,v 1.2 2004/06/21 15:26:21 scaekenberghe Exp $
;;;;
;;;; Object Prevalence in Common Lisp
;;;;
@@ -64,6 +64,9 @@
(defgeneric backup (system &key directory)
(:documentation "Make backup copies of the current snapshot and transaction-log files"))
+(defgeneric totally-destroy (system &key abort)
+ (:documentation "Totally destroy system from permanent storage by deleting any files that we find"))
+
;;; Classes
(defclass prevalence-system ()
@@ -81,7 +84,16 @@
:accessor get-transaction-log)
(transaction-log-stream ;; :type stream
:accessor get-transaction-log-stream
- :initform nil))
+ :initform nil)
+ (serializer ;; type function
+ :accessor get-serializer
+ :initform #'serialize-xml)
+ (deserializer ;; type function
+ :accessor get-deserializer
+ :initform #'deserialize-xml)
+ (file-extension ;; type string
+ :accessor get-file-extension
+ :initform "xml"))
(:documentation "Base Prevalence system implementation object"))
(defclass guarded-prevalence-system (prevalence-system)
@@ -114,8 +126,11 @@
(declare (ignore initargs))
(with-slots (directory) system
(ensure-directories-exist directory)
- (setf (get-snapshot system) (merge-pathnames "snapshot.xml" directory)
- (get-transaction-log system) (merge-pathnames "transaction-log.xml" directory)))
+ (setf (get-snapshot system) (merge-pathnames (make-pathname :name "snapshot" :type (get-file-extension system))
+ directory)
+ (get-transaction-log system) (merge-pathnames (make-pathname :name "transaction-log"
+ :type (get-file-extension system))
+ directory)))
(restore system))
(defmethod get-transaction-log-stream :before ((system prevalence-system))
@@ -134,11 +149,13 @@
(setf transaction-log-stream nil))))
(defmethod totally-destroy ((system prevalence-system) &key abort)
- "Totally destroy system from permanent storage by deleting any xml files that we find"
+ "Totally destroy system from permanent storage by deleting any files that we find"
(close-open-streams system :abort abort)
(when (probe-file (get-directory system))
- (dolist (pathname (directory (merge-pathnames "*.xml" (get-directory system))))
- (delete-file pathname))))
+ (dolist (pathname (directory (merge-pathnames (make-pathname :type (get-file-extension system))
+ (get-directory system))))
+ (delete-file pathname)))
+ (clrhash (get-root-objects system)))
(defmethod print-object ((transaction transaction) stream)
(format stream "#<TRANSACTION ~a ~a>"
@@ -174,7 +191,7 @@
(restore system)))))
(execute-on transaction system)))
(out (get-transaction-log-stream system)))
- (serialize-xml transaction out *serialization-state*)
+ (funcall (get-serializer system) transaction out *serialization-state*)
(terpri out)
(finish-output out)
result))
@@ -212,12 +229,16 @@
(snapshot (get-snapshot system)))
(close-open-streams system)
(when (probe-file snapshot)
- (copy-file snapshot (merge-pathnames (format nil "snapshot-~a.xml" timetag) snapshot)))
+ (copy-file snapshot (merge-pathnames (make-pathname :name (format nil "snapshot-~a" timetag)
+ :type (get-file-extension system))
+ snapshot)))
(with-open-file (out snapshot
:direction :output :if-does-not-exist :create :if-exists :supersede)
- (serialize-xml (get-root-objects system) out *serialization-state*))
+ (funcall (get-serializer system) (get-root-objects system) out *serialization-state*))
(when (probe-file transaction-log)
- (copy-file transaction-log (merge-pathnames (format nil "transaction-log-~a.xml" timetag) transaction-log))
+ (copy-file transaction-log (merge-pathnames (make-pathname :name (format nil "transaction-log-~a" timetag)
+ :type (get-file-extension system))
+ transaction-log))
(delete-file transaction-log))))
(defmethod backup ((system prevalence-system) &key directory)
@@ -225,9 +246,11 @@
(let* ((timetag (timetag))
(transaction-log (get-transaction-log system))
(snapshot (get-snapshot system))
- (transaction-log-backup (merge-pathnames (format nil "transaction-log-~a.xml" timetag)
+ (transaction-log-backup (merge-pathnames (make-pathname :name (format nil "transaction-log-~a" timetag)
+ :type (get-file-extension system))
(or directory transaction-log)))
- (snapshot-backup (merge-pathnames (format nil "snapshot-~a.xml" timetag)
+ (snapshot-backup (merge-pathnames (make-pathname :name (format nil "snapshot-~a" timetag)
+ :type (get-file-extension system))
(or directory snapshot))))
(close-open-streams system)
(when (probe-file transaction-log)
@@ -242,7 +265,7 @@
(close-open-streams system)
(when (probe-file (get-snapshot system))
(with-open-file (in (get-snapshot system) :direction :input)
- (setf (get-root-objects system) (deserialize-xml in *serialization-state*))))
+ (setf (get-root-objects system) (funcall (get-deserializer system) in *serialization-state*))))
(when (probe-file (get-transaction-log system))
(let ((position 0))
(handler-bind ((s-xml:xml-parser-error
@@ -252,7 +275,7 @@
(return-from restore))))
(with-open-file (in (get-transaction-log system) :direction :input)
(loop
- (let ((transaction (deserialize-xml in *serialization-state*)))
+ (let ((transaction (funcall (get-deserializer system) in *serialization-state*)))
(setf position (file-position in))
(if transaction
(execute-on transaction system)