X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Foodml.lisp;h=d701f0906e3a2352cbf01262c8b4179f6b02990a;hp=329444363b6ed723dab505ae92e3ae5eaebd9441;hb=bb71f27c241187a32c7839aea501114d65e29f85;hpb=a050eddab954ab3045d8427cf0c5563142266833 diff --git a/sql/oodml.lisp b/sql/oodml.lisp index 3294443..d701f09 100644 --- a/sql/oodml.lisp +++ b/sql/oodml.lisp @@ -307,11 +307,9 @@ (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)) - (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)) @@ -336,13 +334,13 @@ (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)) - (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." @@ -1081,3 +1079,27 @@ as elements of a list." 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))))