1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
-
+
-
+
+
-
-
+
+
+
+
|
;;======================================================================
;; dbstruct
;;======================================================================
;;
;; -path-|-megatest.db
;; |-db-|-main.db
;; |-monitor.db
;; |-sdb.db
;; |-fdb.db
;; |-1.db
;; |-<N>.db
(define (make-dbr:dbstruct #!key (path #f))
(make-vector
(vector
#f ;; the main db (contains runs, test_meta etc.) NOT CACHED IN MEM
(make-hash-table) ;; run-id => [ rundb inmemdb last-mod last-read last-sync ]
#f ;; the global string db (use for state, status etc.)
path)) ;; path to database files/megatest area
;; get and set main db
(define-inline (dbr:dbstruct-get-main vec) (vector-ref vec 0))
(define-inline (dbr:dbstruct-set-main! vec db)(vector-set! vec 0 db))
;; get a rundb vector
(define (dbr:dbstruct-get-rundb-rec vec run-id)
(let* ((dbhash (vector-ref vec 1))
(runvec (hash-table-ref/default dbhash run-id)))
(if runvec
runvec
(begin
(hash-table-set! dbhash run-id (vector #f #f -1 -1 -1))
(hash-table-set! dbhash run-id (vector #f #f -1 -1 -1 #f))
(dbr:dbstruct-get-rundb-rec vec run-id)))))
;; [ rundb inmemdb last-mod last-read last-sync ]
(define-inline (dbr:dbstruct-field-name->num field-name)
(case field-name
((rundb) 0) ;; the on-disk db
((inmem) 1) ;; the in-memory db
((mtime) 2) ;; last modification time
((rtime) 3) ;; last read time
((stime) 4) ;; last sync time
((inuse) 5) ;; is the db currently in use
(else -1)))
;; get/set rundb fields
(define (dbr:dbstruct-get-runrec vec run-id field-name)
(let ((runvec (dbr:dbstruct-get-rundb-rec vec run-id)))
(vector-ref runvec (dbr:dbstruct-field-name->num field-name))))
(let ((runvec (dbr:dbstruct-get-rundb-rec vec run-id))
(fieldnum (dbr:dbstruct-field-name->num field-name)))
;; (vector-set! runvec (dbr:dbstruct-field-name->num 'inuse) #t)
(vector-ref runvec fieldnum)))
(define (dbr:dbstruct-set-runvec! vec run-id field-name val)
(let ((runvec (dbr:dbstruct-get-rundb-rec vec run-id)))
(vector-set! runvec (dbr:dbstruct-field-name->num field-name) rundb)))
;; get/set inmemdb
(define (dbr:dbstruct-get-inmemdb vec run-id)
|