2019-02-06 16:14:44 +00:00
|
|
|
(define-module (guix-data-service model package-metadata)
|
|
|
|
|
#:use-module (srfi srfi-1)
|
|
|
|
|
#:use-module (ice-9 vlist)
|
|
|
|
|
#:use-module (ice-9 match)
|
|
|
|
|
#:use-module (squee)
|
|
|
|
|
#:use-module (gcrypt hash)
|
|
|
|
|
#:use-module (rnrs bytevectors)
|
|
|
|
|
#:use-module (guix base16)
|
|
|
|
|
#:use-module (guix inferior)
|
2019-05-13 21:02:53 +01:00
|
|
|
#:use-module (guix-data-service model location)
|
2019-02-06 16:14:44 +00:00
|
|
|
#:use-module (guix-data-service model utils)
|
2019-05-12 17:01:51 +01:00
|
|
|
#:export (select-package-metadata-by-revision-name-and-version
|
2019-02-06 16:14:44 +00:00
|
|
|
inferior-packages->package-metadata-ids))
|
|
|
|
|
|
2019-05-12 17:01:51 +01:00
|
|
|
(define (select-package-metadata package-metadata-values)
|
2019-05-13 21:02:53 +01:00
|
|
|
(define fields
|
|
|
|
|
'("synopsis" "description" "home_page" "location_id"))
|
|
|
|
|
|
|
|
|
|
(string-append "SELECT id, " (string-join (map
|
|
|
|
|
(lambda (name)
|
|
|
|
|
(string-append
|
|
|
|
|
"package_metadata." name))
|
|
|
|
|
fields)
|
|
|
|
|
", ") " "
|
2019-02-06 16:14:44 +00:00
|
|
|
"FROM package_metadata "
|
2019-05-12 17:01:51 +01:00
|
|
|
"JOIN (VALUES "
|
2019-05-13 21:02:53 +01:00
|
|
|
(string-join (map
|
|
|
|
|
(match-lambda
|
|
|
|
|
((synopsis description home-page location-id)
|
|
|
|
|
(apply
|
|
|
|
|
simple-format
|
|
|
|
|
#f
|
|
|
|
|
(string-append
|
|
|
|
|
"("
|
|
|
|
|
(string-join
|
|
|
|
|
(list-tabulate
|
|
|
|
|
(length fields)
|
|
|
|
|
(lambda (n) "~A"))
|
|
|
|
|
",")
|
|
|
|
|
")")
|
|
|
|
|
(list
|
|
|
|
|
(value->quoted-string-or-null synopsis)
|
|
|
|
|
(value->quoted-string-or-null description)
|
|
|
|
|
(value->quoted-string-or-null home-page)
|
|
|
|
|
location-id))))
|
|
|
|
|
package-metadata-values)
|
2019-02-06 16:14:44 +00:00
|
|
|
",")
|
2019-05-13 21:02:53 +01:00
|
|
|
") AS vals (" (string-join fields ", ") ") "
|
|
|
|
|
"ON "
|
|
|
|
|
(string-join
|
|
|
|
|
(map (lambda (field)
|
|
|
|
|
(string-append
|
|
|
|
|
"package_metadata." field " = vals." field))
|
|
|
|
|
fields)
|
|
|
|
|
" AND ")))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
2019-03-11 22:11:14 +00:00
|
|
|
(define (select-package-metadata-by-revision-name-and-version
|
|
|
|
|
conn revision-commit-hash name version)
|
|
|
|
|
(define query "
|
|
|
|
|
SELECT package_metadata.synopsis, package_metadata.description,
|
2019-05-13 21:02:53 +01:00
|
|
|
package_metadata.home_page,
|
|
|
|
|
locations.file, locations.line, locations.column_number
|
2019-03-11 22:11:14 +00:00
|
|
|
FROM package_metadata
|
|
|
|
|
INNER JOIN packages
|
|
|
|
|
ON package_metadata.id = packages.package_metadata_id
|
2019-05-13 21:02:53 +01:00
|
|
|
LEFT OUTER JOIN locations
|
|
|
|
|
ON package_metadata.location_id = locations.id
|
2019-03-11 22:11:14 +00:00
|
|
|
WHERE packages.id IN (
|
|
|
|
|
SELECT package_derivations.package_id
|
|
|
|
|
FROM package_derivations
|
|
|
|
|
INNER JOIN guix_revision_package_derivations
|
|
|
|
|
ON package_derivations.id =
|
|
|
|
|
guix_revision_package_derivations.package_derivation_id
|
|
|
|
|
INNER JOIN guix_revisions
|
|
|
|
|
ON guix_revision_package_derivations.revision_id = guix_revisions.id
|
|
|
|
|
WHERE guix_revisions.commit = $1
|
|
|
|
|
)
|
|
|
|
|
AND packages.name = $2
|
|
|
|
|
AND packages.version = $3")
|
|
|
|
|
|
|
|
|
|
(exec-query conn query (list revision-commit-hash name version)))
|
|
|
|
|
|
2019-02-06 16:14:44 +00:00
|
|
|
(define (insert-package-metadata metadata-rows)
|
|
|
|
|
(string-append "INSERT INTO package_metadata "
|
2019-05-13 21:02:53 +01:00
|
|
|
"(synopsis, description, home_page, location_id) "
|
2019-02-06 16:14:44 +00:00
|
|
|
"VALUES "
|
|
|
|
|
(string-join
|
|
|
|
|
(map (match-lambda
|
2019-05-13 21:02:53 +01:00
|
|
|
((synopsis description home_page location_id)
|
2019-02-06 16:14:44 +00:00
|
|
|
(string-append
|
2019-05-12 17:01:51 +01:00
|
|
|
"("
|
2019-02-06 16:14:44 +00:00
|
|
|
(value->quoted-string-or-null synopsis) ","
|
|
|
|
|
(value->quoted-string-or-null description) ","
|
2019-05-13 21:02:53 +01:00
|
|
|
(value->quoted-string-or-null home_page) ","
|
2019-05-14 07:55:17 +01:00
|
|
|
location_id
|
2019-05-13 21:02:53 +01:00
|
|
|
")")))
|
2019-02-06 16:14:44 +00:00
|
|
|
metadata-rows)
|
|
|
|
|
",")
|
|
|
|
|
" RETURNING id"
|
|
|
|
|
";"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(define (inferior-packages->package-metadata-ids conn packages)
|
|
|
|
|
(define package-metadata
|
|
|
|
|
(map (lambda (package)
|
2019-05-12 17:01:51 +01:00
|
|
|
(list (inferior-package-synopsis package)
|
|
|
|
|
(inferior-package-description package)
|
2019-05-13 21:02:53 +01:00
|
|
|
(inferior-package-home-page package)
|
|
|
|
|
(location->location-id
|
|
|
|
|
conn
|
|
|
|
|
(inferior-package-location package))))
|
2019-02-06 16:14:44 +00:00
|
|
|
packages))
|
|
|
|
|
|
|
|
|
|
(let* ((existing-package-metadata-entries
|
|
|
|
|
(exec-query->vhash conn
|
2019-05-12 17:01:51 +01:00
|
|
|
(select-package-metadata package-metadata)
|
|
|
|
|
(lambda (results)
|
2019-05-13 21:02:53 +01:00
|
|
|
(cdr (take results 5)))
|
2019-02-06 16:14:44 +00:00
|
|
|
first)) ;; id))
|
|
|
|
|
(missing-package-metadata-entries
|
|
|
|
|
(delete-duplicates
|
|
|
|
|
(filter (lambda (metadata)
|
2019-05-12 17:01:51 +01:00
|
|
|
(not (vhash-assoc metadata
|
2019-02-06 16:14:44 +00:00
|
|
|
existing-package-metadata-entries)))
|
|
|
|
|
package-metadata)))
|
|
|
|
|
(new-package-metadata-entries
|
|
|
|
|
(if (null? missing-package-metadata-entries)
|
|
|
|
|
'()
|
2019-05-12 17:01:51 +01:00
|
|
|
(map first
|
|
|
|
|
(exec-query conn
|
|
|
|
|
(insert-package-metadata
|
|
|
|
|
missing-package-metadata-entries)))))
|
2019-02-06 16:14:44 +00:00
|
|
|
(new-entries-id-lookup-vhash
|
2019-05-12 17:01:51 +01:00
|
|
|
(two-lists->vhash missing-package-metadata-entries
|
2019-02-06 16:14:44 +00:00
|
|
|
new-package-metadata-entries)))
|
|
|
|
|
|
2019-05-12 17:01:51 +01:00
|
|
|
(map (lambda (package-metadata-values)
|
2019-02-06 16:14:44 +00:00
|
|
|
(cdr
|
2019-05-12 17:01:51 +01:00
|
|
|
(or (vhash-assoc package-metadata-values
|
2019-02-06 16:14:44 +00:00
|
|
|
existing-package-metadata-entries)
|
2019-05-12 17:01:51 +01:00
|
|
|
(vhash-assoc package-metadata-values
|
2019-02-06 16:14:44 +00:00
|
|
|
new-entries-id-lookup-vhash)
|
|
|
|
|
(begin
|
2019-05-12 17:01:51 +01:00
|
|
|
(error "missing package-metadata entry"
|
|
|
|
|
package-metadata-values)))))
|
|
|
|
|
package-metadata)))
|