diff --git a/storage/storage.lisp b/storage/storage.lisp index 3914a65..e25ffbd 100644 --- a/storage/storage.lisp +++ b/storage/storage.lisp @@ -67,7 +67,7 @@ ;(util:logd sql args) (let* ((qp (dbi:prepare (conn st) sql)) (qx (dbi:execute qp args))) - (dbi:fetch-all qx)))) + (mapcar #'normalize-plist (dbi:fetch-all qx))))) (defun do-sql (st spec) (multiple-value-bind (sql args) (sxql:yield spec) diff --git a/storage/tracking.lisp b/storage/tracking.lisp index c559a4e..141da23 100644 --- a/storage/tracking.lisp +++ b/storage/tracking.lisp @@ -69,18 +69,12 @@ (insert track new-data) (update track new-data)))))) -(defun query-one (cont crit &key (order-by '(:trackid))) +(defun query-one (cont crit &key order-by) (util:lgd crit) (let* ((tr (make-item cont)) (st (storage cont)) - (table (storage:qualified-table-name st (table-name cont))) - (cols (cons :trackid (append (shape:head-fields tr) '(:timestamp :data)))) - (row (storage:normalize-plist (car (storage:query st - (sxql:select cols - (sxql:from table) - (sxql:where crit) - (sxql:order-by (values-list order-by)) - (sxql:limit 1))))))) + (row (car (storage:query st + (setup-select cont crit :order-by order-by :limit 1))))) (setup-track tr row))) (defun insert (track &optional data) @@ -106,6 +100,19 @@ ;;;; auxiliary functions for queries, ... +(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)))) + (clauses)) + (if limit + (push (sxql:limit limit) clauses)) + (if order-by + (push (sxql:order-by (values-list order-by)) clauses)) + (sxql:select cols + (sxql:from table) + (sxql:where crit) + (values-list clauses)))) + (defun make-where (specs) (let (crit) (dolist (spec specs)