diff options
Diffstat (limited to 'guix-build-coordinator/datastore/sqlite.scm')
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 101 |
1 files changed, 54 insertions, 47 deletions
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm index db9508b..824af59 100644 --- a/guix-build-coordinator/datastore/sqlite.scm +++ b/guix-build-coordinator/datastore/sqlite.scm @@ -38,7 +38,7 @@ datastore-count-builds datastore-for-each-build datastore-find-build - datastore-list-builds + datastore-fold-builds datastore-insert-build-tags datastore-fetch-build-tags datastore-find-build-result @@ -2329,11 +2329,13 @@ WHERE uuid = :uuid" #f)))) (#f #f)))))) -(define-method (datastore-list-builds +(define-method (datastore-fold-builds (datastore <sqlite-datastore>) . rest) - (define* (list-builds #:key + (define* (fold-builds proc + initial + #:key (tags '()) (not-tags '()) (systems '()) @@ -2343,7 +2345,7 @@ WHERE uuid = :uuid" (priority-> 'unset) (priority-< 'unset) (after-id #f) - (limit 1000) + (limit #f) ;; other-builds-dependent or no-dependent-builds (relationship 'unset)) (call-with-worker-thread @@ -2514,60 +2516,65 @@ WHERE derivation_outputs.derivation_id = builds.derivation_id)")) (statement (sqlite-prepare db query #:cache? #t))) + (define row->alist + (match-lambda + (#(uuid derivation_name priority processed canceled + created_at end_time) + `((uuid . ,uuid) + (derivation-name . ,derivation_name) + (priority . ,priority) + (processed . ,(cond + ((= 0 processed) #f) + ((= 1 processed) #t) + (else + (error + "unknown processed value")))) + (canceled . ,(cond + ((= 0 canceled) #f) + ((= 1 canceled) #t) + (else + (error "unknown canceled value")))) + (created-at . ,(if (string? created_at) + (match (strptime "%F %T" + created_at) + ((parts . _) parts) + (#f + (error + (simple-format + #f + "error parsing created_at ~A (~A)" + created_at + uuid)))) + #f)) + (end-time . ,(if (string? end_time) + (match (strptime "%F %T" + end_time) + ((parts . _) parts) + (#f + (error + (simple-format + #f + "error parsing end_time ~A (~A)" + end_time + uuid)))) + #f)))))) + (when after-id (sqlite-bind-arguments statement #:after_id after-id)) (let ((result - (sqlite-map - (match-lambda - (#(uuid derivation_name priority processed canceled - created_at end_time) - `((uuid . ,uuid) - (derivation-name . ,derivation_name) - (priority . ,priority) - (processed . ,(cond - ((= 0 processed) #f) - ((= 1 processed) #t) - (else - (error - "unknown processed value")))) - (canceled . ,(cond - ((= 0 canceled) #f) - ((= 1 canceled) #t) - (else - (error "unknown canceled value")))) - (created-at . ,(if (string? created_at) - (match (strptime "%F %T" - created_at) - ((parts . _) parts) - (#f - (error - (simple-format - #f - "error parsing created_at ~A (~A)" - created_at - uuid)))) - #f)) - (end-time . ,(if (string? end_time) - (match (strptime "%F %T" - end_time) - ((parts . _) parts) - (#f - (error - (simple-format - #f - "error parsing end_time ~A (~A)" - end_time - uuid)))) - #f))))) + (sqlite-fold + (lambda (row result) + (proc (row->alist row) result)) + initial statement))) (sqlite-reset statement) result))))))) - (apply list-builds rest)) + (apply fold-builds rest)) (define-method (datastore-fetch-build-tags (datastore <sqlite-datastore>) |