Index: dashboard.scm ================================================================== --- dashboard.scm +++ dashboard.scm @@ -2624,38 +2624,46 @@ dbstr (if (equal? (car parts) "sqlite3") (cadr parts) (begin (debug:print 0 *default-log-port* "ERROR: I only know sqlite3 databases for now: " dbstr) - (cadr parts)))))) - (if (file-read-access? dbpth) + #f))))) + (if (and dbpth (file-read-access? dbpth)) (let ((db (sqlite3:open-database dbpth))) ;; (open-database dbpth))) (sqlite3:set-busy-handler! db (make-busy-timeout 10000)) - db)))) + db) + #f))) +;; sqlite3:path tablename timefieldname varfieldname field1 field2 ... +;; (define (dboard:graph-read-data cmdstring tstart tend) (let* ((parts (string-split cmdstring))) ;; spaces not allowed - (if (< (length parts) 4) ;; sqlite3:path tablename timefieldname field1 field2 ... + (if (< (length parts) 6) ;; sqlite3:path tablename timefieldname varfname valfname field1 field2 ... (debug:print 0 *default-log-port* "ERROR: malformed graph line: " cmdstring) - (let* ((dbdef (car parts)) - (tablen (cadr parts)) - (timef (caddr parts)) - (fields (cdddr parts)) + (let* ((dbdef (list-ref parts 0)) + (tablen (list-ref parts 1)) + (timef (list-ref parts 2)) + (varfn (list-ref parts 3)) + (valfn (list-ref parts 4)) + (fields (cdr (cddddr parts))) (db (dboard:graph-db-open dbdef)) (res (make-hash-table))) - (for-each - (lambda (fieldname) ;; fields - (let ((qrystr (conc "SELECT " timef ",var,val FROM " tablen " WHERE var='" fieldname "' AND " timef " >= " tstart " AND " timef " <= " tend " ORDER BY " timef " ASC"))) - (print "qrystr: " qrystr) - (hash-table-set! res fieldname ;; (fetch-rows (sql db qrystr))))) - (sqlite3:fold-row - (lambda (res t var val) - (cons (vector t var val) res)) - '() db qrystr)))) - fields) - res)))) - + (if db + (begin + (for-each + (lambda (fieldname) ;; fields + (let ((qrystr (conc "SELECT " timef "," varfn "," valfn " FROM " tablen " WHERE " varfn "='" fieldname "' AND " timef " >= " tstart " AND " timef " <= " tend " ORDER BY " timef " ASC"))) + (print "qrystr: " qrystr) + (hash-table-set! res fieldname ;; (fetch-rows (sql db qrystr))))) + (sqlite3:fold-row + (lambda (res t var val) + (cons (vector t var val) res)) + '() db qrystr)))) + fields) + res) + #f))))) + ;; graph data ;; tsc=timescale, tfn=function; time->x ;; (define (dboard:graph commondat tabdat tabnum llx lly ulx uly tstart tend tsc tfn compname cmargin) (let* ((dwg (dboard:tabdat-drawing tabdat)) @@ -2668,33 +2676,34 @@ cmp (vg:make-rect-obj llx lly ulx uly)) (for-each (lambda (cf) (let* ((alldat (dboard:graph-read-data (cadr cf) tstart tend))) - (for-each - (lambda (fieldn) - (let* ((dat (hash-table-ref alldat fieldn )) - (vals (map (lambda (x)(vector-ref x 2)) dat))) - (if (not (null? vals)) - (let* ((maxval (apply max vals)) - (minval (apply min vals)) - (yoff (- lly minval)) - (yscale (/ (- maxval minval)(- uly lly))) - (yfunc (lambda (y)(* (+ y yoff) yscale)))) - ;; (print (car cf) ": " (hash-table->alist - (for-each - (lambda (dpt) - (let* ((tval (vector-ref dpt 0)) - (yval (vector-ref dpt 2)) - (stval (tfn tval)) - (syval (yfunc yval))) - (vg:add-obj-to-comp - cmp - (vg:make-rect-obj (- stval 2) lly (+ stval 2)(+ lly (* yval yscale)) - fill-color: (vg:rgb->number 50 50 50))))) - dat))))) ;; for each data point in the series - (hash-table-keys alldat)))) + (if alldat + (for-each + (lambda (fieldn) + (let* ((dat (hash-table-ref alldat fieldn )) + (vals (map (lambda (x)(vector-ref x 2)) dat))) + (if (not (null? vals)) + (let* ((maxval (apply max vals)) + (minval (apply min vals)) + (yoff (- lly minval)) + (yscale (/ (- maxval minval)(- uly lly))) + (yfunc (lambda (y)(* (+ y yoff) yscale)))) + ;; (print (car cf) ": " (hash-table->alist + (for-each + (lambda (dpt) + (let* ((tval (vector-ref dpt 0)) + (yval (vector-ref dpt 2)) + (stval (tfn tval)) + (syval (yfunc yval))) + (vg:add-obj-to-comp + cmp + (vg:make-rect-obj (- stval 2) lly (+ stval 2)(+ lly (* yval yscale)) + fill-color: (vg:rgb->number 50 50 50))))) + dat))))) ;; for each data point in the series + (hash-table-keys alldat))))) cfg))) ;; run times tab ;; @@ -2890,15 +2899,13 @@ ; (vg:components-get-extents d1 c1))) ;; this is the box around the run (mutex-lock! mtx) (vg:add-obj-to-comp runcomp outln) (mutex-unlock! mtx) - (dboard:tabdat-max-row-set! tabdat (+ (dboard:tabdat-max-row tabdat) 2)) - ;; this is where we have enough info to place the graph (dboard:graph commondat tabdat tab-num llx uly ulx (+ uly graph-height) run-start run-end timescale maptime run-full-name canvas-margin) - + (dboard:tabdat-max-row-set! tabdat (+ (dboard:tabdat-max-row tabdat)(quotient (+ graph-height 40) row-height))) ;; (vg:instance-move drawing run-full-name 0 (dboard:tabdat-max-row tabdat)) )) ;; end of the run handling loop (if (gotoescape tabdat escape) ;; (dboard:tabdat-layout-update-ok tabdat) (let ((newdoneruns (cons rundat doneruns))) Index: tests/fullrun/megatest.config ================================================================== --- tests/fullrun/megatest.config +++ tests/fullrun/megatest.config @@ -2,11 +2,11 @@ sysname TEXT fsname TEXT datapath TEXT [graph] -g1 sqlite3:../../example.db alldat event_time stuff +g1 sqlite3:../../example.db alldat event_time var val stuff # refareas can be searched to find previous runs # the path points to where megatest.db exists [refareas] area1 /tmp/oldarea/megatest