+13 Jun 2004 Kevin Rosenberg <kevin@rosenberg.net>
+ * sql/oodml.lisp: Add new serialization functions:
+ WRITE-INSTANCE-TO-STREAM and READ-INSTANCE-FROM-STREAM
+ * sql/expressions.lisp: Avoid duplicate FROM names when selecting
+ from a table that has more than one primary index.
+
13 Jun 2004 Kevin Rosenberg <kevin@rosenberg.net>
* Version 2.11.9
* sql/conditions.lisp: Set initial slot value for message in SQL-WARNING
(when from
(write-string " FROM " *sql-stream*)
(typecase from
- (list (output-sql (apply #'vector from) database))
+ (list (output-sql (apply #'vector (remove-duplicates
+ from
+ :test #'(lambda (a b)
+ (string-equal (symbol-name (slot-value a 'name))
+ (symbol-name (slot-value b 'name))))))
+ database))
(string (write-string from *sql-stream*))
(t (output-sql from database))))
(when inner-join
results)
+
+;;; Serialization functions
+
+(defun write-instance-to-stream (obj stream)
+ "Writes an instance to a stream where it can be later be read.
+NOTE: an error will occur if a slot holds a value which can not be written readably."
+ (let* ((class (class-of obj))
+ (alist '()))
+ (dolist (slot (ordered-class-slots (class-of obj)))
+ (let ((name (slot-definition-name slot)))
+ (when (and (not (eq 'view-database name))
+ (slot-boundp obj name))
+ (push (cons name (slot-value obj name)) alist))))
+ (setq alist (reverse alist))
+ (write (cons (class-name class) alist) :stream stream :readably t))
+ obj)
+
+(defun read-instance-from-stream (stream)
+ (let ((raw (read stream nil nil)))
+ (when raw
+ (let ((obj (make-instance (car raw))))
+ (dolist (pair (cdr raw))
+ (setf (slot-value obj (car pair)) (cdr pair)))
+ obj))))
#:delete-instance-records
;; CLSQL Extensions
#:*db-auto-sync*
-
+ #:write-instance-to-stream
+ #:read-instance-from-stream
+
;; Symbolic SQL Syntax (syntax.lisp)
#:sql
#:sql-expression