aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/model/build-status.scm
blob: 199e8a4d7741c29aa299537c8e17e8e2f2c29414 (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
;;; Guix Data Service -- Information about Guix over time
;;; Copyright © 2019 Christopher Baines <mail@cbaines.net>
;;;
;;; This program is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU Affero General Public License
;;; as published by the Free Software Foundation, either version 3 of
;;; the License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; Affero General Public License for more details.
;;;
;;; You should have received a copy of the GNU Affero General Public
;;; License along with this program.  If not, see
;;; <http://www.gnu.org/licenses/>.

(define-module (guix-data-service model build-status)
  #:use-module (ice-9 match)
  #:use-module (squee)
  #:use-module (guix-data-service model utils)
  #:export (build-statuses
            build-status-strings
            select-build-statuses-by-build-id
            insert-build-status
            insert-build-statuses))

(define build-statuses
  '((-2 . "scheduled")
    (-1 . "started")
    (0 . "succeeded")
    (1 . "failed")
    (2 . "failed-dependency")
    (3 . "failed-other")
    (4 . "canceled")))

(define build-status-strings
  (map cdr build-statuses))

(define (select-build-statuses-by-build-id conn
                                           build-id
                                           build-server-id)
  (define query
    "
SELECT timestamp, status
FROM build_status
INNER JOIN builds ON builds.id = build_status.build_id
WHERE builds.build_server_id = $1 AND
      builds.id = $2")

  (exec-query conn query (list (number->string build-server-id)
                               (number->string build-id))))

(define (insert-build-status conn build-id timestamp status)
  (insert-build-statuses
   conn
   (list build-id)
   `((,timestamp ,status))))

(define (insert-build-statuses conn build-ids data)
  (define query
    (string-append
     "
INSERT INTO build_status (build_id, timestamp, status)
VALUES "
     (string-join
      (map (match-lambda*
             (((timestamp status) build-id)
              (unless (member status build-status-strings)
                (throw
                 'invalid-status
                 status))

              (string-append
               "("
               (number->string build-id)
               ","
               (if timestamp
                   (string-append "to_timestamp("
                                  (number->string timestamp)
                                  ")")
                   "NULL")
               ","
               (quote-string status)
               ")")))
           data
           build-ids)
      ", ")
     "
ON CONFLICT DO NOTHING"))

  (exec-query conn query '()))