49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
(for-each
(lambda (id)
(if (not (member id found))
(begin
(set! deleted (cons id deleted))
(hash-table-delete! synchash id))))
orig-keys)
(list changed deleted)))
;; (cdb:remote-run db:get-keys #f)
;; (cdb:remote-run db:get-num-runs #f "%")
;; (cdb:remote-run db:get-runs #f runnamepatt numruns *start-run-offset* keypatts)
;;
;; keynum => the field to use as the unique key (usually 0 but can be other field)
;;
(define (synchash:client-get proc synckey keynum synchash . params)
(let* ((data (apply cdb:remote-run synchash:server-get #f proc synckey keynum params))
(newdat (car data))
(removs (cadr data)))
(for-each
(lambda (item)
(let ((id (car item))
(dat (cadr item)))
(hash-table-set! synchash id dat)))
newdat)
(for-each
(lambda (id)
(hash-table-delete! synchash id))
removs)
synchash))
(define *synchashes* (make-hash-table))
(define (synchash:server-get db proc synckey keynum . params)
(debug:print 2 "synckey: " synckey ", keynum: " keynum ", params: " params)
(let* ((synchash (hash-table-ref/default *synchashes* synckey #f))
(newdat (apply (case proc
((db:get-runs) db:get-runs)
((db:get-tests-for-runs) db:get-tests-for-runs)
(else print))
db params))
(postdat #f)
(make-indexed (lambda (x)
(list (vector-ref x keynum) x))))
;; Now process newdat based on the query type
(set! postdat (case proc
((db:get-runs)
(debug:print 2 "Get runs call")
(let ((header (vector-ref newdat 0))
(data (vector-ref newdat 1)))
(list (list "header" header) ;; add the header keyed by the word "header"
(map make-indexed data)))) ;; add each element keyed by the keynum'th val
(else
(debug:print 2 "Non-get runs call")
(map make-indexed newdat))))
(if (not synchash)
(begin
(set! synchash (make-hash-table))
(hash-table-set! *synchashes* synckey synchash)))
(synchash:get-delta postdat synchash)))
|
|
>
>
|
>
>
>
>
>
>
|
|
|
|
>
|
|
>
|
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
(for-each
(lambda (id)
(if (not (member id found))
(begin
(set! deleted (cons id deleted))
(hash-table-delete! synchash id))))
orig-keys)
(list changed deleted)
;; (list indat '()) ;; just for debugging
))
;; (cdb:remote-run db:get-keys #f)
;; (cdb:remote-run db:get-num-runs #f "%")
;; (cdb:remote-run db:get-runs #f runnamepatt numruns *start-run-offset* keypatts)
;;
;; keynum => the field to use as the unique key (usually 0 but can be other field)
;;
(define (synchash:client-get proc synckey keynum synchash . params)
(let* ((data (apply cdb:remote-run synchash:server-get #f proc synckey keynum params))
(newdat (car data))
(removs (cadr data))
(myhash (hash-table-ref/default synchash synckey #f)))
(if (not myhash)
(begin
(set! myhash (make-hash-table))
(hash-table-set! synchash synckey myhash)))
(for-each
(lambda (item)
(let ((id (car item))
(dat (cadr item)))
;; (debug:print-info 2 "Processing item: " item)
(hash-table-set! myhash id dat)))
newdat)
(for-each
(lambda (id)
(hash-table-delete! myhash id))
removs)
synchash))
(define *synchashes* (make-hash-table))
(define (synchash:server-get db proc synckey keynum . params)
;; (debug:print-info 2 "synckey: " synckey ", keynum: " keynum ", params: " params)
(let* ((synchash (hash-table-ref/default *synchashes* synckey #f))
(newdat (apply (case proc
((db:get-runs) db:get-runs)
((db:get-tests-for-runs) db:get-tests-for-runs)
(else print))
db params))
(postdat #f)
(make-indexed (lambda (x)
(list (vector-ref x keynum) x))))
;; Now process newdat based on the query type
(set! postdat (case proc
((db:get-runs)
;; (debug:print-info 2 "Get runs call")
(let ((header (vector-ref newdat 0))
(data (vector-ref newdat 1)))
;; (debug:print-info 2 "header: " header ", data: " data)
(cons (list "header" header) ;; add the header keyed by the word "header"
(map make-indexed data)))) ;; add each element keyed by the keynum'th val
(else
;; (debug:print-info 2 "Non-get runs call")
(map make-indexed newdat))))
;; (debug:print-info 2 "postdat: " postdat)
(if (not synchash)
(begin
(set! synchash (make-hash-table))
(hash-table-set! *synchashes* synckey synchash)))
(synchash:get-delta postdat synchash)))
|