diff --git a/storage/tracking.lisp b/storage/tracking.lisp index e02b60a..a9e1c47 100644 --- a/storage/tracking.lisp +++ b/storage/tracking.lisp @@ -66,39 +66,50 @@ (force-insert (force-insert-when cont))) (if (eql force-insert :always) (insert track) - (let* ((new-data (shape:data track)) - (found (query-last cont (shape:head-plist track)))) - (if (null found) - (insert track new-data) - (unless (util:plist-equal (shape:data found) new-data) + (let ((found (query-last cont (shape:head-plist track)))) + (if found + (if (track-equal found track) + found (if (eql force-insert :changed) - (insert track new-data) - (update track new-data)))))))) + (insert track) + (progn + (unless (timestamp track) + (setf (timestamp track) (timestamp found))) + (update track) + (setf (trackid track) (trackid found)) + track))) + (insert track)))))) -(defun insert (track &optional data) +(defun insert (track) (ensure-timestamp track) (let* ((cont (container track)) (st (storage cont)) (table (storage:qualified-table-name st (table-name cont))) (res (car (storage:query st (sxql:insert-into table - (apply #'sxql:make-clause ':set= (plist track data)) + (apply #'sxql:make-clause ':set= (plist track)) (sxql:returning :trackid)))))) (setf (trackid track) (cadr res)) track)) -(defun update (track &optional data) +(defun update (track) (ensure-timestamp track) (let* ((cont (container track)) (st (storage cont)) (table (storage:qualified-table-name st (table-name cont)))) (storage:do-sql st (sxql:update table - (apply #'sxql:make-clause ':set= (plist track data)) + (apply #'sxql:make-clause ':set= (plist track)) (where (:= :trackid (trackid track))))))) ;;;; auxiliary functions for queries, ... +(defun track-equal (old new) + (if (timestamp new) + (unless (equal (timestamp new) (timestamp old)) + (return-from track-equal nil))) + (util:plist-equal (shape:data old) (shape:data new))) + (defun setup-select (cont crit &key order-by limit) (let ((table (storage:qualified-table-name (storage cont) (table-name cont))) (cols (cons :trackid (append (item-head-fields cont) '(:timestamp :data)))) @@ -144,9 +155,9 @@ (if (not (timestamp track)) (setf (timestamp track) (get-universal-time)))) -(defun plist (track &optional data) +(defun plist (track) (let ((vl (shape:head-plist track)) - (data (or data (shape:data track)))) + (data (shape:data track))) (with-slots ((trid trackid) (ts timestamp)) track (when trid (setf (getf vl :trackid) trid)) (when ts (setf (getf vl :timestamp) (timestamp-to-sql track ts)))