Hello!
Current cl-prevalence version does not allow to set specific
:external-format when reading or writing files. This is very
uncomfortable when current working encoding in application differs from
the system locale's one: cl recodes strings on serializing.
Please check this patchset implementing the feature (cumulative with
my previous bugfixes for "serialize-sexp-external" and "backup").
Maybe there are some crossplatform-related changes required.
% hg diff
diff -r 1edf5cd93bb9
src/prevalence.lisp
--- a/src/prevalence.lisp Sun Jul 26 11:10:13 2009
+0200
+++ b/src/prevalence.lisp Tue Sep 08 22:44:04 2009
+0400
@@ -103,7 +103,11
@@
(transaction-hook ;; type
function
:accessor
get-transaction-hook
:initarg
:transaction-hook
- :initform
#'identity))
+ :initform
#'identity)
+ (external-format ;; external encoding for file
operations
+ :reader
get-external-format
+ :initarg
:external-format
+ :initform
:utf-8))
(:documentation "Base Prevalence system implementation
object"))
(defclass guarded-prevalence-system
(prevalence-system)
@@ -156,7 +160,8
@@
(setf transaction-log-stream (open (get-transaction-log
system)
:direction
:output
:if-does-not-exist
:create
- :if-exists
:append)))))
+ :if-exists
:append
+ :external-format
(get-external-format system))))))
(defmethod close-open-streams ((system prevalence-system) &key
abort)
"Close all open stream associated with system (optionally aborting
operations in progress)"
@@ -242,7 +247,7
@@
:type
(get-file-extension system))
snapshot)))
(with-open-file (out
snapshot
- :direction :output :if-does-not-exist :create
:if-exists :supersede)
+ :direction :output :if-does-not-exist :create
:if-exists :supersede :external-format (get-external-format
system))
(funcall (get-serializer system) (get-root-objects system) out
(get-serialization-state system)))
(when (probe-file
transaction-log)
(copy-file transaction-log (merge-pathnames (make-pathname :name
(get-transaction-log-filename system timetag)
@@ -273,7 +278,7
@@
(clrhash (get-root-objects
system))
(close-open-streams
system)
(when (probe-file (get-snapshot
system))
- (with-open-file (in (get-snapshot system) :direction
:input)
+ (with-open-file (in (get-snapshot system) :direction :input
:external-format (get-external-format system))
(setf (get-root-objects system) (funcall (get-deserializer
system) in (get-serialization-state system)))))
(when (probe-file (get-transaction-log
system))
(let ((position
0))
@@ -284,7 +289,7
@@
condition)
(truncate-file (get-transaction-log system)
position)
(return-from
restore))))
- (with-open-file (in (get-transaction-log system) :direction
:input)
+ (with-open-file (in (get-transaction-log system) :direction
:input :external-format (get-external-format system))
(loop
(let ((transaction (funcall (get-deserializer system) in
(get-serialization-state system))))
(setf position (file-position
in))
@@ -310,7 +315,7
@@
(defmethod backup ((system guarded-prevalence-system) &key
directory)
"Do a backup on a system controlled by a
guard"
(funcall (get-guard
system)
- #'(lambda () (call-next-method system directory))))
+ #'(lambda () (call-next-method system :directory directory))))
(defmethod restore ((system guarded-prevalence-system))
"Restore a system controlled by a guard"
@@ -343,8 +348,8 @@
(buffer (make-string 4096))
(index 0)
(read-count 0))
- (with-open-file (in file :direction :input)
- (with-open-file (out tmp-file :direction :output :if-exists
:overwrite :if-does-not-exist :create)
+ (with-open-file (in file :direction :input :external-format
(get-external-format system))
+ (with-open-file (out tmp-file :direction :output :if-exists
:overwrite :if-does-not-exist :create :external-format
(get-external-format system))
(when (> position (file-length in)) (return-from truncate-file))
(loop
(when (= index position) (return))
@@ -360,8 +365,8 @@
(defun copy-file (source target)
(let ((buffer (make-string 4096))
(read-count 0))
- (with-open-file (in source :direction :input)
- (with-open-file (out target :direction :output :if-exists
:overwrite :if-does-not-exist :create)
+ (with-open-file (in source :direction :input :external-format
(get-external-format system))
+ (with-open-file (out target :direction :output :if-exists
:overwrite :if-does-not-exist :create :external-format
(get-external-format system))
(loop
(setf read-count (read-sequence buffer in))
(write-sequence buffer out :end read-count)
diff -r 1edf5cd93bb9 src/serialization/sexp.lisp
--- a/src/serialization/sexp.lisp Sun Jul 26 11:10:13 2009 +0200
+++ b/src/serialization/sexp.lisp Tue Sep 08 22:44:04 2009 +0400
@@ -145,8 +145,9 @@
(write-string " . " stream)
(serialize-sexp-internal (slot-value object slot)
stream serialization-state)
(write-string ")" stream))
- serializable-slots))
- (write-string " ) )" stream)))))
+ serializable-slots)
+ (write-string " )" stream))
+ (write-string " )" stream)))))
;;; objects
(defmethod serialize-sexp-internal ((object standard-object) stream
serialization-state)