25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
(declare (uses ods))
(include "common_records.scm")
(include "db_records.scm")
(include "key_records.scm")
(include "run_records.scm")
(define (open-db) ;; (conc *toppath* "/megatest.db") (car *configinfo*)))
(let* ((dbpath (conc *toppath* "/megatest.db")) ;; fname)
(dbexists (file-exists? dbpath))
(db (sqlite3:open-database dbpath)) ;; (never-give-up-open-db dbpath))
(handler (make-busy-timeout 36000)))
(sqlite3:set-busy-handler! db handler)
(if (not dbexists)
|
>
>
>
>
>
>
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
(declare (uses ods))
(include "common_records.scm")
(include "db_records.scm")
(include "key_records.scm")
(include "run_records.scm")
;; timestamp type (val1 val2 ...)
;; type: meta-info, step
(define *incoming-data* '())
(define *incoming-last-time* (current-seconds))
(define *incoming-mutex* (make-mutex))
(define (open-db) ;; (conc *toppath* "/megatest.db") (car *configinfo*)))
(let* ((dbpath (conc *toppath* "/megatest.db")) ;; fname)
(dbexists (file-exists? dbpath))
(db (sqlite3:open-database dbpath)) ;; (never-give-up-open-db dbpath))
(handler (make-busy-timeout 36000)))
(sqlite3:set-busy-handler! db handler)
(if (not dbexists)
|
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
|
(sqlite3:for-each-row
(lambda (p)
(set! res (cons p res)))
db
qrystr)
res))
(define (db:test-update-meta-info db run-id test-name item-path minutes cpuload diskfree tmpfree)
(if (not item-path)
(begin (debug:print 0 "WARNING: ITEMPATH not set.")
(set! item-path "")))
(sqlite3:execute
db
"UPDATE tests SET cpuload=?,diskfree=?,run_duration=?,state='RUNNING' WHERE run_id=? AND testname=? AND item_path=? AND state NOT IN ('COMPLETED','KILLREQ','KILLED');"
cpuload
diskfree
minutes
run-id
test-name
item-path))
(define (db:roll-up-pass-fail-counts db run-id test-name item-path status)
(if (and (not (equal? item-path ""))
(or (equal? status "PASS")
(equal? status "WARN")
(equal? status "FAIL")
(equal? status "WAIVED")
|
>
>
>
>
>
>
>
>
>
>
|
>
|
<
|
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
|
(sqlite3:for-each-row
(lambda (p)
(set! res (cons p res)))
db
qrystr)
res))
;;======================================================================
;; QUEUE UP META, TEST STATUS AND STEPS
;;======================================================================
(define (db:updater db)
(let loop ((start-time (current-time)))
(thread-sleep! (+ 2 (random 10))) ;; move save time around to minimize regular collisions
(db:write-cached-data db)
(loop start-time)))
(define (db:test-update-meta-info db run-id test-name item-path minutes cpuload diskfree tmpfree)
(if (not item-path)
(begin (debug:print 0 "WARNING: ITEMPATH not set.")
(set! item-path "")))
(mutex-lock! *incoming-mutex*)
(set! *incoming-data* (cons (vector 'meta-info
(current-seconds)
(list cpuload
diskfree
minutes
run-id
test-name
item-path)) ;; run-id test-name item-path minutes cpuload diskfree tmpfree)
*incoming-data*))
(mutex-unlock! *incoming-mutex*))
(define (db:write-cached-data db)
(let ((meta-stmt (sqlite3:prepare db "UPDATE tests SET cpuload=?,diskfree=?,run_duration=?,state='RUNNING' WHERE run_id=? AND testname=? AND item_path=? AND state NOT IN ('COMPLETED','KILLREQ','KILLED');"))
(step-stmt (sqlite3:prepare db "INSERT OR REPLACE into test_steps (test_id,stepname,state,status,event_time,comment,logfile) VALUES(?,?,?,?,?,?,?);")) ;; strftime('%s','now')#f)
(data (sort *incoming-data* (lambda (a b)(< (vector-ref a 1)(vector-ref b 1))))))
(debug:print 0 "Writing cached data " data)
(mutex-lock! *incoming-mutex*)
(for-each (lambda (entry)
(case (vector-ref entry 0)
((meta-info)
(apply sqlite3:execute meta-stmt (vector-ref entry 2)))
((step-status)
(apply sqlite3:execute step-stmt (vector-ref entry 2)))
(else
(debug:print 0 "ERROR: Queued entry not recognised " entry))))
data)
(set! *incoming-data* '())
(mutex-unlock! *incoming-mutex*)
(sqlite3:finalize! meta-stmt)
(sqlite3:finalize! step-stmt)))
(define (db:roll-up-pass-fail-counts db run-id test-name item-path status)
(if (and (not (equal? item-path ""))
(or (equal? status "PASS")
(equal? status "WARN")
(equal? status "FAIL")
(equal? status "WAIVED")
|
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
|
(debug:print 5 "testdat: " testdat)
(if (and testdat ;; if the section exists then force specification BUG, I don't like how this works.
(or (not state)(not status)))
(debug:print 0 "WARNING: Invalid " (if status "status" "state")
" value \"" (if status state-in status-in) "\", update your validvalues section in megatest.config"))
(if testdat
(let ((test-id (test:get-id testdat)))
;; FIXME - this should not update the logfile unless it is specified.
(sqlite3:execute db
"INSERT OR REPLACE into test_steps (test_id,stepname,state,status,event_time,comment,logfile) VALUES(?,?,?,?,strftime('%s','now'),?,?);"
test-id teststep-name state-in status-in (if comment comment "") (if logfile logfile ""))
#t) ;; fake out a #t - could be execute is returning something complicated
(debug:print 0 "ERROR: Can't update " test-name " for run " run-id " -> no such test in db"))))
;;======================================================================
;; Extract ods file from the db
;;======================================================================
;; runspatt is a comma delimited list of run patterns
|
>
>
>
|
<
<
|
<
>
>
|
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
|
(debug:print 5 "testdat: " testdat)
(if (and testdat ;; if the section exists then force specification BUG, I don't like how this works.
(or (not state)(not status)))
(debug:print 0 "WARNING: Invalid " (if status "status" "state")
" value \"" (if status state-in status-in) "\", update your validvalues section in megatest.config"))
(if testdat
(let ((test-id (test:get-id testdat)))
(mutex-lock! *incoming-mutex*)
(set! *incoming-data* (cons (vector 'step-status
(current-seconds)
;; FIXME - this should not update the logfile unless it is specified.
(list test-id teststep-name state-in status-in (current-seconds) (if comment comment "") (if logfile logfile "")))))
(mutex-unlock! *incoming-mutex*)
#t)
(debug:print 0 "ERROR: Can't update " test-name " for run " run-id " -> no such test in db"))))
;;======================================================================
;; Extract ods file from the db
;;======================================================================
;; runspatt is a comma delimited list of run patterns
|
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
|
(if *runremote*
(let ((host (vector-ref *runremote* 0))
(port (vector-ref *runremote* 1)))
((rpc:procedure 'rdb:get-tests-for-run host port)
run-id testpatt itempatt states statuses))
(db:get-tests-for-run db run-id testpatt itempatt states statuses)))
(define (rdb:get-keys db)
(if *runremote*
(let ((host (vector-ref *runremote* 0))
(port (vector-ref *runremote* 1)))
((rpc:procedure 'rdb:get-keys host port)))
(db:get-keys db)))
|
>
>
>
>
>
>
>
>
|
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
|
(if *runremote*
(let ((host (vector-ref *runremote* 0))
(port (vector-ref *runremote* 1)))
((rpc:procedure 'rdb:get-tests-for-run host port)
run-id testpatt itempatt states statuses))
(db:get-tests-for-run db run-id testpatt itempatt states statuses)))
(define (rdb:get-test-data-by-id db test-id)
(if *runremote*
(let ((host (vector-ref *runremote* 0))
(port (vector-ref *runremote* 1)))
((rpc:procedure 'rpc:get-test-data-by-id host port)
test-id))
(db:get-test-data-by-id db test-id)))
(define (rdb:get-keys db)
(if *runremote*
(let ((host (vector-ref *runremote* 0))
(port (vector-ref *runremote* 1)))
((rpc:procedure 'rdb:get-keys host port)))
(db:get-keys db)))
|