[Change row reader and add functions make-insert-object-plist drewc@tech.coop**20090110022720 Ignore-this: 20bd451a286f79f404451bf217b945ba ] { hunk ./rofl.asd 1 + + + hunk ./src/db-access-object-sql.lisp 33 - (print `(:limit (:select + `(:limit (:select hunk ./src/db-access-object-sql.lisp 38 - ,n))))) + ,n)))) hunk ./src/db-access-object-sql.lisp 65 +(defun make-insert-object-plist (object) + (let ((class (class-of object)) + insert-query) + (flet + ((ins (slotd + &optional + (val + (slot-value-using-class class object slotd))) + (push (slot-definition-column-name slotd) insert-query) + (push val insert-query))) + + (loop :for slotd in (class-slots class) + :do (cond + ((slot-boundp-using-class class object slotd) + + (cond + ((slot-definition-foreign-type slotd) + (ins slotd + (let ((value + (slot-value-using-class class object slotd))) + (slot-value value (dao-id-column-name (class-of value))))) + ) + (t + (ins slotd)))) + ((slot-definition-primary-key-p slotd) + (setf (slot-value-using-class class object slotd) (get-default-value (class-table-name class) + (slot-definition-column-name slotd))) + (ins slotd )))) + + (let ((query (loop + :for (key val) + :on (nreverse insert-query) + :by #'cddr + :collect key into keys + :unless (find key (butlast keys)) + :nconc (list key val) into list + :finally (return list)))) + + + query)))) + hunk ./src/packages.lisp 14 + #:make-object hunk ./src/rofl.lisp 6 -(postmodern::def-row-reader symbol-plist-row-reader (fields) - (let ((symbols (map 'list (lambda (desc) - (postmodern::from-sql-name (postmodern::field-name desc))) fields))) - (loop :while (postmodern::next-row) - :collect (loop :for field :across fields - :for symbol :in symbols - :nconc (list symbol (postmodern::next-field field)))))) +(cl-postgres::def-row-reader plist-row-reader (fields) + (loop :while (cl-postgres::next-row) + :collect (loop :for field :across fields + :collect (postmodern::from-sql-name (cl-postgres:field-name field)) + :collect (cl-postgres::next-field field) + ))) + + hunk ./src/rofl.lisp 24 -(defvar *row-reader* 'symbol-plist-row-reader) +(defparameter *row-reader* 'plist-row-reader) hunk ./src/rofl.lisp 52 - ((column-name :initform nil - :initarg :db-name - :initarg :column - :accessor slot-definition-column-name + ((column-name :initform nil + :initarg :db-name + :initarg :column + :accessor slot-definition-column-name hunk ./src/rofl.lisp 58 - (primary-key :initform nil - :initarg :primary-key - :accessor slot-definition-primary-key-p) + (primary-key :initform nil + :initarg :primary-key + :accessor slot-definition-primary-key-p) hunk ./src/rofl.lisp 63 - "If non-NIL, this slot should be treated as transient and + "If non-NIL, this slot should be treated as transient and hunk ./src/rofl.lisp 65 - - (foreign-type - :initform nil + + (foreign-type + :initform nil hunk ./src/rofl.lisp 117 - (slot-definition-column-name slotd) - (or (let ((slot (find-if #'slot-definition-column-name direct-slot-definitions))) - (when slot - (slot-definition-column-name slot))) - name) + hunk ./src/rofl.lisp 127 + + (unless (slot-definition-foreign-relation slotd) + (setf (slot-definition-column-name slotd) + (or (let ((slot (find-if #'slot-definition-column-name direct-slot-definitions))) + (when slot + (slot-definition-column-name slot))) + name))) }