r9727: 1 Jul 2004 Kevin Rosenberg <kevin@rosenberg.net>
[clsql.git] / sql / oodml.lisp
index 329444363b6ed723dab505ae92e3ae5eaebd9441..d701f0906e3a2352cbf01262c8b4179f6b02990a 100644 (file)
          (sql-expression :table (view-table class))))
 
 
          (sql-expression :table (view-table class))))
 
 
-(defparameter *default-varchar-length* 255)
-
 (defmethod database-get-type-specifier (type args database db-type)
   (declare (ignore type args database db-type))
 (defmethod database-get-type-specifier (type args database db-type)
   (declare (ignore type args database db-type))
-  (format nil "VARCHAR(~D)" *default-varchar-length*))
+  (format nil "VARCHAR(~D)" *default-string-length*))
 
 (defmethod database-get-type-specifier ((type (eql 'integer)) args database db-type)
   (declare (ignore database db-type))
 
 (defmethod database-get-type-specifier ((type (eql 'integer)) args database db-type)
   (declare (ignore database db-type))
   (declare (ignore database db-type))
   (if args
       (format nil "VARCHAR(~A)" (car args))
   (declare (ignore database db-type))
   (if args
       (format nil "VARCHAR(~A)" (car args))
-      (format nil "VARCHAR(~D)" *default-varchar-length*)))
+      (format nil "VARCHAR(~D)" *default-string-length*)))
 
 (defmethod database-get-type-specifier ((type (eql 'string)) args database db-type)
   (declare (ignore database db-type))
   (if args
       (format nil "CHAR(~A)" (car args))
 
 (defmethod database-get-type-specifier ((type (eql 'string)) args database db-type)
   (declare (ignore database db-type))
   (if args
       (format nil "CHAR(~A)" (car args))
-      (format nil "VARCHAR(~D)" *default-varchar-length*)))
+      (format nil "VARCHAR(~D)" *default-string-length*)))
 
 (deftype universal-time () 
   "A positive integer as returned by GET-UNIVERSAL-TIME."
 
 (deftype universal-time () 
   "A positive integer as returned by GET-UNIVERSAL-TIME."
@@ -1081,3 +1079,27 @@ as elements of a list."
   results)
 
 
   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))))