fix util:rtrim; work in progress: tracking:save

This commit is contained in:
Helmut Merz 2024-07-31 13:42:37 +02:00
parent 1ac8eb6482
commit 2b2519498f
3 changed files with 20 additions and 10 deletions

View file

@ -52,6 +52,16 @@
(query1 cont (make-where (list (list :trackid trid))))) (query1 cont (make-where (list (list :trackid trid)))))
;(query1 cont (list := :trackid trid))) ;(query1 cont (list := :trackid trid)))
(defun save (cont track)
(let ((*build-track-data* #'identity)
(tr0 (query-last cont (shape:head-plist track)))
(new-data (alx:plist-hash-table (shape:data track))))
(if tr0
(if (equalp (shape:data tr0) new-data)
nil ; or insert <= insert-when == :always
(update track new-data)) ; or insert <= insert-when == :changed
(insert track new-data))))
(defun query1 (cont crit) (defun query1 (cont crit)
(let* ((tr (make-item cont)) (let* ((tr (make-item cont))
(st (storage cont)) (st (storage cont))
@ -65,25 +75,25 @@
(sxql:limit 1))))))) (sxql:limit 1)))))))
(setup-track tr row))) (setup-track tr row)))
(defun insert (track) (defun insert (track &optional data)
(ensure-timestamp track) (ensure-timestamp track)
(let* ((cont (container track)) (let* ((cont (container track))
(st (storage cont)) (st (storage cont))
(table (storage:qualified-table-name st (table-name cont))) (table (storage:qualified-table-name st (table-name cont)))
(res (car (storage:query st (res (car (storage:query st
(sxql:insert-into table (sxql:insert-into table
(apply #'sxql:make-clause ':set= (plist track)) (apply #'sxql:make-clause ':set= (plist track data))
(sxql:returning :trackid)))))) (sxql:returning :trackid))))))
(setf (trackid track) (cadr res)) (setf (trackid track) (cadr res))
track)) track))
(defun update (track) (defun update (track &optional data)
(ensure-timestamp track) (ensure-timestamp track)
(let* ((cont (container track)) (let* ((cont (container track))
(st (storage cont)) (st (storage cont))
(table (storage:qualified-table-name st (table-name cont)))) (table (storage:qualified-table-name st (table-name cont))))
(sxql:update table (sxql:update table
(apply #'sxql:make-clause ':set= (plist track)) (apply #'sxql:make-clause ':set= (plist track data))
(where (:= :trackid (trackid track)))))) (where (:= :trackid (trackid track))))))
;;;; auxiliary functions for queries, ... ;;;; auxiliary functions for queries, ...
@ -118,9 +128,10 @@
(if (not (time-stamp track)) (if (not (time-stamp track))
(setf (time-stamp track) (get-universal-time)))) (setf (time-stamp track) (get-universal-time))))
(defun plist (track) (defun plist (track &optional data)
(let ((vl (shape:head-plist track))) (let ((vl (shape:head-plist track))
(with-slots ((trid trackid) (ts time-stamp) (data shape:data)) track (data (or data (shape:data track))))
(with-slots ((trid trackid) (ts time-stamp)) track
(when trid (setf (getf vl :trackid) trid)) (when trid (setf (getf vl :trackid) trid))
(when ts (setf (getf vl :timestamp) (timestamp-to-sql track ts))) (when ts (setf (getf vl :timestamp) (timestamp-to-sql track ts)))
(when data (when data

View file

@ -62,7 +62,7 @@
(t:show-result)))) (t:show-result))))
(deftest test-util () (deftest test-util ()
(== (util:rtrim '(1 2 nil 3 nil)) '(1 2)) (== (util:rtrim '(1 2 nil 3 nil)) '(1 2 nil 3))
(== (util:to-keyword "hello-kitty") :hello-kitty) (== (util:to-keyword "hello-kitty") :hello-kitty)
(== (util:loop-plist '(:a "a" :b "b") k v collect (string-upcase k)) '("A" "B"))) (== (util:loop-plist '(:a "a" :b "b") k v collect (string-upcase k)) '("A" "B")))

View file

@ -12,8 +12,7 @@
;;;; lists and loops ;;;; lists and loops
(defun rtrim (lst) (defun rtrim (lst)
(if (car lst) (nreverse (member-if #'identity (reverse lst))))
(cons (car lst) (rtrim (cdr lst)))))
(defmacro loop-plist (plist kvar vvar &body body) (defmacro loop-plist (plist kvar vvar &body body)
`(loop for (,kvar ,vvar . nil) on ,plist by #'cddr ,@body)) `(loop for (,kvar ,vvar . nil) on ,plist by #'cddr ,@body))