aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/model/package-derivation.scm
blob: 6e877652119a5b73d6997d4d91a2f46d8cba11d5 (plain)
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
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
(define-module (guix-data-service model package-derivation)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 vlist)
  #:use-module (ice-9 match)
  #:use-module (squee)
  #:use-module (guix-data-service model utils)
  #:export (insert-package-derivations
            count-packages-derivations-in-revision))

(define (insert-missing-package-derivations conn entries)
  (define query
    (string-append
     "INSERT INTO package_derivations "
     "(package_id, derivation_id, system, target) VALUES "
     (string-join
      (map
       (lambda (entry)
         (apply simple-format
                #f "(~A, ~A, '~A', '~A')"
                entry))
       entries)
      ", ")
     " RETURNING id"))

  (exec-query conn query))

(define (insert-package-derivations conn
                                    package-ids-systems-and-targets
                                    derivation-ids)
  (define select-existing-package-derivation-entries
    (string-append
     "SELECT id, package_derivations.package_id,"
     " package_derivations.derivation_id, package_derivations.system,"
     " package_derivations.target "
     "FROM package_derivations "
     "JOIN (VALUES "
     (string-join (map (match-lambda*
                         (((package-id system target) derivation-id)
                          (simple-format
                           #f "(~A, ~A, '~A', '~A')"
                           package-id
                           derivation-id
                           system
                           target)))
                       package-ids-systems-and-targets
                       derivation-ids)
                  ", ")
     ") AS vals (package_id, derivation_id, system, target) "
     "ON package_derivations.package_id = vals.package_id "
     "AND package_derivations.derivation_id = vals.derivation_id "
     "AND package_derivations.system = vals.system "
     "AND package_derivations.target = vals.target"))

  (define data-4-tuples
    (map (match-lambda*
           (((package-id system target) derivation-id)
            (list package-id
                  derivation-id
                  system
                  target)))
         package-ids-systems-and-targets
         derivation-ids))

  (if (null? data-4-tuples)
      '()
      (begin
        (let* ((existing-entries
                (exec-query->vhash
                 conn
                 select-existing-package-derivation-entries
                 cdr
                 first)) ;; id

               (missing-entries
                (filter (lambda (4-tuple)
                          (not (vhash-assoc 4-tuple existing-entries)))
                        data-4-tuples))

               (new-entry-ids
                (if (null? missing-entries)
                    '()
                    (begin
                      (vlist->list existing-entries)
                      (insert-missing-package-derivations conn missing-entries))))

               (new-entries-id-lookup-vhash
                (two-lists->vhash missing-entries
                                  new-entry-ids)))
          (map (lambda (4-tuple)
                 (cdr
                  (or (vhash-assoc 4-tuple existing-entries)
                      (vhash-assoc 4-tuple new-entries-id-lookup-vhash)
                      (error "Missing entry"))))
               data-4-tuples)))))

(define (count-packages-derivations-in-revision conn commit-hash)
  (define query
    "
SELECT package_derivations.system, package_derivations.target,
COUNT(DISTINCT package_derivations.derivation_id)
FROM package_derivations
WHERE package_derivations.id IN (
 SELECT guix_revision_package_derivations.package_derivation_id
 FROM guix_revision_package_derivations
 INNER JOIN guix_revisions
   ON guix_revision_package_derivations.revision_id = guix_revisions.id
 WHERE guix_revisions.commit = $1
)
GROUP BY package_derivations.system, package_derivations.target
ORDER BY package_derivations.system DESC, package_derivations.target DESC")

  (exec-query conn query (list commit-hash)))